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

2024-04-18 16:35:02 发布

您现在位置:Python中文网/ 问答频道 /正文

^{}的python文档页面中,any()函数的等效代码如下:

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

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

any(x > 0 for x in list)

从函数定义中,我所看到的只是传递了一个iterable对象。这个for循环怎么知道我在找什么> 0


Tags: 函数代码in文档falsetrueforreturn
3条回答

如果使用any(lst),就会看到lst是iterable,它是一些项的列表。如果它包含[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中,这是另一种iterable,称为生成器表达式。在将生成器表达式添加到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 = range(-1,int(1e9))之类的东西创建lst(或者如果您使用的是xrangePython2.x,这将特别方便。即使这个表达式将生成超过10亿个条目,any只需在到达1时到达第三个条目,它对x>0求值True,因此any可以返回True

如果您创建了一个列表理解,Python首先必须在内存中创建十亿元素列表,然后将其传递给any。但是,通过使用生成器表达式,只要看到TrueFalse值,就可以让Python的内置函数如anyall提前爆发。

(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

在遇到第一个计算结果为True的对象时,any使用的对象和短路

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

相关问题 更多 >