如何从循环中的函数中断Python循环

时间:2013-01-25 13:40:09

标签: python

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 logic”直接放在while循环中,但我希望它在函数中。有没有办法在循环中调用的函数中打破while循环?

5 个答案:

答案 0 :(得分:2)

  1. 提出一个异常,你可以在While循环之外处理
  2. 返回一个由调用者捕获的标志并相应地处理。请注意,"if logic" directly in the while loop,是最受欢迎的方式。

答案 1 :(得分: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"的检查硬编码到生成器中,但如果您在一些地方需要类似的行为,则可能值得保持一般。

请注意,这也意味着您可以在list comprehension内使用它,这样也可以轻松构建结果列表。

编辑:或者,我们可以使用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: ")):
    ...

答案 2 :(得分:1)

我通常这样做:

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

for input in getInput():
    if input == 'exit': 
        break
    result = useInput(input)

答案 3 :(得分:0)

您可以引发异常并在while之外处理它......但这可能会导致代码混乱......

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

except RuntimeError:
    pass

MUCH 更好地返回一个布尔标志,然后根据该标志的值中断或不中断。如果你担心你已经有了想要返回的东西,请不要担心 - python会很乐意让你的函数返回多个东西:

def func()
    ...
    return something,flag

while True:
    something,flag = func()
    if flag:
        break

答案 4 :(得分:0)

好吧,如果它只是美学可以阻止你把它放在while循环中,那么上面的任何一个都可以工作......不是尝试的粉丝/除了一个。只是知道将它放在自己的功能中不会有任何性能差异。这是我认为也符合您要求的那个:-)

# 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