Path: csiph.com!2.eu.feeder.erje.net!feeder.erje.net!1.eu.feeder.erje.net!newsfeed0.kamp.net!newsfeed.kamp.net!fu-berlin.de!uni-berlin.de!not-for-mail From: Christian Tanzer Newsgroups: de.comp.lang.python Subject: Re: [Python-de] =?utf-8?q?Syntax-Erweiterung_f=C3=BCr_Schleifen_in_P?= =?utf-8?q?ython3?= Date: Sat, 09 Apr 2016 10:54:51 -0000 Lines: 71 Message-ID: References: <5708ACF0.3030708@sschwarzer.net> Reply-To: Christian Tanzer Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: news.uni-berlin.de VKTz359DKbJntfS+RFoY1g0AJXQCpKl+Q3FXwOewVG3w== Return-Path: X-Original-To: python-de@python.org Delivered-To: python-de@mail.python.org X-Mailer: PMA 0.8.0 In-reply-to: Your message of "Sat, 9 Apr 2016 09:19:12 +0200" <5708ACF0.3030708@sschwarzer.net> X-Spambayes-Classification: ham; 0.00 Resent-From: Christian Tanzer Resent-To: python-de@python.org Resent-Content-Type: text/plain; charset=utf-8 Resent-date: Sat, 09 Apr 2016 10:56:04 -0000 Resent-message-id: <146019936455.14903.10247271703753298197@tr.swing.cluster> X-BeenThere: python-de@python.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: Die Deutsche Python Mailingliste List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Mailman-Original-Message-ID: X-Mailman-Original-References: <5708ACF0.3030708@sschwarzer.net> X-Original-Content-Transfer-Encoding: 8bit Xref: csiph.com de.comp.lang.python:4387 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/