2
while True:
    input = raw_input("enter input: ")
    result = useInput(input)

def useInput(input):
    if input == "exit":
        break   #return 0 / quit / etc.. i want to break the while loop from within this function

我知道我可以将“if 逻辑”直接放在 while 循环中,但我希望它在函数中。有没有办法从循环中调用的函数中中断while循环?

4

5 回答 5

2
  1. 引发异常,您可以在 While 循环之外进行处理
  2. 返回要由调用者捕获的标志并进行相应处理。请注意,"if logic" directly in the while loop,, 将是最优选的方式。
于 2013-01-25T13:41:53.727 回答
2

Python 在生成器中有一个很酷的特性——它们允许您轻松地生成与for循环一起使用的迭代器,这可以简化这种代码。

def input_until(message, func):
    """Take raw input from the user (asking with the given message), until 
    when func is applied it returns True."""
    while True:
        value = raw_input(message)
        if func(value):
            return
        else:
            yield value

for value in input_until("enter input: ", lambda x: x == "exit"):
    ...

循环将for一直循环,直到迭代器停止,当用户输入时我们创建的迭代器停止"exit"。请注意,我已经对此进行了一些概括,为简单起见,您可以将检查硬编码"exit"到生成器中,但如果您在一些地方需要类似的行为,则可能值得保持通用。

请注意,这也意味着您可以在列表推导中使用它,从而也可以轻松构建结果列表。

编辑:或者,我们可以使用以下方式构建它itertools

def call_repeatedly(func, *args, **kwargs):
    while True:
        yield func(*args, **kwargs)

for value in itertools.takewhile(lambda x: x != "exit", 
                                 call_repeatedly(raw_input, "enter input: ")):
    ...
于 2013-01-25T14:08:05.127 回答
1

我通常这样做:

def getInput():
    while True:
        yield raw_input("enter input: ")

for input in getInput():
    if input == 'exit': 
        break
    result = useInput(input)
于 2013-01-25T13:52:23.563 回答
0

您可以引发异常并在while...之外处理它,但这可能会导致一些令人困惑的代码...

def useInput(in_):
    if in_ == "exit":
        raise RuntimeError
try:
    while True:
        input = raw_input("enter input: ")
        result = useInput(input)

except RuntimeError:
    pass

最好返回一个布尔标志,然后根据该标志的值中断或不中断。如果您担心自己已​​经有想要返回的东西,请不要担心——python 会很乐意让您的函数返回不止一件东西:

def func()
    ...
    return something,flag

while True:
    something,flag = func()
    if flag:
        break
于 2013-01-25T13:41:40.380 回答
0

好吧,如果它只是美学那就是让你无法将它放在 while 循环中,那么上述任何一个都可以工作......但不是 try/except 的粉丝。只要知道将它放在自己的功能中不会有任何性能差异。这是我认为也符合您的要求的一个:-)

# you have to define the function first if your while isn't in a function
def UseInput():
   input = raw_input("enter input: ")
   if input == "exit":
      return False
   elif input == "pass":
      return True


   # Do stuff
   return True


while UseInput():
   pass
于 2013-01-25T19:00:26.527 回答