在python docs页面中any,any()函数的等效代码如下:
def any(iterable):
for element in iterable:
if element:
return True
return False
Run Code Online (Sandbox Code Playgroud)
如果以这种形式调用它,这个函数如何知道我想测试哪个元素?
any(x > 0 for x in list)
Run Code Online (Sandbox Code Playgroud)
从函数定义中,我只能看到我传递的是一个可迭代对象.for循环如何知道我正在寻找什么> 0?
Pau*_*McG 143
如果您使用,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之前,您将创建一个列表推导,它看起来非常相似,但是周围的[]'s : [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短路,一旦看到第一个True值,它就会停止迭代.如果您lst使用类似的东西创建lst = range(-1,int(1e9))(或者xrange如果您使用的是Python2.x),这将特别方便.尽管这种表达将产生超过十亿的条目,any只需要尽可能的第三个条目时,得到去1,其评估True的x>0,所以any可以返回True.
如果您已经创建了列表解析,那么Python首先必须在内存中创建十亿元素列表,然后将其传递给any.但是,通过使用一个生成器表达式,你可以有Python的像内置函数any和all早期爆发,只要一个True或者False价值能够被看见.
Pra*_*wan 29
>>> 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
Run Code Online (Sandbox Code Playgroud)
它只是将几行代码减少为一行.您不必编写冗长的代码,例如:
for n in names:
if n in 'King and john':
print True
else:
print False
Run Code Online (Sandbox Code Playgroud)
jam*_*lak 22
(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
Run Code Online (Sandbox Code Playgroud)
其any使用和地短路的遭遇,评估的第一个对象True
这是因为可迭代的
(x > 0 for x in list)
Run Code Online (Sandbox Code Playgroud)
请注意,x > 0返回无论是True或False,因此你有布尔的迭代.
小智 7
简单地说,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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
139960 次 |
| 最近记录: |