2013-05-12 24 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 
相關問題