如果你使用 any(lst)
,你会看到 lst
是一个可迭代对象,它是一些项目的列表。如果它包含了 [0, False, '', 0.0, [], {}, None]
(这些值都被认为是布尔值为 False
的值),那么 any(lst)
将返回 False
。如果 lst
同时包含以下任意一个值 [-1, True, "X", 0.00001]
(所有这些值都被认为是布尔值为 True
的值),那么 any(lst)
将返回 True
。
在你发布的代码中,x > 0 for x in lst
是另一种类型的可迭代对象,称为生成器表达式。在 Python 中添加生成器表达式之前,你会创建一个列表推导,它看起来非常相似,但使用方括号 []
括起来:[x > 0 for x in lst]
。从包含 [-1, -2, 10, -4, 20]
的 lst
中,你将得到这个推导列表:[False, False, True, False, True]
。这个内部值将被传递给 any
函数,因为至少有一个 True
值,所以它将返回 True
。
但是有了生成器表达式,Python就不再需要创建那个由
True(s)
和
False(s)
组成的内部列表,这些值将在
any
函数通过逐个生成器表达式所生成的值迭代时被生成。而且,由于
any
具有短路特性,它会在第一次遇到
True
值时停止迭代。如果你使用类似于
lst=range(-1,int(1e9))
(或者如果你使用Python2.x,则使用
xrange
)的东西创建了
lst
,这将非常方便。即使这个表达式将生成超过十亿个条目,当它到达
1
时,
any
只需一直到第三个条目,因为它对于
x>0
评估为
True
,所以
any
可以返回
True
。
如果你使用列表推导式来实现,Python首先必须在内存中创建包含十亿个元素的列表,然后将其传递给
any
。但是通过使用生成器表达式,你可以让Python的内置函数如
any
和
all
尽早跳出循环,即一旦看到
True
或
False
值就停止。
any
的,而是关于示例代码中 传递给any
的参数,它是一个 生成器表达式。因此,我将其关闭为生成器表达式的参考问题的重复。如果您真正想了解有关any
的信息,请参阅 https://dev59.com/RmIk5IYBdhLWcg3wUsrv 获取规范答案。 - Karl Knechtel