在 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
有没有办法不费吹灰之力就把第二个代码转换成第一个代码?
对于gen
,oups
只是一个自由变量,它的查找永远不会发生; 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')
这个有效:
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
有没有办法不费吹灰之力就把第二个代码转换成第一个代码?
对于gen
,oups
只是一个自由变量,它的查找永远不会发生; 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')