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