[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