126

在 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

4

5 回答 5

183

如果你使用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 不再需要创建 and 的内部列表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 的内置函数 likeanyall尽早中断,只要看到TrueorFalse值。

于 2013-05-12T08:38:56.313 回答
48
>>> 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
于 2016-06-08T07:29:15.500 回答
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

于 2013-05-12T08:21:39.537 回答
9

这是因为可迭代的是

(x > 0 for x in list)

请注意,x > 0返回TrueFalse因此您有一个可迭代的布尔值。

于 2013-05-12T08:20:54.917 回答
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
于 2016-05-05T09:37:48.520 回答