[英]Trying to understand the difference between "any([comprehension])" and "any(comprehension)"
有什么区别:
if any([value % 2 for value in values]):
print('done')
和
if any(value % 2 for value in values):
print('done')
其中 values 是 0-20 的数组?
我知道any()
检查数组中的任何值是否符合要求,但想知道函数之间是否有任何区别。
第一个首先计算整个列表,然后应用any
。 另一方面,第二个是“懒惰的”; 如果某个元素为真,则any
立即返回True
,无需进一步处理。
def foo(x):
print(f"foo({x}) is called!")
return x >= 5
print(any([foo(x) for x in range(10)]))
# foo(0) is called!
# foo(1) is called!
# foo(2) is called!
# foo(3) is called!
# foo(4) is called!
# foo(5) is called!
# foo(6) is called!
# foo(7) is called!
# foo(8) is called!
# foo(9) is called!
# True
print(any(foo(x) for x in range(10)))
# foo(0) is called!
# foo(1) is called!
# foo(2) is called!
# foo(3) is called!
# foo(4) is called!
# foo(5) is called!
# True
如您所见,第二个不评估foo(x)
的x > 5
,因为any
已经找到foo(5) == True
,这足以说明结果为True
。
两者之间的区别在于,第一个从只要values
构造一个临时列表,然后将其传递给any()
(然后将其删除)。 第二种是使用所谓的生成器表达式,它将根据需要迭代计算和生成,并将它们传递给any()
。 由于any()
的工作方式,它可能会在到达结束之前停止执行此操作,因为条件已满足。 对于非常大的数据集,后者将需要更少的 memory 来完成(如果它“提前”停止,则可能需要更少的处理器时间)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.