97 votes

Boucle de 1 à l'infini en Python

En C, je ferais ça :

int i;
for (i = 0;; i++)
  if (thereIsAReasonToBreak(i))
    break;

Comment puis-je réaliser quelque chose de similaire en Python ?

5 votes

Je ne suis pas un expert en python mais while (true): if reasonneeded(i) break i = i+1 Ça devrait marcher ?

4 votes

Duplicata possible de python unbounded xrange()

0 votes

En C, cela provoquerait un débordement et n'irait pas jusqu'à "l'infini".

2voto

paxdiablo Points 341644

Si vous faites cela en C, alors votre jugement est aussi obscur qu'il le serait en Python :-)

Pour une boucle qui se termine sur une simple vérification de condition au début de chaque itération, il est plus habituel (et plus clair, à mon avis) de faire cela dans la construction de la boucle elle-même. En d'autres termes, quelque chose comme (si vous avez besoin de i après la fin de la boucle) :

int i = 0;
while (! thereIsAReasonToBreak(i)) {
    // do something
    i++;
}

ou (si i peut avoir une portée sur juste la boucle) :

for (int i = 0; ! thereIsAReasonToBreak(i); ++i) {
    // do something
}

Cela se traduirait par l'équivalent en Python :

i = 0
while not there_is_a_reason_to_break(i):
    # do something
    i += 1

Seulement si vous devez sortir dans le moyen de la boucle quelque part (ou si votre condition est suffisamment complexe pour rendre votre déclaration de boucle beaucoup moins lisible), vous devez vous inquiéter de la rupture.

Lorsque votre sortie potentielle est une simple sortie à la commencer de la boucle (comme cela semble être le cas ici), il est généralement préférable de coder la sortie dans la boucle elle-même.

1voto

user1146450 Points 2429
def infinity():
    i=0
    while True:
        i+=1
        yield i

for i in infinity():
    if there_is_a_reason_to_break(i):
        break

1 votes

Merci, c'est ce que je cherchais. C'est l'approche la plus propre et la plus agréable, je pense.

0 votes

Oui, très propre, je n'avais pas encore tout à fait compris le pouvoir du yield autre que pour les générateurs de séquence paresseux, mais un ami l'a récemment utilisé pour fournir une pushd/popd sans avoir à maintenir une pile explicite. C'était très astucieux.

0 votes

Bien que j'aime l'approche, l'infini est maintenant une gamme. Le zéro ne fait pas partie de l'infini si vous voulez mon avis. Oh, et c'est une version mal reformulée de cette réponse .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X