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

时间:2013-05-12 08:18:52

标签: python

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的内容?

5 个答案:

答案 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不再需要创建TrueTrue(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的内置函数allTrue尽早发布。看到了价值。

答案 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会返回TrueFalse,因此您有一个可互换的布尔值。

答案 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
相关问题