1. ホーム
  2. python

[解決済み] pythonのany()関数は具体的にどのように動作するのでしょうか?

2022-07-21 17:47:33

質問

の python docs ページで any に相当するコードは any() 関数は次のように与えられます。

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

このフォームで呼び出した場合、この関数はどのように私がテストしたい要素を知ることができるのでしょうか?

any(x > 0 for x in list)

関数の定義からわかることは、イテレート可能なオブジェクトを渡していることです。どのように for ループは私が何かを探していることを知ることができます。 > 0 ?

どのように解決するのですか?

もし 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に追加される前、あなたは リスト内包 を作成していました。これは非常によく似ていますが、周囲に [] 's: [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 が短絡しているため、最初の True の値を見た時点で停止します。これは、特に lst のようなものを使って lst = range(-1,int(1e9)) (または xrange を使用している場合は Python2.x ). この式で10億以上のエントリーが生成されるにもかかわらず any は3番目のエントリまでしか進みません。 1 と評価され True に対して x>0 というように any を返すことができます。 True .

もし、あなたが リスト内包 を作ったとしたら、Python はまずメモリ上に 10 億要素のリストを作成し、それを any . しかし ジェネレータ式 を使えば、Pythonの組み込み関数である anyall が発生すると同時に、早期にブレイクする。 True または False の値が表示されます。