python any()函数如何工作?


113

在的python文档页面中any,该any()函数的等效代码为:

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

如果以这种形式调用此函数,该函数如何知道我要测试的元素?

any(x > 0 for x in list)

从函数定义中,我只能看到我正在传递一个可迭代的对象。for循环如何知道我在寻找什么> 0

Answers:


166

如果您使用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]anyTrueTrue

但是使用生成器表达式时,Python不再需要创建True(s)and的内部列表,False(s)因为any函数迭代生成器表达式一次生成的值时会生成值。并且,由于any短路,一旦看到第一个True值,它将立即停止迭代。如果lst使用类似方法创建lst = range(-1,int(1e9))(或xrange使用Python2.x),则将特别方便。即使此表达式将生成超过十亿个条目,any但到达时只需要到达第三个条目1,它的值就Truex>0,因此any可以返回True

如果您创建了列表推导,Python首先必须在内存中创建十亿个元素的列表,然后将其传递给any。但是,通过使用生成器表达式,您可以在看到a 或value时就拥有Python的内置函数,例如,anyall尽早推出。TrueFalse


25
值得一提的是,any(x > 0 for x in list)它只是的语法糖any((x > 0 for x in list))
乔治,

3
您应该将None元素的布尔值添加到False
Alok Mysore

2
除了@georg之外,语法糖也不是anydef b(x): return x; print b(x > 1 for x in xs) # prints <generator object ..
industryworker3595112

@georg谢谢您的澄清。这是非常重要的一点,让我在使用任何括号测试代码时感到困惑。
MasayoMusic

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

23

(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


7

这是因为迭代是

(x > 0 for x in list)

请注意,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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.