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.
any(x > 0 for x in list)ist auch, dass dies nur ein syntaktischer Zucker für istany((x > 0 for x in list)).