kleine Code-Redundanz innerhalb while-Schleifen (nicht sauber fühlen)
-
05-10-2019 - |
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ß?
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!