这个输入如何与 Python 的“ any”函数一起工作?

any的 python docs 页面中,any()函数的等效代码如下:

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

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

any(x > 0 for x in list)

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

171234 次浏览

这是因为迭代是

(x > 0 for x in list)

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

函数调用中的 (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的对象时短路

如果使用 any(lst),您会看到 lst是迭代的,它是一些项目的列表。如果它包含 [0, False, '', 0.0, [], {}, None](所有的布尔值都是 False) ,那么 any(lst)就是 False。如果 lst也包含以下 [-1, True, "X", 0.00001]中的任何一个(所有这些 [-1, True, "X", 0.00001]的值都是 True) ,那么 any(lst)就是 True

在您发布的代码 x > 0 for x in lst中,这是一种不同类型的可迭代代码,称为 生成器表达式生成器表达式。在生成器表达式被添加到 Python 之前,您可能已经创建了一个 []0,它看起来非常相似,但是周围有 []: [x > 0 for x in lst]。从包含 [-1, -2, 10, -4, 20]lst,你会得到这个 []1: [False, False, True, False, True]。然后,这个内部值将被传递给 any函数,该函数将返回 True,因为至少有一个 True值。

但是对于 False(s)4,Python 不再需要创建 True(s)False(s)的内部列表,这些值将在 any函数迭代生成器表达式每次生成一个值时生成。False(s)5,因为 any短路,它将停止迭代一旦它看到第一个 True值。如果使用类似于 lst = range(-1,int(1e9))的东西创建 lst(如果使用 False(s)6,则为 xrange) ,那么这将特别方便。尽管这个表达式将生成超过10亿个条目,但是当到达 1时,any只需要到达第三个条目,1计算 TrueFalse(s)1的值,因此 any可以返回 True

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

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