的第一個對象地短路。如果它包含[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
時纔會走到第三個條目,其評估True
爲x>0
,因此any
可以返回True
。
如果您創建了列表理解,Python首先必須在內存中創建億元列表,然後將其傳遞給any
。但通過使用生成器表達式,只要看到True
或False
的值,就可以提前突破Python的內置函數any
和all
。
這將是另外值得一提的是,'任何(X>在列表X 0)'只是一個語法糖'任何((x> 0對於列表中的x))'。 – georg 2013-05-12 09:53:00
您應該將'None'添加到布爾值爲False的元素列表中 – 2016-10-26 16:55:27
添加到@georg中,語法糖對「any」不是特殊的。 'def b(x):return x;打印b(對x中的x> 1)#打印<生成器對象..' – industryworker3595112 2018-01-17 07:50:07