Die For-Loop in Python, zu Deutsch „For-Schleife“, dient zum wie­der­hol­ten Ausführen eines Code-Blocks. For-Schleifen sind grund­le­gen­der Be­stand­teil der meisten Pro­gram­mier­spra­chen. Wir zeigen, wie die For-Loop in Python funk­tio­niert und wie sie ein­ge­setzt wird.

KI-Assistent kostenlos – Ihr smarter All­tags­hel­fer
  • DSGVO-konform & sicher gehostet in Deutsch­land
  • Pro­duk­ti­vi­tät steigern – weniger Aufwand, mehr Output
  • Direkt im Browser starten – ohne In­stal­la­ti­on

Was ist die For-Schleife in Python?

Die For-Schleife ist neben der if-else-Ver­zwei­gung das wohl be­kann­tes­te Pro­gram­mier­kon­strukt. Ge­ne­ra­tio­nen von Stu­die­ren­den haben sich am in­for­ma­ti­schen Konzept der Schleife das Hirn zer­mar­tert. Denn Schleifen sind zunächst wenig intuitiv. Dabei entstehen die Ver­ständ­nis­pro­ble­me mög­li­cher­wei­se mehr durch die Art, wie die Materie prä­sen­tiert wird. Denn an sich sind Schleifen nichts Au­ßer­ge­wöhn­li­ches.

Ver­deut­li­chen wir uns das Konzept der Schleife an einem an­schau­li­chen Beispiel. Stellen wir uns eine Schul­klas­se vor. Die Lehrkraft möchte im Rahmen eines Ex­pe­ri­ments die durch­schnitt­li­che Größe der Kinder ermitteln. Dazu fragt sie nach und nach jedes Kind nach dessen Größe und addiert die einzelnen Größen zu einer laufenden Summe. Im Anschluss teilt sie die Summe durch die Anzahl der Kinder, um die durch­schnitt­li­che Größe zu erhalten. Wir abs­tra­hie­ren einen simplen Al­go­rith­mus aus dem Vorgehen der Lehrkraft:

  1. Größe jedes Kindes abfragen und zu laufender Summe addieren
  2. Summe durch Anzahl der Kinder teilen

Der erste Schritt wird für jedes Kind einmal aus­ge­führt und ist damit abhängig von der zah­len­mä­ßi­gen Größe der Klasse. Der zweite Schritt wird un­ab­hän­gig von der Größe der Klasse nur einmal aus­ge­führt. Eine Schleife benötigen wir für den ersten Schritt. Hier ein Code-Beispiel, das die Durch­schnitts­grö­ße eines Schul­kinds mit einer For-Schleife in Python berechnet:

children_heights = [155, 171, 148, 161, 158, 153, 162]
height_sum = 0
for height in children_heights:
    height_sum = height_sum + height
average_height = height_sum // len(children_heights)
print(average_height)

Die For-Schleife in Python führt einen Code-Block wie­der­holt aus. Man spricht dabei auch von „Iteration“. Ins­be­son­de­re erlauben Schleifen, mehrere in einer „Kol­lek­ti­on“ zu­sam­men­ge­fass­te Elemente einzeln nach demselben Schema zu ver­ar­bei­ten. Eine For-Schleife nutzen wir dann, wenn sich der Umfang der Kol­lek­ti­on zur Laufzeit des Programms fest­stel­len lässt. Ist dies nicht der Fall, kommt für ge­wöhn­lich eine While-Schleife zum Einsatz.

Tipp

Lernen Sie, selbst­stän­dig Python-Code zu schreiben – mit unserem Python-Tutorial!

Was un­ter­schei­det die For-Schleife in Python von anderen Sprachen?

Viele Pro­gram­mier­spra­chen kennen das Konzept der For-Schleife. Neben Python ist diese auch in anderen Sprachen wie C, Java, Ja­va­Script und PHP ein grund­le­gen­des Konstrukt. Rein funk­tio­na­le Sprachen wie Haskell oder Lisp kommen für ge­wöhn­lich ohne explizite For-Schleife aus. Anstelle von Iteration werden in diesen Sprachen rekursive Funk­tio­nen ein­ge­setzt.

