Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.python > #4387

Re: [Python-de] Syntax-Erweiterung für Schleifen in Python3

From Christian Tanzer <tanzer@swing.co.at>
Newsgroups de.comp.lang.python
Subject Re: [Python-de] Syntax-Erweiterung für Schleifen in Python3
Date 2016-04-09 10:54 +0000
Message-ID <mailman.113.1460200687.2253.python-de@python.org> (permalink)
References <5708ACF0.3030708@sschwarzer.net> <E1aoqXT-0003qn-L8@swing.co.at>

Show all headers | View raw


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/

Back to de.comp.lang.python | Previous | Next | Find similar


Thread

Re: [Python-de]  Syntax-Erweiterung für Schleifen in Python3 Christian Tanzer <tanzer@swing.co.at> - 2016-04-09 10:54 +0000

csiph-web