的第一个对象地短路。如果它包含[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]
。然后该内部值将传递给any
函数,该函数将返回True
,因为至少有一个值为True
。
但随着发生器表达式,Python中不再有要创建的True(s)
和False(s)
该内部列表,这些值将产生通过的值any
函数迭代产生的一个在由生成器表达式的时间。 和,因为any
发生短路,只要它看到第一个值,就会停止迭代。如果您使用类似lst = range(-1,int(1e9))
(或xrange
,如果您使用Python2.x)创建了lst
,则这将特别方便。尽管这个表达式会产生超过10亿的条目,但是any
只有当它到达1
时才会走到第三个条目,其评估True
为x>0
,因此any
可以返回True
。
如果您创建了列表理解,Python首先必须在内存中创建亿元列表,然后将其传递给any
。但通过使用生成器表达式,只要看到True
或False
的值,就可以提前突破Python的内置函数any
和all
。
这将是另外值得一提的是,'任何(X>在列表X 0)'只是一个语法糖'任何((x> 0对于列表中的x))'。 – georg 2013-05-12 09:53:00
您应该将'None'添加到布尔值为False的元素列表中 – 2016-10-26 16:55:27
添加到@georg中,语法糖对“any”不是特殊的。 'def b(x):return x;打印b(对x中的x> 1)#打印<生成器对象..' – industryworker3595112 2018-01-17 07:50:07