J'ai besoin d'émuler une boucle do-while dans un programme Python. Malheureusement, le code simple suivant ne fonctionne pas:
list_of_ints = [ 1, 2, 3 ]
iterator = list_of_ints.__iter__()
element = None
while True:
if element:
print element
try:
element = iterator.next()
except StopIteration:
break
print "done"
Au lieu de "1,2,3, terminé", il imprime la sortie suivante:
[stdout:]1
[stdout:]2
[stdout:]3
None['Traceback (most recent call last):
', ' File "test_python.py", line 8, in <module>
s = i.next()
', 'StopIteration
']
Que puis-je faire pour intercepter l'exception «stop itération» et rompre correctement une boucle while?
Un exemple de la raison pour laquelle une telle chose peut être nécessaire est illustré ci-dessous sous le nom de pseudocode.
État machine:
s = ""
while True :
if state is STATE_CODE :
if "//" in s :
tokens.add( TOKEN_COMMENT, s.split( "//" )[1] )
state = STATE_COMMENT
else :
tokens.add( TOKEN_CODE, s )
if state is STATE_COMMENT :
if "//" in s :
tokens.append( TOKEN_COMMENT, s.split( "//" )[1] )
else
state = STATE_CODE
# Re-evaluate same line
continue
try :
s = i.next()
except StopIteration :
break
python
while-loop
do-while
grigoryvp
la source
la source
s=i.next()
plutôt que Aucun et éventuellement effectuer un travail initial plutôt que de simplement rendre votre premier passage dans la boucle inutile.Réponses:
Je ne sais pas trop ce que vous essayez de faire. Vous pouvez implémenter une boucle do-while comme ceci:
Ou:
Que faites-vous en essayant d'utiliser une boucle do while pour imprimer le contenu de la liste? Pourquoi ne pas simplement utiliser:
Mise à jour:
Avez-vous une liste de lignes? Et vous voulez continuer à le parcourir? Que diriez-vous:
Cela semble-t-il quelque chose de proche de ce que vous voudriez? Avec votre exemple de code, ce serait:
la source
Voici un moyen très simple d'émuler une boucle do-while:
Les principales caractéristiques d'une boucle do-while sont que le corps de la boucle s'exécute toujours au moins une fois et que la condition est évaluée au bas du corps de la boucle. La structure de contrôle montrée ici accomplit ces deux opérations sans avoir besoin d'exceptions ou d'instructions break. Il introduit une variable booléenne supplémentaire.
la source
break
. Plus précisément, s'il y a une logique nécessaire APRÈStest_loop_condition()
, qui ne doit pas être exécutée une fois que nous avons terminé, elle doit être enveloppéeif condition:
. BTW,condition
est vague. Plus descriptif:more
ounotDone
.break
dans les boucles et quand je le rencontre dans du code que je maintiens, je trouve que la boucle, le plus souvent, aurait pu être écrite sans elle. La solution présentée est, IMO, la manière la plus claire de représenter une construction do while en python.has_no_errors
ouend_reached
(auquel cas la boucle commenceraitwhile not end_reached
Mon code ci-dessous pourrait être une implémentation utile, soulignant la principale différence entre faire pendant contre tandis que si je comprends bien.
Donc, dans ce cas, vous parcourez toujours la boucle au moins une fois.
la source
while condition or first_pass:
. Puiscondition
est toujours évalué en premier et globalementfirst_pass
n'est évalué que deux fois (première et dernière itération). N'oubliez pas d'initialisercondition
avant la boucle ce que vous voulez.L'exception rompra la boucle, vous pourriez donc aussi bien la gérer en dehors de la boucle.
Je suppose que le problème avec votre code est que le comportement de l'
break
intérieurexcept
n'est pas défini.break
Ne monte généralement que d'un niveau, donc par exemple, l'break
intérieurtry
va directementfinally
(s'il existe) à unetry
sortie de la boucle, mais pas à une sortie de boucle.PEP connexe: http://www.python.org/dev/peps/pep-3136
Question connexe: rupture des boucles imbriquées
la source
->
Vous pouvez faire une fonction:
Mais 1) c'est moche. 2) La condition devrait être une fonction avec un paramètre, censée être remplie par des trucs (c'est la seule raison de ne pas utiliser la boucle while classique.)
la source
while True: stuff(); if not condition(): break
est une très bonne idée. Je vous remercie!Voici une solution plus folle d'un modèle différent - en utilisant des coroutines. Le code est toujours très similaire, mais avec une différence importante; il n'y a aucune condition de sortie! La coroutine (chaîne de coroutines vraiment) s'arrête juste lorsque vous arrêtez de la nourrir avec des données.
Le code ci-dessus recueille tous les jetons sous forme de tuples dans
tokens
et je suppose qu'il n'y a aucune différence entre.append()
et.add()
dans le code d'origine.la source
La façon dont je l'ai fait est la suivante ...
Cela me semble être la solution simpliste, je suis surpris de ne pas l'avoir déjà vu ici. Cela peut évidemment aussi être inversé pour
etc.
la source
pour une boucle do - while contenant des instructions try
alternativement, quand il n'y a pas besoin de la clause «enfin»
la source
la source
stuff
d'être une fonction ou de répéter le corps du code.while condition:
parce queis True
c'est implicite.condition
dépend d'une variable interne destuff()
, car cette variable n'est pas définie à ce moment.Piratage rapide:
Utilisez comme ça:
la source
Pourquoi ne fais-tu pas
?
la source
Voyez si cela aide:
Définissez un indicateur à l'intérieur du gestionnaire d'exceptions et vérifiez-le avant de travailler sur le s.
la source
while not flagBreak:
et en supprimant leif (flagBreak) : break
.flag
- Je ne peux pas déduire ce que signifient une valeur vraie ou une valeur fausse. Utilisez plutôtdone
ouendOfIteration
. Le code se transforme enwhile not done: ...
.Si vous êtes dans un scénario où vous effectuez une boucle alors qu'une ressource est indisponible ou quelque chose de similaire qui lève une exception, vous pouvez utiliser quelque chose comme
la source
Pour moi, une boucle while typique sera quelque chose comme ceci:
Je pourrais également inclure un for..loop dans la boucle while, si la situation le justifie, pour parcourir une autre série de conditions.
la source