[Python-de] Erweiterte "For"-Schleife

Sebastian Wiesner lunaryorn at googlemail.com
Fr Mai 11 14:31:22 CEST 2012


Am 11. Mai 2012 12:38 schrieb Thomas Rachel
<nutznetz-0c1b6768-bfa9-48d5-a470-7603bd3aa915 at spamschutz.glglgl.de>:
> Am 11.05.2012 11:37 schrieb Stefan Behnel:
>
>> Hartmut Goebel, 09.05.2012 16:21:
>>>
>>> Am 09.05.2012 14:23, schrieb Olе Streicher:
>>>>
>>>> for item in myoldlist if bar(item):
>>>>     mynewlist.append(foo(item))
>>>>
>>>> (Schon klar: weil es die Syntax nicht zulässt. Aber warum wurde das so
>>>> designed?)
>>>
>>> Weil's unverständlich ist?!
>>>
>>> Bezieht sich das `if` auf die For-Schleife, oder auf `myoldlist`?
>>> Unnötig kompliziert, nur um ein paar Zeichen zu sparen.
>>
>>
>> Ja, das ist auch das Hauptargument, wenn dieser Vorschlag mit einiger
>> Regelmäßigkeit auf den Python-Mailinglisten auftaucht.
>
>
> Kann ich nicht nachvollziehen. Ich nehme an, daß das Ganze auf a if b else c
> abzielt.

In Comprehensions und Generatorausdrücken kann man auf ein eigenes
"if" nicht verzichten. Beides sind grammatikalisch Ausdrücke (aka
expressions). Ausdrücke können keine Anweisungen (aka "statements")
enthalten. Mithin kann man in solchen Ausdrücken kein „normales“ "if"
nutzen, um bestimmte Elemente zu überspringen. Eine eigene
grammatikalische Regel für Bedingungen in Comprehensions und
Generatorausdrücken ist mithin unabdingbar.

Eine "for"-Anweisung allerdings erwartet als nächstes Token einen
Block, in welchem wiederum weitere Anweisungen stehen können. Mithin
kann man an dieser Stelle eine normale "if"-Anweisung nutzen, um
Elemente zu überspringen. Es bedarf keiner weiteren zusätzlichen
Regel, welche die Grammatik verkomplizieren würde und das Prinzip des
Zen, dass es einen offensichtlichen Weg geben soll, verletzen würde.

Es spricht ja im Übrigen auch nichts dagegen, "for"-Schleifen mit
Generatorausdrücken zu kombinieren, i.e.

headers = (n for n in node.childNodes if n.localName == 'header')
for node in header:
   # …

Ich persönlich finde das ohnehin eleganter, da man so reine
Datenverarbeitung ohne Seiteneffekte von potentiell
seiteneffektbehafteten Anweisungen trennt, also einen „funktionaleren“
Programmierstil verwendet. Generell würde ich "for"-Schleifen falls
möglich nur für Seiteneffekte wie beispielsweise die Ausgabe von Daten
nutzen, und ansonsten eher Iteratoren, Generatoren und Funktionen,
allgemein implizite Iteration, nutzen, um Daten zu verarbeiten und zu
filtern.


Mehr Informationen über die Mailingliste python-de