Alle Schleifen haben gemeinsam, dass ein Code-Block wie­der­holt aus­ge­führt wird. Jedoch un­ter­schei­det sich der Wirk­me­cha­nis­mus der For-Schleife in Python deutlich von anderen Sprachen. So kommt bei den meisten Pro­gram­mier­spra­chen eine so­ge­nann­te Schleifen-Variable zum Einsatz, die beim Durch­lau­fen der Schleife hoch­ge­zählt (in­kre­men­tiert) bzw. run­ter­ge­zählt (de­kre­men­tiert) wird.

Operation Bedeutung Her­kömm­li­che Syntax Python-Syntax
In­kre­men­tie­ren Wert einer Ganzzahl-Variable um be­stimm­ten, festen Betrag erhöhen i++ index += 1
De­kre­men­tie­ren Wert einer Ganzzahl-Variable um be­stimm­ten, festen Betrag ver­rin­gern i-- index -= 1

Be­trach­ten wir an einem Beispiel, wie eine For-Schleife in anderen Sprachen funk­tio­niert. Wir geben die Zahlen von 0 bis 9 in Ja­va­Script mit einer For-Schleife aus. Wir de­fi­nie­ren eine Ganzzahl-Variable 'number' und in­kre­men­tie­ren diese, solange die ent­hal­te­ne Zahl kleiner als 10 ist. Der dabei zum Einsatz kommende Code wirkt auf Neulinge eher kryptisch:

for ( let number = 0; number < 10; number++ ) {
    console.log(number);
}

Der Code für eine kor­re­spon­die­ren­de For-Schleife in Python wirkt deutlich auf­ge­räum­ter:

for number in range(10):
    print(number)

Anstatt den Wert der Schleifen-Variable direkt aus­zu­ge­ben, wird dieser in der Praxis meist zum In­di­zie­ren eines Elements innerhalb einer Kol­lek­ti­on genutzt. Wiederum zunächst ein Beispiel in Ja­va­Script: Wir geben die in der Liste 'people' ent­hal­te­nen Namen nach­ein­an­der aus. Dabei nutzen wir die Schleifen-Variable 'i' als fort­lau­fen­den Index der einzelnen Elemente:

people = ['Jack', 'Jim', 'John']
for (let i = 0; i < people.length; i++) {
    console.log("Here comes " + people[i]);
}

Das direkte In­di­zie­ren suk­zes­si­ver Listen-Elemente ist mit Vorsicht zu genießen. Denn ein ver­such­ter Zugriff außerhalb erlaubter Grenzen führt zu einem Lauf­zeit­feh­ler. In der Regel handelt es sich dabei um den be­rüch­tig­ten „Off-by-one Error“. Python macht vor, dass es auch anders geht. Hier dasselbe Beispiel mit einer For-Loop in Python – wir iterieren direkt über den Listen-Elementen, ohne diese mit einer Schleifen-Variable zu in­di­zie­ren:

people = ['Jack', 'Jim', 'John']
for person in people:
    print(f"Here comes {person}")

Der indirekte Nutzen der Schleifen-Variable trägt viel zur Ver­wir­rung beim Lernen von For-Schleifen in anderen Sprachen bei. Denn die dort zentrale Schleifen-Variable in­ter­es­siert uns meist nicht. Sie dient lediglich zum In­di­zie­ren der einzelnen Elemente. Die Nutzung her­kömm­li­cher For-Schleifen bedingt ein Ver­ständ­nis mehrerer komplexer Themen. Am Beispiel von Ja­va­Script:

Thema Auftreten in Ja­va­Script-For-Schleife
Variablen-Zuweisung let i = 0
Boolesche Ausdrücke i < limit
Inkrement-/Dekrement-Operator i++ / i--
Fest­stel­len der Größe einer Kol­lek­ti­on i < list.length
Null-basierte In­di­zie­rung von Elementen i < list.length ist OK; i <= list.length führt zu Off-by-one Error

