Wie genau funktioniert die Python-Funktion any ()?

110

Auf der Python-Dokumentenseite für anywird der entsprechende Code für die any()Funktion wie folgt angegeben:

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

Woher weiß diese Funktion, welches Element ich testen möchte, wenn ich es in dieser Form aufrufe?

any(x > 0 for x in list)

Aus der Funktionsdefinition geht hervor, dass ich ein iterierbares Objekt übergebe. Woher weiß die forSchleife, dass ich etwas suche > 0?

Pythoniku
quelle

Antworten:

163

Wenn Sie verwenden any(lst), sehen Sie, dass dies lstdie iterable ist, die eine Liste einiger Elemente ist. Wenn es enthalten würde [0, False, '', 0.0, [], {}, None](von denen alle boolesche Werte haben False), any(lst)wäre es False. Wenn lstauch eines der folgenden [-1, True, "X", 0.00001]Elemente enthalten wäre (von denen alle ausgewertet werden True), any(lst)wäre dies der Fall True.

In dem von Ihnen geposteten Code x > 0 for x in lsthandelt es sich um eine andere Art von iterierbarem Code , der als Generatorausdruck bezeichnet wird . Bevor Generatorausdrücke zu Python hinzugefügt wurden, hätten Sie ein Listenverständnis erstellt , das sehr ähnlich aussieht, jedoch mit den umgebenden []: [x > 0 for x in lst]. Aus dem lstInhalt [-1, -2, 10, -4, 20]würden Sie diese verstandene Liste erhalten : [False, False, True, False, True]. Dieser interne Wert würde dann an die anyFunktion übergeben, die zurückkehren würde True, da mindestens ein TrueWert vorhanden ist.

Bei Generatorausdrücken muss Python diese interne Liste von True(s)und nicht mehr erstellen. False(s)Die Werte werden generiert, wenn die anyFunktion die vom Generatorausdruck einzeln generierten Werte durchläuft. Und da es anyKurzschlüsse gibt, hört es auf zu iterieren, sobald es den ersten TrueWert sieht . Dies ist besonders praktisch, wenn Sie lstmit etwas wie erstellt haben lst = range(-1,int(1e9))(oder xrangewenn Sie Python2.x verwenden ). Auch wenn dieser Ausdruck eine Milliarde Einträge erzeugt über wird, anyhat nur bis zum dritten Eintrag gehen , wenn es um bekommt 1, die auswertet Truefür x>0und so anyzurückkehren kann True.

Wenn Sie ein Listenverständnis erstellt hätten , hätte Python zuerst die Liste mit Milliarden Elementen im Speicher erstellen und diese dann an übergeben müssen any. Wenn Sie jedoch einen Generatorausdruck verwenden , können Sie die integrierten Funktionen von Python wie anyund allfrüh ausbrechen lassen, sobald ein Trueoder False-Wert angezeigt wird.

PaulMcG
quelle
25
Erwähnenswert any(x > 0 for x in list)ist auch, dass dies nur ein syntaktischer Zucker für ist any((x > 0 for x in list)).
Georg
3
Sie sollten Noneder Liste der Elemente hinzufügen , die boolesche Werte vonFalse
Alok Mysore
2
Neben @georg ist der syntaktische Zucker nichts Besonderes any. def b(x): return x; print b(x > 1 for x in xs) # prints <generator object ..
Industriearbeiter3595112
@georg Danke für diese Klarstellung. Dies ist ein wirklich wichtiger Punkt, der mich beim Testen des Codes mit Klammern verwirrt hat.
MasayoMusic
38
>>> 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

Es werden nur mehrere Codezeilen zu einer reduziert. Sie müssen keinen langen Code schreiben wie:

for n in names:
    if n in 'King and john':
       print True
    else:
       print False
Pranjay Kaparuwan
quelle
23

(x > 0 for x in list) In diesem Funktionsaufruf wird ein Generatorausdruck erstellt, z.

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


True
True
False
True
False

Welche anyverwendet, und Kurzschlüsse bei der Begegnung mit dem ersten Objekt, das ausgewertet wirdTrue

Jamylak
quelle
7

Es ist, weil das iterable ist

(x > 0 for x in list)

Beachten Sie, dass x > 0entweder Trueoder zurückgegeben wird Falseund Sie daher eine Iterable von Booleschen Werten haben.

verrückt
quelle
7

Einfach gesagt, any () funktioniert so: Je nachdem, ob ein erfüllender Wert in der Liste gefunden wird, wird true zurückgegeben, andernfalls 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
Alisha
quelle