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


在python docs页面中 any,等价的代码 any() 功能如下:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

如果以这种形式调用它,这个函数如何知道我想测试哪个元素?

any(x > 0 for x in list)

从函数定义中,我只能看到我传递的是一个可迭代对象。怎么样 for 循环知道我在找东西 > 0


76
2018-05-12 08:18


起源




答案:


如果你使用 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,这是一种不同的迭代,称为a 发电机表达。在将生成器表达式添加到Python之前,您将创建一个 列表理解,看起来非常相似,但与周围 []的: [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 价值被看到。


112
2018-05-12 08:38



还值得一提的是 any(x > 0 for x in list) 只是一个语法糖 any((x > 0 for x in list))。 - georg
你应该补充一下 None到布尔值为的元素列表 False - Alok Mysore
添加到@georg,语法糖并不特别 any。 def b(x): return x; print b(x > 1 for x in xs) # prints <generator object .. - industryworker3595112


>>> 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

21
2018-06-08 07:29





(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


19
2018-05-12 08:21





这是因为可迭代的

(x > 0 for x in list)

注意 x > 0 返回 True 要么 False 因此你有一个可迭代的布尔值。


5
2018-05-12 08:20





简单地说,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

4
2018-05-05 09:37