Die For-Schleife in Python ist deutlich be­nut­zer­freund­li­cher. Auch wenn mit 'for' dasselbe Schlüs­sel­wort zum Einsatz kommt, handelt es sich um einen grund­le­gend anderen Ansatz. Anstatt eine Schleifen-Variable zu in­kre­men­tie­ren und damit suk­zes­si­ve Elemente zu in­di­zie­ren, iterieren wir direkt über den Elementen einer Kol­lek­ti­on. Die For-Loop in Python ist damit ver­gleich­bar mit dem forEach-Konstrukt mancher Sprachen wie Ruby und Ja­va­Script.

Geben wir zur Ver­an­schau­li­chung die einzelnen Buch­sta­ben eines Wortes aus. Innerhalb der For-Schleife wird pro Schleifen-Durchlauf ein Buchstabe des Wortes in der Variable 'letter' zur Verfügung gestellt. Das funk­tio­niert ohne Schleifen-Variable und damit ohne Gefahr, einen Off-by-one Error zu pro­du­zie­ren. Der Code ist präzise und leicht lesbar:

word = "Python"
for letter in word:
    print(letter)

Wie funk­tio­niert eine For-Schleife in Python?

Wie wir gesehen haben, löst die For-Schleife in Python elegant das Problem, über den Elementen einer Kol­lek­ti­on zu iterieren. Dabei kommen wir ohne den Umweg über eine nu­me­ri­sche Schlei­fen­va­ria­ble aus. Das ist toll, aber wie funk­tio­niert das genau? Um das Wirk­prin­zip der For-Loop in Python zu verstehen, muss man die Konzepte des Iterable und Iterators kennen.

Worum handelt es sich bei Iterable, Iterator und Generator?

Die For-Schleife in Python operiert auf Objekten, die als „Iterables“ bekannt sind. Dabei handelt es sich um Strings, Listen, Tupel und weitere, zu­sam­men­ge­setz­te Da­ten­ty­pen. In den Worten der of­fi­zi­el­len Python-Do­ku­men­ta­ti­on:

Zitat

„[An iterable is] an object capable of returning its members one at a time“ - Quelle: https://docs.python.org/3/glossary.html#term-iterable

Über­set­zung: „[Ein Iterable ist] ein Objekt mit der Kapazität, seine Elemente einzeln zu­rück­zu­ge­ben“ (übersetzt von IONOS)

Ein Iterable-Objekt hat zwei Ei­gen­schaf­ten:

  1. Es fasst mehrere Elemente als Kol­lek­ti­on zusammen.
  2. Es gewährt Zugriff auf die Elemente über eine „Iterator“ genannte Schnitt­stel­le.

Zu­sam­men­ge­nom­men bedeutet dies, dass Iterables Coll­ec­tions sind, über deren Inhalten sich iterieren lässt. Spe­zi­fisch besitzt ein Iterable eine Methode '__iter__()', die einen Iterator zu­rück­gibt. Beim Iterator handelt es sich um ein Objekt, das auf Kommando das nächste Element des Iterable liefert. Ferner erinnert ein Iterator die Position des zuletzt zu­rück­ge­ge­be­nen Elements innerhalb der Kol­lek­ti­on.

Funktion Erklärung Beispiel
iter(coll­ec­tion) Ruft Methode __iter__() der Coll­ec­tion auf it = iter("Python")
next(iter) Ruft Methode __next__() des Iterators auf next(it)
coll­ec­tion[index] Ruft Methode __getitem__(index) der Coll­ec­tion auf 'Python'[1]

Ein Iterator liefert beim Aufruf der __next__()-Methode das nächste Element zurück. Wurden alle Elemente der Coll­ec­tion aus­ge­lie­fert, ist der Iterator erschöpft. Ein weiterer Aufruf von __next__() löst eine 'S­to­pI­te­ra­ti­on'-Exception aus.

