Die Funktion any() wurde in Python 2.5 eingeführt, um bequem zu überprüfen: Gibt es mindestens ein wahres Element in einem iterierbaren Objekt (z. B. einer Liste, einem Tupel, einem Generator)? Sie ist nützlich, wenn man überprüfen möchte, ob mindestens eine Bedingung aus einer Vielzahl erfüllt ist.
Historisch gesehen musste man ohne sie eine Schleife mit einem Abbruch beim gefundenen Element schreiben oder map und reduce kombinieren – das war umständlich und langsam. Das Hauptproblem, das any() löst, ist die Kürze und Lesbarkeit solcher Prüfungen.
Die Lösung – any() und all() arbeiten mit fauler Bewertung (sie stoppen, sobald sie False oder True gefunden haben, respectively). Es ist wichtig, den Unterschied zu verstehen: any() gibt True beim ersten wahren Element zurück, all() nur, wenn alle Elemente wahr sind.
Beispielcode:
nums = [0, 0, 3, 0] if any(nums): print('Es gibt ein nicht-null Element in der Liste')
Hauptmerkmale:
Was passiert, wenn man eine leere Liste als Argument an any() übergibt?
Any() gibt False zurück. Das ist logisch: In einer leeren Sequenz gibt es kein einziges wahres Element.
Wie unterscheidet sich any() grundlegend von all()?
Any() prüft auf das Vorhandensein mindestens eines wahren Wertes. All() prüft die Wahrhaftigkeit aller Werte. Ihre Ergebnisse sind nur für streng leere Sammlungen gegensätzlich.
Kann man any() mit einem Generator verwenden, der unendlich sein könnte?
Ja, das kann man, und genau wegen der faulen Bewertung wird any stoppen, sobald es True trifft. Wenn der Generator jedoch niemals True zurückgibt, endet die Funktion nicht von selbst.
def infinite_gen(): while True: yield 0 # any(infinite_gen()) – läuft unendlich, wenn es keine Ausstiegsbedingungen gibt
Es soll überprüft werden, dass mindestens ein Wert nicht None ist:
values = [None, None, None] if any(values): do_something() # Wird niemals ausgeführt, wenn man einfach vergisst, dass None == False ist
Vorteile:
Nachteile:
Korrekte Anwendung – Suche nach mindestens einem Benutzer, der älter als 30 ist:
users = [{'age': 25}, {'age': 35}] if any(u['age'] > 30 for u in users): print('Es gibt einen Benutzer älter als 30')
Vorteile:
Nachteile: