在any
的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 :(得分:129)
如果您使用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}}开始,您将获得 compreadhended list :[-1, -2, 10, -4, 20]
。然后,此内部值将传递给[False, False, True, False, True]
函数,该函数将返回any
,因为至少有一个True
值。
但是使用生成器表达式,Python不再需要创建True
和True(s)
的内部列表,这些值将作为False(s)
函数生成迭代生成器表达式一次生成的值。 和,由于any
短路,它会在看到第一个any
值后立即停止迭代。如果您使用True
(或lst
,如果您使用的是 Python2.x )创建了lst = range(-1,int(1e9))
,这将非常方便。即使这个表达式将生成超过十亿个条目,xrange
只需要到达any
时第三个条目,1
评估True
x>0
,因此any
可以返回True
。
如果您创建了列表理解,Python首先必须在内存中创建十亿元素列表,然后将其传递给any
。但是通过使用生成器表达式,只要any
或{{1},就可以让Python的内置函数all
和True
尽早发布。看到了价值。
答案 1 :(得分:24)
>>> 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 :(得分:20)
(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 :(得分:6)
这是因为可迭代是
(x > 0 for x in list)
请注意,x > 0
会返回True
或False
,因此您有一个可互换的布尔值。
答案 4 :(得分:5)
简单地说,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