2013-05-12 21 views
63

在为any 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

回答

92

的第一个对象地短路。如果它包含[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]。然后该内部值将传递给any函数,该函数将返回True,因为至少有一个值为True

但随着发生器表达式,Python中不再有要创建的True(s)False(s)该内部列表,这些值将产生通过的值any函数迭代产生的一个在由生成器表达式的时间。 ,因为any发生短路,只要它看到第一个值,就会停止迭代。如果您使用类似lst = range(-1,int(1e9))(或xrange,如果您使用Python2.x)创建了lst,则这将特别方便。尽管这个表达式会产生超过10亿的条目,但是any只有当它到达1时才会走到第三个条目,其评估Truex>0,因此any可以返回True

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

+12

这将是另外值得一提的是,'任何(X>在列表X 0)'只是一个语法糖'任何((x> 0对于列表中的x))'。 – georg 2013-05-12 09:53:00

+3

您应该将'None'添加到布尔值为False的元素列表中 – 2016-10-26 16:55:27

+0

添加到@georg中,语法糖对“any”不是特殊的。 'def b(x):return x;打印b(对x中的x> 1)#打印<生成器对象..' – industryworker3595112 2018-01-17 07:50:07

5

这是因为迭代是

(x > 0 for x in list) 

注意x > 0返回或者TrueFalse,因此你有布尔的迭代。

19

(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用途,并在遇到如果使用any(lst)你看到lst是迭代,这是一些项目的清单,评估True

1

简单地说,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 
15
>>> 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 
相关问题