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

3 投票
5 回答
8255 浏览
提问于 2025-04-17 13:39
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

我知道我可以把“如果逻辑”直接放在while循环里面,但我想把它放在一个函数里。有没有办法在循环中调用的函数里中断while循环呢?

5 个回答

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: ")):
    ...
3

1. 抛出一个异常,这样你可以在循环外面处理它。

2. 返回一个标志,让调用者来捕捉并相应处理。需要注意的是,“在循环里直接用if逻辑”,这是最推荐的做法。

1

我通常是这样做的:

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

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

撰写回答