List Comprehension wurde bereits in frühen Versionen von Python eingeführt. Dieser syntaktische Zucker wurde aus funktionalen Programmiersprachen entlehnt. Es macht den Code kompakter und manchmal sogar etwas schneller als eine herkömmliche for-Schleife.
Viele unerfahrene Entwickler verwenden List Comprehensions, ohne ihre Besonderheiten zu verstehen, was zu einer verringerten Lesbarkeit oder unerwarteten Effekten im Code führen kann. Außerdem fällt es neuen Entwicklern schwer, den Einsatz von List Comprehensions und die Funktionen map/filter/lambda zu unterscheiden.
List Comprehension ist eine Möglichkeit, schnell eine neue Liste zu erstellen, indem ein Ausdruck auf jedes Element der ursprünglichen Sequenz angewendet wird:
nums = [1, 2, 3, 4] squares = [x*x for x in nums if x % 2 == 0] # [4, 16]
Wichtige Merkmale:
Gibt List Comprehension einen Generator zurück?
Nein, es wird tatsächlich eine Liste zurückgegeben. Ein Generator wird mit runden Klammern erstellt:
# Das ist ein Generator: (x*x for x in range(10)) # Das ist eine Liste: [x*x for x in range(10)]
Kann man innerhalb von List Comprehension Werte Variablen zuweisen?
Im Standard-Syntax geht das nicht. Nur mit dem „Walrus“-Ausdruck (:=) ab Python 3.8:
[x for x in (y := range(5))] # Fehler! [x for x in [(y := i*i) for i in range(5)]] # y ist nur in dieser Liste sichtbar
Kann man äußere Variablen innerhalb von List Comprehension ändern?
Eine innerhalb der List Comprehension deklarierte Variable ist lokal und wird von außen nicht sichtbar. Das verwirrt oft Anfänger bei verschachtelten Konstruktionen.
** Negativer Fall Ein Entwickler verwendet verschachtelte List Comprehensions für komplexe Datenumwandlungen in einer Zeile. Vorteile: Der Code ist kompakt, der Effekt ist „Ich kenne Python!" Nachteile: Schwer zu lesen, neue Kollegen leiden darunter, Debugging wird zur Qual. ** Positiver Fall Ein Entwickler verwendet einfache List Comprehensions zur Filterung und Umwandlung kleiner Listen und schreibt für komplexe Operationen explizite Funktionen und Schleifen. Vorteile: Der Code ist leicht zu lesen, zu warten und zu erweitern. Nachteile: In einigen Fällen ist der Code etwas länger und es werden zusätzliche Variablen verwendet.