python any()函数到底是如何工作的?
在any
python文档页面中, any()
函数的等效代码如下所示:
def any(iterable): for element in iterable: if element: return True return False
这个函数如何知道我想testing的元素是否以这种forms调用?
any(x > 0 for x in list)
从函数定义中,我可以看到的是我正在传递一个可迭代的对象。 for
循环如何知道我正在寻找> 0
东西?
如果你使用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
,这是一种不同types的可迭代,称为生成器expression式 。 在将生成器expression式添加到Python之前,您将创build列表理解 ,该列表理解看起来非常相似,但与周围的[]
: [x > 0 for x in lst]
。 从包含[-1, -2, 10, -4, 20]
lst
,你会得到这个理解的列表 : [False, False, True, False, True]
。 这个内部值将被传递给any
函数,这将返回True
,因为至less有一个True
值。
但是对于生成器expression式 ,Python不再需要创buildTrue(s)
和False(s)
内部列表,这些值将在any
函数迭代生成器expression式一次生成的值时生成。 而且 ,由于any
短路,只要看到第一个True
值就会停止迭代。 如果使用lst = range(-1,int(1e9))
(或者如果使用Python2.x,则为xrange
lst = range(-1,int(1e9))
创buildlst
这将特别方便。 即使这个expression式会产生超过十亿个条目, any
只要到达第三个条目就可以达到第一个条目,这对于x>0
为True
,所以any
都可以返回True
。
如果你已经创build了列表理解 ,Python首先必须在内存中创build十亿个元素列表,然后将其传递给any
。 但是通过使用一个生成器expression式 ,只要看到一个True
或False
值,就可以让Python的内置函数像any
一样突然出现。
(x > 0 for x in list)
中的(x > 0 for x in list)
在该函数调用中创build一个生成器expression式,例如。
>>> nums = [1, 2, -1, 9, -5] >>> genexp = (x > 0 for x in nums) >>> for x in genexp: print x True True False True False
遇到第一个评估为True
对象有哪些用法和shortcircuits
>>> names = ['King', 'Queen', 'Joker'] >>> any(n in 'King and john' for n in names) True >>> all(n in 'King and Queen' for n in names) False
它只是将几行代码合并为一个。 您不必编写冗长的代码,如:
for n in names: if n in 'King and john': print True else: print False
这是因为可迭代是
(x > 0 for x in list)
请注意, x > 0
返回True
或False
,因此您有一个可以迭代的布尔值。
简单地说,any()做这个工作:根据条件,即使它在列表中遇到一个满足的值,它返回true,否则返回false。
list = [2,-3,-4,5,6] a = any(x>0 for x in lst) print a: True list = [2,3,4,5,6,7] a = any(x<0 for x in lst) print a: False