回答:
使用する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に追加される前は、リスト内包表記を作成していましたが、これは非常によく似ていますが、周囲がで囲まれてい[]ます[x > 0 for x in lst]。よりlst含む[-1, -2, 10, -4, 20]、あなたはこのなるだろう理解リスト:[False, False, True, False, True]。この内部値はany関数に渡され、True少なくとも1つのTrue値が存在するため、関数はを返します。
しかし、とジェネレータ式、Pythonはもはやの内部リストを作成しなければならないTrue(s)とFalse(s)、値はとして生成されるanyジェネレータ式で一度に一つの生成された値によって機能を反復。そして、any短絡しているので、最初のTrue値を見つけるとすぐに反復を停止します。これは、lst次のようなものを使用して作成した場合lst = range(-1,int(1e9))(またはPython2.xを使用している場合)に特に便利です。この式は10億を超えるエントリを生成しますが、に到達したときに3番目のエントリまで実行する必要があります。これは、を評価し、を返すことができるためです。xrangeany1Truex>0anyTrue
リスト内包表記を作成した場合、Pythonは最初にメモリ内に10億個の要素のリストを作成し、それをに渡す必要がありanyます。しかし、使用してジェネレータ式を、次のようなPythonの組み込み機能を持つことができますanyし、allできるだけ早くとして、早期に抜け出すTrueか、False値が見られます。
Noneブール値を持つ要素のリストに追加する必要がありますFalse
any。def b(x): return x; print b(x > 1 for x in xs) # prints <generator object ..
>>> 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
数行のコードを1つに減らすだけです。次のような長いコードを書く必要はありません。
for n in names:
if n in 'King and john':
print True
else:
print False
any(x > 0 for x in list)構文上の砂糖にすぎませんany((x > 0 for x in list))。