Answers:
如果您使用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]。从lst包含的清单中[-1, -2, 10, -4, 20],您可以得到:。由于存在至少一个值,因此此内部值将传递给该函数,该函数将返回。[False, False, True, False, True]anyTrueTrue
但是使用生成器表达式时,Python不再需要创建True(s)and的内部列表,False(s)因为any函数迭代生成器表达式一次生成的值时会生成值。并且,由于any短路,一旦看到第一个True值,它将立即停止迭代。如果lst使用类似方法创建lst = range(-1,int(1e9))(或xrange使用Python2.x),则将特别方便。即使此表达式将生成超过十亿个条目,any但到达时只需要到达第三个条目1,它的值就True为x>0,因此any可以返回True。
如果您创建了列表推导,Python首先必须在内存中创建十亿个元素的列表,然后将其传递给any。但是,通过使用生成器表达式,您可以在看到a 或value时就拥有Python的内置函数,例如,any并all尽早推出。TrueFalse
None元素的布尔值添加到False
any。def b(x): return x; print b(x > 1 for x in xs) # prints <generator object ..
any(x > 0 for x in list)它只是的语法糖any((x > 0 for x in list))。