python any()函数究竟是如何工作的?

pyt*_*iku 97 python

在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,其评估Truex>0,所以any可以返回True.

如果您已经创建了列表解析,那么Python首先必须在内存中创建十亿元素列表,然后将其传递给any.但是,通过使用一个生成器表达式,你可以有Python的像内置函数anyall早期爆发,只要一个True或者False价值能够被看见.

  • 还值得一提的是,`any(x> 0 for list in list)`只是`any((x> 0 for x in list))`的语法糖. (20认同)
  • 你应该将`None`添加到布尔值为'False`的元素列表中 (3认同)
  • 添加到@georg,语法糖对于`any` 来说并不特殊。`def b(x): 返回 x; print b(x > 1 for x in xs) # 打印 <generator object ..` (2认同)

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


fre*_*ish 7

这是因为可迭代的

(x > 0 for x in list)
Run Code Online (Sandbox Code Playgroud)

请注意,x > 0返回无论是TrueFalse,因此你有布尔的迭代.


小智 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)