Question

Alors, en Python (bien que je pense qu'il peut être appliqué à de nombreuses langues), je me retrouve avec quelque chose comme ça assez souvent:

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

Peut-être que je suis trop pointilleux, mais je ne aime pas comment la the_input = raw_input("what to print?\n") ligne doit se répéter. Elle diminue la maintenabilité et de l'organisation. Mais je ne vois pas de solutions de contournement pour éviter le code en double sans aggravation du problème. Dans certaines langues, je pourrais écrire quelque chose comme ceci:

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

Ceci est certainement pas Pythonic et Python ne permet même pas d'une affectation dans des conditions de boucle AFAIK.

Ce code fixe valide la redondance,

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

Mais ne se sent pas tout à fait raison non plus. Le while 1 implique que cette boucle se déroulera à jamais; J'utilise une boucle, mais en lui donnant une condition de faux et de mettre le vrai à l'intérieur.

Suis-je trop pointilleux? Y a-t-il une meilleure manière de faire cela? Peut-être il y a une construction linguistique conçu pour cela que je ne connais pas?

Était-ce utile?

La solution

Pensez itérateurs - par exemple, dans ce cas spécifique:

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

La plupart des boucles en Python, sauf aux très bas niveaux d'abstraction, sont mieux mis en œuvre sous forme de boucles de for avec l'aide de certains iterator sous-fifre qui capture la « logique en boucle » - le iter intégré aide peut (comme ici) , genexps parfois (expressions du générateur) peut, parfois le module bibliothèque standard itertools vient à la rescousse.

Le plus souvent, vous choisissez de code personnalisé Fonctions générateur (ceux qui utilisent yield), ou plus de temps en temps (lorsque vous avez besoin vraiment sophistiqué de gestion de l'Etat) une commande iterator classe ( une définition de la méthode particulière de __iter__ comme return self et next [[ou __next__ dans les dernières versions de python]] pour revenir « la valeur suivante à partir de l'itération).

Capture la logique en boucle à part quoi que ce soit que vous faire sur les différents éléments de manière séquentielle produits par la boucle elle-même est l'abstraction auxiliaire clé ici!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top