126

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

4

5 に答える 5

183

使用すると、それが iterable である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 に追加される前は、非常によく似たリスト内包表記を作成していたでしょうが、周囲に':があります。含まれている から、次の包括的なリストを取得します。少なくとも 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

于 2013-05-12T08:38:56.313 に答える
48
>>> 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
于 2016-06-08T07:29:15.500 に答える
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が使用され、短絡しますTrue

于 2013-05-12T08:21:39.537 に答える
9

それは iterable が

(x > 0 for x in list)

or のいずれかをx > 0返すことに注意してください。したがって、ブール値のイテラブルがあります。TrueFalse

于 2013-05-12T08:20:54.917 に答える
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
于 2016-05-05T09:37:48.520 に答える