【发布时间】:2015-11-20 21:01:22
【问题描述】:
Any 和 All 真值测试方法在 Python 中非常好。
基本上,当迭代器中至少有一个元素是 Truthy 时,any 返回 True。
只有当所有元素都是Truthy时,all才会返回True。
我无法理解的是,这些方法本质上是贪婪的吗?
如果我这样做了
all([False, x, y, z, p, q, r])
Python 甚至不应该费心检查 x,y,z ..et .al 的值,因为第一个 False 确保无论它们的值是什么,结果总是为假。
【问题讨论】:
-
all短路,但列表创建不会。[False, x, y, z, p, q, r]将在all被调用之前评估所有元素。 -
您可以自己查看:
k=iter(range(2));all(k);print next(k)。请注意,生成器不会被消耗,只会消耗第一个虚假值之前的所有值。 -
@user2357112 很有趣。那么有什么好方法可以让这样的事情变得懒惰呢?
-
@iankit 使用生成器。
-
顺便说一句:lazy 一词在这里过于笼统。
any和all使用短路求值,这是一种特殊类型的非严格求值。请参阅Wikipedia article on evaluation strategies 以获得细微差别。