[Python-de] Syntax-Erweiterung für Schleifen in Python3
Christian Tanzer
tanzer at swing.co.at
Sa Apr 9 06:54:51 EDT 2016
Stefan Schwarzer wrote at Sat, 9 Apr 2016 09:19:12 +0200:
> > - Bevor man über Syntax-Erweiterungen nachdenkt, sollte man
> > meines Erachtens erst mal schauen, ob man nicht eine
> > Möglichkeit findet, diese Schleifen-Sonderfälle mit einer
> > jetzt schon funktionierenden Python-API zu behandeln. Es
> > kann natürlich sein, dass das schwerfällig wird, aber ich
> > finde es besser, das auszuprobieren als es nur zu
> > vermuten. :-)
>
> Ich habe darüber nachgedacht, aber mir ist kein besserer
> Ansatz eingefallen wie in den schon geschriebenen Antworten.
>
> Ein Kontextmanager fällt aus, da bei einem `with`-Statement
> der Block nur einmal durchlaufen werden kann.
>
> Den Schleifenrumpf zu einer Funktion zu machen und in eine
> Higher-Order-Function hineinzureichen wird deutlich
> komplizierter als der schon beschriebene Ansatz mit Flag
> oder Sentinel.
>
> Fällt euch noch etwas ein?
Sicher. Generator-Funktionen sind das Mittel der Wahl, um sowas zu
abstrahieren.
Beispielsweise ::
def iter_with_setup(iterable, setup_fct):
it = iter(iterable)
first = next(it)
setup_fct(first)
yield first
for item in it:
yield item
In Python 3.3+ kann man die Schleife durch ein
yield from it
ersetzen::
Python 3.5.1 (default, Dec 30 2015, 11:41:55)
[GCC 4.9.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> def iter_with_setup(iterable, setup_fct):
... it = iter(iterable)
... first = next(it)
... setup_fct(first)
... yield first
... yield from it
...
>>> def setup_example(x) :
... print("setup_example called:", x)
...
>>> for x in iter_with_setup(range(3), setup_example):
... print(x)
...
setup_example called: 0
0
1
2
>>> for x in iter_with_setup(range(0), setup_example):
... print(x)
...
>>>
Viele Grüsse,
--
Christian Tanzer http://www.c-tanzer.at/
Mehr Informationen über die Mailingliste python-de