Faragiri

Python-Grundlagen lernen Python

Acht Wendungen gegen die Version, die man zuerst schreibt, dazu die deutsche Tausenderfalle im f-String und die Zuweisung in einer Bedingung.

4Abschnitte
3Min. Lesezeit
4Tiefe

Dieselben drei Zeilen, zweimal

Die Version, die läuft, und die Version, in der sich kein Fehler verstecken kann

Beide Spalten laufen und liefern dasselbe Ergebnis. Die rechte Spalte hat keinen Index, und genau dort liegt der Unterschied.

Aus einer anderen Sprache geschriebenIndizes, Zähler und eine Hilfsliste
In Python geschriebenEntpacken, und die Schleife nennt ihre eigene Form
Drei Felder lesenz[0], z[1], z[2]for code, bestand, preis in zeilen
Die Position haben wolleni = 0, dann i += 1enumerate(zeilen, start=1)
Zwei Listen paarenEine Schleife über range(len(codes))dict(zip(codes, preise))
In ein Dict filternEin leeres Dict und ein if in der Schleife{c: b for c, b, _ in zeilen if b}
Ein Debug-printprint("gesamt", gesamt)f"{gesamt=}"

Die rechte Seite ist markiert, weil es bei diesen fünf Zeilen eine richtige Antwort gibt. Das gilt nicht für jedes Paar in dieser Sprache, und eine Abbildung, die einen Gewinner markiert, bezieht Position.

Pythons Syntax ist klein, und ihre Wendungen sind es nicht, und die Lücke zwischen funktionierendem und flüssigem Python sind etwa acht davon. Eine Lagerliste einer Gärtnerei nehmen, drei Zeilen wie ('GK-14', 3, 2.40) und zwei weitere, und der Unterschied zeigt sich in jeder Zeile.

  • Im Schleifenkopf entpacken: for code, bestand, preis in zeilen statt z[0], z[1], z[2]
  • enumerate(zeilen, start=1), wenn die Position gebraucht wird, ergibt (1, 'GK-14') ohne Zähler
  • dict(zip(codes, preise)) baut {'GK-14': 2.40, 'GK-15': 1.80, 'GK-16': 0.95} in einer Zeile
  • erster, *rest = codes ergibt GK-14 und ['GK-15', 'GK-16']
  • codes[::-1] kehrt um, ohne das Original zu ändern
  • Eine Dict-Comprehension mit Filter: {c: b for c, b, _ in zeilen if b} lässt die leere Zeile weg

Zwei, die neuer sind als die meisten Tutorials

Ein f-String, der auf ein Gleichheitszeichen endet, druckt den Ausdruck zusammen mit seinem Wert: f"{gesamt=}" ergibt gesamt=515. Das ist ein Debug-print, der nicht vom Namen abweichen kann, den er meldet, und es kam mit Python 3.8. Beim Formatieren lauert eine Falle, die nur in diesem Land zuschlägt: f"{gesamt:,}" liefert US-Tausendertrennzeichen, nicht deutsche, aus 12450 wird 12,450 statt der erwarteten 12.450. Für eine Anzeige, die ein deutscher Leser sieht, gehört das Trennzeichen getauscht, etwa mit dem locale-Modul.

Der Walross-Operator weist innerhalb einer Bedingung zu, sodass der Wert einmal berechnet und behalten wird: wenn (komma := zeile.find(",")) != -1: dann zeile[:komma]. Ohne ihn läuft find zweimal, oder ein Name wird eine Zeile darüber gebunden und lebt länger, als er sollte. Er lohnt sich genau dort und nicht mehr, weshalb die Regel ist, ihn nur zu nutzen, wo die Alternative ein wiederholter Aufruf wäre.

Der Sortierschlüssel, der zwei Richtungen trägt

Nach zwei Dingen zu sortieren, von denen eines absteigend ist, braucht keine Vergleichsfunktion und keine zwei Durchläufe. Den numerischen Schlüssel negieren: sorted(zeilen, key=lambda z: (-z[1], z[0])) stellt den größten Bestand nach vorn und entscheidet Gleichstände alphabetisch, sodass GK-16 mit 7 vor GK-14 mit 3 steht. Das Tupel wird von links nach rechts verglichen, was die ganze Regel ist.

Dieser Trick funktioniert nur bei Zahlen. Für einen absteigenden Textschlüssel ist die Antwort zweimal in entgegengesetzter Reihenfolge zu sortieren, verlassen auf Stabilität, oder locale.strxfrm, denn Ä sortiert sonst hinter Z statt neben A, wenn locale fehlt.

Was man 2026 einsetzt

Ruff übernimmt das meiste davon mechanisch, kostenlos und quelloffen, und ist 2026 der Standardprüfer in Python-Projekten. Seine Regeln benennen die Schleife, die eine Comprehension hätte sein sollen, das range(len(x)), das enumerate hätte sein sollen, und den manuellen Index, der Entpacken hätte sein sollen. Es hat das Erlernen dieser Wendungen einzeln aus Code-Reviews abgelöst, was funktioniert und etwa zwei Jahre dauert.

Python 3.14 ist die Version, auf der man sein sollte, kostenlos, und ihre Fehlermeldungen sind der praktische Grund, nicht irgendeine Geschwindigkeitsbehauptung. Es hat Python 3.13 abgelöst, und für die Wendungen oben zählt die Version 3.8, für das Gleichheitszeichen im f-String und den Walross-Operator, was alt genug ist, dass alles, was noch ohne sie läuft, eher eine zu benennende Einschränkung ist als eine Vorliebe.

Wo die meisten stecken bleiben

Der Stolperstein ist, aus einer anderen Sprache anzukommen und diese Sprache in Python zu schreiben, was einwandfrei läuft und im Review unpythonisch genannt wird, ohne dass jemand die Kosten erklärt. Die Kosten sind real: for i in range(len(zeilen)) gefolgt von zeilen[i][0] ist auf jeder Zeile eine dreifache Chance, sich beim Index zu vertun, und die entpackte Version hat keine.

Die Prüfung, die die zwei Jahre verkürzt: taucht ein Index zweimal in einer Zeile auf, gibt es dafür eine Wendung. Wird eine Hilfsliste nur gebaut, um darüber zu iterieren, gibt es eine Comprehension oder einen Generator dafür. Welche Module bereits das meiste enthalten, was als Nächstes geschrieben würde, steht bei Der Standardbibliothek, und wie Pakete und Umgebungen getrennt bleiben, klärt Pakete und Umgebungen.

Daneben

Darüber