为了了解发生了什么,让我们运行以下程序:
def test(i):
print(i)
if i == 5:
return True
return False
if any([test(i) for i in range(10)]):
print("Done")
if any(test(i) for i in range(10)):
print("Done")
0
1
2
3
4
5
6
7
8
9
Done
0
1
2
3
4
5
Done
第一个版本使用列表理解创建一个列表,在创建整个列表后,然后判断它是否有True
/False
值.您可以看到整个列表正在创建,因为所有最多10
的数字都被打印出来.
但是,在第二个版本中,你会看到输出值最多只有5
.这是因为第二个是generator expression,而any
函数则逐个计算.例如,一旦i == 5
,any
函数返回true并停止迭代生成器.
让我们以与第二个if-语句中相同的方式复制any
函数.
def any(gen):
for i in gen:
if i:
return True
return False
这与builtin any
函数的工作原理非常相似.它会查看每个元素,判断它是否为True
,如果发现一个True
的值,在循环结束之前返回.生成器表达式更高效的原因是因为值是一个接一个地创建的,而不是一次所有的列表理解.