问题:python any()函数如何工作?
def any(iterable):
for element in iterable:
if element:
return True
return False
如果以这种形式调用此函数,该函数如何知道我要测试的元素?
any(x > 0 for x in list)
从函数定义中,我只能看到我正在传递一个可迭代的对象。for
循环如何知道我在寻找什么> 0
?
回答 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
,这是另一种可迭代的类型,称为生成器表达式。在将生成器表达式添加到Python之前,您已经创建了一个列表理解,它看起来非常相似,但带有[]
:[x > 0 for x in lst]
。从lst
包含的清单中[-1, -2, 10, -4, 20]
,您可以得到:。由于存在至少一个值,因此此内部值将传递给该函数,该函数将返回。[False, False, True, False, True]
any
True
True
但是使用生成器表达式时,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
尽早推出。True
False
回答 1
>>> 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
回答 2
(x > 0 for x in list)
在该函数调用中创建一个生成器表达式,例如。
>>> nums = [1, 2, -1, 9, -5]
>>> genexp = (x > 0 for x in nums)
>>> for x in genexp:
print x
True
True
False
True
False
其any
用途,并在遇到的第一个对象,评估地短路True
回答 3
这是因为迭代是
(x > 0 for x in list)
请注意,x > 0
返回True
或False
,因此您具有一个可迭代的布尔值。
回答 4
简而言之,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