在 Python 中使用带有 break 语句逻辑的 any() 或 all()?

Use any() or all() with break statement logic in Python?

这个有效:

def gen():
    yield False
    yield True
    yield oups

if any(gen()):
    print('At least one is True')

# At least one is True

但这失败了:

if any(iter([False, True, oups])):
    print('At least one is True')

# NameError: name 'oups' is not defined

有没有办法不费吹灰之力就把第二个代码转换成第一个代码?

对于genoups只是一个自由变量,它的查找永远不会发生; any 在有必要之前停止消耗 return 由 gen 编辑的发电机。

然而,对于 iter([False, True, oups]),列表 [False, True, oups] 首先必须完全创建,以便它可以传递给 iter 到 return 列表迭代器。要做到 that,必须查找 oups,因为它未定义,所以我们在 iter 之前得到 NameError,更不用说 any,连跑。第二个代码被评估为

t1 = [False, True, oups]  # NameError here
t2 = iter(t1)
if any(t2):
    print('At least one is True')

这两段代码在技术上都是不正确的,因为您没有定义 "oups"。
这可以通过像这样耗尽迭代器来显示:

def gen():
    yield False
    yield True
    yield oups

g = gen()
print(next(g))
print(next(g))
#this next line will break, as it reaches the undefined variable
print(next(g))  

any() 函数将在遇到第一个 True 语句后停止 运行,并将 return 为 True。这可以通过重新排列您的 yield 语句以在未定义变量之后具有第一个 True 来显示,这也会中断:

def gen():
    yield False
    yield oups
    yield True

if any(gen()):
    print('At least one is True')