Frage

Also, in Python (obwohl ich denke, es kann auf viele Sprachen angewendet werden), finde ich mich mit so etwas wie dies sehr oft:

the_input = raw_input("what to print?\n")
while the_input != "quit":
    print the_input
    the_input = raw_input("what to print?\n")

Vielleicht zu wählerisch bin ich, aber ich mag sie nicht, wie die Linie the_input = raw_input("what to print?\n") wiederholt bekommen hat. Es verringert die Wartbarkeit und Organisation. Aber ich sehe keine Abhilfen für den doppelten Code zu vermeiden, ohne das Problem weiter verschlimmert. In einigen Sprachen, konnte ich so etwas schreiben:

while ((the_input=raw_input("what to print?\n")) != "quit") {
    print the_input
}

Dies ist definitiv nicht Pythonic und Python nicht einmal für die Zuordnung erlaubt innerhalb Schleifenbedingung AFAIK.

Diese gültigen Code behebt die Redundanz,

while 1:
    the_input = raw_input("what to print?\n")
    if the_input == "quit":
        break
    print the_input

Aber fühlen Sie entweder nicht ganz. Die while 1 impliziert, dass diese Schleife immer laufen wird; Ich verwende eine Schleife, aber ihm einen gefälschten Zustand und setze die realen Inneres zu geben.

Das bin ich zu wählerisch? Gibt es einen besseren Weg, dies zu tun? Vielleicht gibt es einige Sprachkonstrukte dafür ausgelegt, dass ich nicht weiß?

War es hilfreich?

Lösung

Denken Iteratoren - zum Beispiel in diesem speziellen Fall:

for the_input in iter(lambda: raw_input('what to print?\n'), 'quit'):
    print the_input

Die meisten Schleifen in Python, mit Ausnahme der untersten Abstraktionsebenen, am besten als for Schleifen mit Hilfe der implementierten Iterator einige Untergebene, die die „Looping Logik“ erfasst - die iter Einbau-Dose Hilfe (wie hier) , manchmal genexps (Generator Ausdrücke) kann, manchmal der Standard-Bibliotheksmodul itertools zur Rettung kommt.

Am häufigsten werden Sie Code benutzerdefinierte wählen Generatorfunktionen (diejenigen mit yield) oder mehr gelegentlich (wenn Sie wirklich brauchen, anspruchsvolle Statusverwaltung) eine benutzerdefinierte Iterator-Klasse ( man die __iter__ spezielle Methode als return self definiert und next [[oder __next__ in den neuesten Versionen von Python]] „, um den nächsten Wert aus der Iteration zurück).

Capturing the looping Logik abgesehen von was auch immer es ist, dass Sie tun auf die verschiedenen Elemente der Reihe nach durch die Schleife erzeugt selbst ist der Schlüssel Abstraktion-Helfer hier!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top