如果你使用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 之前,您会创建一个列表推导式,它看起来非常相似,但周围有[]
's: [x > 0 for x in lst]
。从lst
包含[-1, -2, 10, -4, 20]
,你会得到这个理解列表:[False, False, True, False, True]
。然后,这个内部值将被传递给any
函数,该函数将返回True
,因为至少存在一个True
值。
但是使用生成器表达式,Python 不再需要创建 and 的内部列表True(s)
,False(s)
这些值将在any
函数迭代生成器表达式一次生成的值时生成。而且,由于any
短路,它会在看到第一个True
值时立即停止迭代。lst
如果您使用类似的东西创建lst = range(-1,int(1e9))
(或者xrange
如果您使用的是Python2.x),这将特别方便。尽管这个表达式将生成超过十亿个条目,any
但它只需要到达第三个条目1
,它的计算结果True
是x>0
,因此any
可以返回True
。
如果您创建了一个列表推导,Python 将首先必须在内存中创建十亿个元素的列表,然后将其传递给any
. 但是通过使用生成器表达式,您可以让 Python 的内置函数 likeany
并all
尽早中断,只要看到True
orFalse
值。