使用すると、それが iterable である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 に追加される前は、非常によく似たリスト内包表記を作成していたでしょうが、周囲に':があります。含まれている から、次の包括的なリストを取得します。少なくとも 1 つの値があるため、この内部値は関数に渡され、が返されます。[]
[x > 0 for x in lst]
lst
[-1, -2, 10, -4, 20]
[False, False, True, False, True]
any
True
True
しかし、ジェネレーター式True(s)
を使用すると、Python はとの内部リストを作成する必要がなくなりFalse(s)
、any
関数がジェネレーター式によって一度に 1 つずつ生成された値を反復処理するときに、値が生成されます。そして、any
短絡なので、最初のTrue
値を確認するとすぐに反復を停止します。lst
これは、次のようなものを使用して作成した場合lst = range(-1,int(1e9))
(またはPython2.xxrange
を使用している場合) に特に便利です。この式は 10 億を超えるエントリを生成しますが、に到達したときに 3 番目のエントリまで移動するだけでよく、これは に対して評価されるため、 を返すことができます。any
1
True
x>0
any
True
リスト内包表記を作成した場合、Python はまずメモリ内に 10 億要素のリストを作成し、それを に渡す必要がありany
ます。しかし、ジェネレーター式を使用することで、または値が見られるとすぐにPython の組み込み関数 likeany
およびall
を早期にブレークアウトさせることができます。True
False