Be­trach­ten wir die Funk­ti­ons­wei­se eines Iterators an einem Beispiel. Wir erzeugen ein range()-Objekt, das die kon­se­ku­ti­ven Zahlen 21 bis 23 re­prä­sen­tiert. Im Anschluss erzeugen wir einen Iterator mit der iter()-Funktion und geben suk­zes­si­ve Elemente mit der next()-Funktion aus. Beim letzten Aufruf wird die Exception ausgelöst, da der Iterator erschöpft ist:

numbers = range(21, 24)
number = iter(numbers)
next(number)
# returns `21`
next(number)
# returns `22`
next(number)
# returns `23`
next(number)
# raises `StopIteration` exception

Ein Iterator gibt Zugriff auf einzelne Elemente einer Coll­ec­tion. Daneben kennt Python das verwandte Konzept des „Generator“. Der Un­ter­schied liegt darin, dass ein Generator einzelne Elemente erst beim Zugriff erzeugt. Dies spart vor allem Spei­cher­platz bei der Aus­füh­rung des Programms; man spricht dabei auch von „lazy ge­ne­ra­ti­on“.

Ein Generator in Python beruht auf einer Funktion, die die Yield-Anweisung benutzt. Diese gibt ähnlich der Return-Anweisung ein Objekt zurück und beendet den Funk­ti­ons­auf­ruf. Beim erneuten Aufruf beginnt die Generator-Funktion jedoch nicht wieder von vorne, sondern läuft nach der letzten Yield-Anweisung weiter.

Schauen wir uns ein Beispiel an. Wir schreiben eine eigene Im­ple­men­ta­ti­on der range()-Funktion. Dabei nutzen wir die Yield-Anweisung innerhalb einer While-Schleife, um fort­lau­fen­de Zahlen zu ge­ne­rie­ren:

def my_range(start, stop):
    if stop < start:
        return None
    current = start
    while current < stop:
        yield current
        current += 1
# test
assert list(my_range(7, 9)) == list(range(7, 9))

Einen Durchlauf der For-Schleife in Python über­sprin­gen und abbrechen

In der Praxis ist es manchmal notwendig, einen einzelnen Schleifen-Durchlauf zu über­sprin­gen. Wie viele andere Sprachen enthält Python die Continue-Anweisung. Beim Aufruf von continue innerhalb des Schlei­fen­kör­pers wird die laufende Iteration ab­ge­bro­chen. Die Schleife beginnt im Anschluss sofort mit der nächsten Iteration.

Eine Continue-Anweisung lässt sich ähnlich dem Early Return beim Funk­ti­ons­auf­ruf nutzen. Bei­spiels­wei­se über­sprin­gen wir eine Iteration, sobald wir fest­stel­len, dass ein Datensatz nicht über die benötigte Qualität verfügt:

def process_data(data):
    for data_set in data:
        data_set.validate()
        # early continue after cheap check fails
        if not data_set.quality_ok():
            continue
        # expensive operation guarded by early continue
        data_set.process()

Ein weiteres Beispiel – wir geben einen Text aus und über­sprin­gen jeden zweiten Buch­sta­ben:

text = 'Skipping every second letter'
for index, letter in enumerate(text):
    if index % 2 != 0 and letter != ' ':
        continue
    print(letter)

Neben der Continue-Anweisung zum Über­sprin­gen eines Schleifen-Durch­laufs gibt es die Break-Anweisung. Ein Aufruf von break innerhalb des Schlei­fen­kör­pers bricht die weitere Aus­füh­rung der Schleife sofort ab. Damit hat break eine ähnliche Funktion für Schleifen wie die Return-Anweisung für Funk­tio­nen.

Häufig kommt die Break-Anweisung zum Einsatz, um Such­al­go­rith­men zu im­ple­men­tie­ren. Wurde innerhalb einer Schleife ein gesuchtes Element gefunden, ist es unnötig, weiter zu iterieren. Über­prü­fen wir analog zur any()-Funktion eine Liste auf Vor­han­den­sein eines einzelnen True-Wertes. Wir brechen mit break ab, sobald wir fündig geworden sind:

