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".

171voto

gnibbler Points 103484

Utilisation de itertools.count :

import itertools
for i in itertools.count(start=1):
    if there_is_a_reason_to_break(i):
        break

Dans Python 2, range() et xrange() étaient limitées à sys.maxsize . Dans Python 3 range() peut aller beaucoup plus loin, mais pas à l'infini :

import sys
for i in range(sys.maxsize**10):  # you could go even higher if you really want
    if there_is_a_reason_to_break(i):
        break

Il est donc préférable d'utiliser count() .

10 votes

Cela fonctionne aussi très bien avec takewhile : for x in takewhile(thereIsAReasonToContinue, count()):

0 votes

Pour moi, for i in range(sys.maxint) les pauses avec un MemoryError . Vous avez également mentionné xrange() qui fonctionne.

3 votes

@scai, en Python3 range remplace la méthode de Python2 xrange . Dans Python2 range crée et renvoie une liste réelle d'ints. Vous n'aurez pas assez de RAM pour une si grande liste.

26voto

spicavigo Points 3858
def to_infinity():
    index = 0
    while True:
        yield index
        index += 1

for i in to_infinity():
    if i > 10:
        break

16voto

wim Points 35274

Le plus simple et le meilleur :

i = 0
while not there_is_reason_to_break(i):
    # some code here
    i += 1

Il peut être tentant de choisir l'analogie la plus proche du code C possible en Python :

from itertools import count

for i in count():
    if thereIsAReasonToBreak(i):
        break

Mais attention, modification de i n'affectera pas le flux de la boucle comme il le ferait en C. Par conséquent, l'utilisation d'une while loop est en fait un choix plus approprié pour le portage de ce code C vers Python.

6voto

Jayjayyy Points 573

Si vous voulez utiliser un for boucle, il est possible de combiner des fonctions intégrées iter (voir aussi cette réponse ) et enumerate pour un nombre infini for qui a un compteur. Nous utilisons iter pour créer un itérateur infini et enumerate fournit la variable de la boucle de comptage. La valeur de départ est zéro par défaut, mais vous pouvez définir une valeur de départ différente avec l'attribut start argument.

for i, _ in enumerate(iter(bool, True), start=1):
    input(i)

Qui imprime :

1
2
3
4
5
...

5voto

Steve Jessop Points 166970

Réitérant le commentaire de thg435 :

from itertools import takewhile, count

def thereIsAReasonToContinue(i):
    return not thereIsAReasonToBreak(i)

for i in takewhile(thereIsAReasonToContinue, count()):
    pass # or something else

Ou peut-être de manière plus concise :

from itertools import takewhile, count

for i in takewhile(lambda x : not thereIsAReasonToBreak(x), count()):
    pass # or something else

takewhile imite une boucle for C "bien conduite" : vous avez une condition de continuation, mais vous avez un générateur au lieu d'une expression arbitraire. Il y a des choses que vous pouvez faire dans une boucle C for qui sont "mal conduites", comme modifier i dans le corps de la boucle. Il est possible de les imiter également en utilisant takewhile si le générateur est une fermeture sur une variable locale. i que vous pouvez ensuite manipuler. D'une certaine manière, définir cette fermeture rend particulièrement évident le fait que vous faites quelque chose de potentiellement déroutant avec votre structure de contrôle.

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