Pythonのany()関数はどのくらい正確に機能しますか?


113

の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ですか?

回答:


166

使用するany(lst)lst、それが反復可能であることがわかります。これは、いくつかの項目のリストです。含まれている場合[0, False, '', 0.0, [], {}, None](すべてのブール値がFalse)はにany(lst)なりますFalselst次のいずれかが含まれている場合[-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値が見られます。


25
また、これはのany(x > 0 for x in list)構文上の砂糖にすぎませんany((x > 0 for x in list))
georg 2013年

3
次のNoneブール値を持つ要素のリストに追加する必要がありますFalse
Alok Mysore 2016

2
@georgに追加すると、構文糖はに特別ではありませんanydef b(x): return x; print b(x > 1 for x in xs) # prints <generator object ..
industryworker3595112

@georgこの説明をありがとうございます。これは、ブラケットを使用してコードをテストするときに混乱した本当に重要なポイントです。
MasayoMusic

39
>>> 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

23

(x > 0 for x in list) その関数呼び出しでジェネレータ式を作成します。

>>> nums = [1, 2, -1, 9, -5]
>>> genexp = (x > 0 for x in nums)
>>> for x in genexp:
        print x


True
True
False
True
False

どちらanyの用途、およびその評価された最初のオブジェクトに遭遇した上shortcircuitsTrue


7

イテラブルは

(x > 0 for x in list)

またはをx > 0返すため、ブール値の反復可能オブジェクトがあることに注意してください。TrueFalse


7

簡単に言うと、any()はこの機能を実行します。条件に応じて、リストで1つの条件を満たす値が検出された場合でもtrueを返し、それ以外の場合はfalseを返します。

list = [2,-3,-4,5,6]

a = any(x>0 for x in lst)

print a:
True


list = [2,3,4,5,6,7]

a = any(x<0 for x in lst)

print a:
False
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.