bool_list = [False, False, True, False]
for index, boolean in enumerate(bool_list):
    if boolean:
        print(f"Value at position {index + 1} is True")
        print(f"Aborting inspection of remaining {len(bool_list) - index - 1} item(s)")
        break

Im Zu­sam­men­hang mit der Break-Anweisung lässt sich eine For-Schleife in Python mit einem op­tio­na­len Else-Körper versehen. Der ent­hal­te­ne Code wird aus­ge­führt, wenn die Schleife ter­mi­niert, ohne dass eine Break-Anweisung aus­ge­führt wurde:

def find_element(target, collection):
    for element in collection:
        if element == target:
            print("Found what you're looking for")
            break
    else:
        print("Didn't find what you were looking for")
# test
find_element('a', 'Python')
find_element('o', 'Python')

For-Schleifen kommen in Python oft innerhalb von Funk­ti­ons­kör­pern zum Einsatz. In diesem Fall ist es ge­bräuch­lich, statt einer Break-Anweisung eine Return-Anweisung zu verwenden. Unser Such­al­go­rith­mus um­for­mu­liert ohne den Einsatz von break und else:

def find_element(target, collection):
    for element in collection:
        if element == target:
            print("Found what you're looking for")
            # returning breaks us out of the loop
            return element
    # we made it here without returning
    print("Didn't find what you were looking for")
    return None
# test
print(find_element('a', 'Python'))
print(find_element('o', 'Python'))

Was sind die Best Practices für For-Loops in Python?

For-Loops in Python dienen in erster Linie zum Iterieren über den Elementen einer Sequenz oder Kol­lek­ti­on. Ferner exis­tie­ren für viele häufige An­wen­dungs­fäl­le direktere Methoden. Wir stellen wichtige Best Practices und Anti-Patterns vor. Zunächst ein Überblick zentraler Begriffe:

Begriff Erklärung Beispiel
Coll­ec­tion Zu­sam­men­fas­sung mehrerer Elemente. Eine Coll­ec­tion ist ein Iterable ('Walter', 'White'), [4, 2, 6, 9], 'Python'
Iterator Schnitt­stel­le zum Iterieren über Coll­ec­tions it = iter('Python')
Generator Eine Funktion, die yield statt der Return-Anweisung verwendet. Ein Generator ist Iterable range(10)
Com­pre­hen­si­on Ite­rie­ren­der Ausdruck; erzeugt eine neue Kol­lek­ti­on basierend auf einem Iterable [num ** 2 for num in range(10)]

Direkt über den Elementen einer Kol­lek­ti­on iterieren

Ein häufiger Fehler un­er­fah­re­ner Python-Pro­gram­mie­rer besteht darin, die For-Loop in Python zu miss­brau­chen. Wie in anderen Sprachen üblich, nutzen sie die len()-Funktion als Limit der range()-Funktion, um eine nu­me­ri­sche Schleifen-Variable zu erzeugen. Sie in­di­zie­ren damit die einzelnen Elemente der Kol­lek­ti­on:

word = 'Python'
for i in range(len(word)):
    print(word[i])

Dieses Anti-Pattern ist aus gutem Grund als un­py­tho­nisch verpönt. Denn es ist besser, mit der For-Loop in Python direkt über den Elementen der Kol­lek­ti­on zu iterieren:

word = 'Python'
for letter in word:
    print(letter)

Elemente einer Kol­lek­ti­on mit enumerate() samt Index aufzählen

Manchmal benötigt man den Index eines Elements innerhalb der Coll­ec­tion. Anstatt den Index als Schleifen-Variable zu erzeugen, nutzen wir die enumerate()-Funktion. Diese gibt das Tupel (Index, Element) zurück. Dabei ist zu beachten, dass der Index bei null zu zählen anfängt:

names = ["Jim", "Jack", "John"]
for index, name in enumerate(names):
    print(f"{index + 1}. {name}")

Mit der zip()-Funktion über Tupeln von Elementen iterieren

Ein weiteres häufig an­zu­tref­fen­des Szenario ist das gleich­zei­ti­ge Iterieren über den Elementen zwei gleich langer Coll­ec­tions. Der py­tho­ni­sche Ansatz benutzt die zip()-Funktion. Diese nimmt zwei gleich lange Coll­ec­tions entgegen und gibt suk­zes­si­ve 2-Tupel zurück:

people = ('Jim', 'Jack', 'John')
ages = (42, 69, 13)
# ascertain both collections are same length
assert len(people) == len(ages)
# iterate over tuples of (person, age)
for person, age in zip(people, ages):
    print(f"{person} is {age} years old")

Mit der range()-Funktion eine nu­me­ri­sche Schleifen-Variable erzeugen

Nor­ma­ler­wei­se werden For-Loops in Python ein­ge­setzt, um über Elementen einer Kol­lek­ti­on zu iterieren. Das In­kre­men­tie­ren einer Ganzzahl mit einer For-Schleife ist in Python eher ein Spe­zi­al­fall. Der korrekte Weg besteht darin, mit der range()-Funktion ein Range-Objekt zu kon­stru­ie­ren und über diesem zu iterieren:

for counter in range(10):
    print(counter)

Mit dem in-Operator testen, ob eine Kol­lek­ti­on ein Element enthält

Das Auffinden eines be­stimm­ten Elements innerhalb einer Kol­lek­ti­on gehört zum Standard-Re­per­toire eines Pro­gram­mie­rers. Nor­ma­ler­wei­se kommt eine Funktion zum Einsatz, die über den Elementen iteriert und dabei jedes Element auf Gleich­heit mit dem gesuchten überprüft. Wurde das Element gefunden, wird die Iteration ab­ge­bro­chen.

In Python existiert für diesen häufigen Fall der in-Operator. Der Operator überprüft, ob die Kol­lek­ti­on das gesuchte Element enthält, und liefert einen ent­spre­chen­den boole­schen Wert zurück:

'a' in 'Python'
'y' in 'Python'

Mit der list()-Funktion aus einem Iterable eine Liste erzeugen

Anders als in vielen anderen Sprachen ist es unnötig, eine For-Schleife in Python ein­zu­set­zen, um die Buch­sta­ben eines Strings einzeln in eine Liste zu schreiben. Statt­des­sen nutzen wir die list()-Funktion, um ein Iterable in eine Liste von Elementen zu kon­ver­tie­ren. Schauen wir uns beide Ansätze an einem Beispiel an. Wir iterieren über den Buch­sta­ben eines Wortes und fügen diese einer leeren Liste hinzu:

word = 'Python'
letters = []
for letter in word:
    letters.append(letter)

Den Aufwand können wir uns sparen. Wir erzeugen die Liste mit der list()-Funktion direkt. Im selben Zuge über­prü­fen wir mit der Assert-Anweisung, dass beide Methoden dasselbe Resultat liefern:

assert list(word) == letters

Ein weiteres Beispiel: Wir erzeugen die Liste der Zahlen null bis neun. Als Basis dient ein Range-Objekt als Iterable:

list(range(10))

Neben Listen lassen sich auch Mengen, auf Englisch „Sets“, aus einem Iterable erzeugen. Bei­spiels­hal­ber erzeugen wir ein Set, das die in einem Satz ent­hal­te­nen Buch­sta­ben wi­der­spie­gelt. Im Anschluss über­prü­fen wir mit dem in-Operator, dass die Menge der Buch­sta­ben kein 'a' enthält:

alphabet = set('Python is not hyped')
assert 'a' not in alphabet

For-Loops in Python mit Com­pre­hen­si­ons ersetzen

Ein häufiger Nutzen von For-Schleifen in Python besteht darin, die Elemente einer Kol­lek­ti­on zu mo­di­fi­zie­ren. Ggf. möchten wir basierend auf einer Kol­lek­ti­on neue Werte errechnen oder bestimmte Elemente nach einem Muster filtern. Dem im­pe­ra­ti­ven Pro­gram­mier­stil folgend be­schrei­ben wir die einzelnen Schritte:

  1. Mit For-Schleife über der Kol­lek­ti­on iterieren.
  2. Jedes Element ver­ar­bei­ten.
  3. Dabei ggf. Un­ter­men­ge der Elemente zu neuer Kol­lek­ti­on zu­sam­men­fas­sen.

Für simple Mo­di­fi­ka­tio­nen ist dies recht aufwendig. Funk­tio­na­le Sprachen machen es vor, dass es auch einfacher geht. Glück­li­cher­wei­se kennt Python das Konzept der „Com­pre­hen­si­ons“. Com­pre­hen­si­ons können simple An­wen­dun­gen der For-Schleife in Python ersetzen. Sie sind dabei per­for­man­ter als äqui­va­len­te An­wen­dun­gen einer For-Schleife.

Ein Com­pre­hen­si­on erzeugt eine ggf. mo­di­fi­zier­te Kol­lek­ti­on basierend auf einem Iterable. Dabei kommt eine knappe, aus­drucks­star­ke Syntax zum Einsatz. Be­trach­ten wir die generelle Syntax einer List Com­pre­hen­si­on. Wir schreiben den Ausdruck zwischen eckige Klammern. Eine Operation wird auf den Elementen einer Kol­lek­ti­on aus­ge­führt; jedes Element wird dabei in eine neue Liste kopiert:

[ operation(element) for element in collection ]

Ferner lassen sich Elemente nach be­stimm­ten Mustern filtern. Zum Einsatz kommt ein op­tio­na­les if und eine Bedingung:

[ operation(element) for element in collection if condition(element) ]

Be­trach­ten wir im Anschluss ein Beispiel für eine For-Schleife in Python, die sich durch eine Com­pre­hen­si­on ersetzen lässt. Wir haben eine Liste mit Zahlen und möchten die dazu kor­re­spon­die­ren­de Liste an Qua­drat­zah­len berechnen:

numbers = [2, 3, 5, 9, 17]

Wir erzeugen eine leere Liste und befüllen diese innerhalb einer For-Schleife mit den Quadraten:

squares = []
for number in numbers:
    squares.append(number ** 2)

Einfacher aus­drü­cken lässt sich die Liste mit Qua­drat­zah­len als Com­pre­hen­si­on:

squares_comp = [number ** 2 for number in numbers]

Im Anschluss stellen wir mithilfe der Assert-Anweisung sicher, dass beide Methoden dasselbe Ergebnis liefern:

assert squares == squares_comp

Ein weiteres Beispiel: Wir möchten Klein­buch­sta­ben aus einem String ex­tra­hie­ren. Als Eingabe erzeugen wir eine Liste von Buch­sta­ben mit ge­misch­ter Groß- und Klein­schrei­bung:

word = list("PyThoN")

Der her­kömm­li­che Weg, die Klein­buch­sta­ben zu ex­tra­hie­ren, besteht darin, über den Buch­sta­ben zu iterieren. Wir testen jeden Buch­sta­ben mit der islower()-Funktion und fügen ihn bei positivem Resultat zu einer anfangs leeren Liste hinzu:

lowers = []
for letter in word:
    if letter.islower():
        lowers.append(letter)

Diese For-Schleife können wir uns in Python sparen. Wir benutzen statt­des­sen eine Com­pre­hen­si­on, die nur Klein­buch­sta­ben aus der ur­sprüng­li­chen Liste kopiert:

lowers_comp = [ letter for letter in word if letter.islower() ]

Wiederum über­prü­fen wir die Gleich­heit der beiden Methoden mittels Assert-Anweisung:

assert lowers == lowers_comp
Zum Hauptmenü