Boucle de 1 à l'infini en Python

En C, je ferais ceci:

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

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

44
demandé sur teh_senaus 2012-03-27 10:12:15

9 réponses

À l'Aide de itertools.count:

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

En Python2 xrange() est limité à sys.maxint, ce qui peut suffire à la plupart des fins pratiques:

import sys
for i in xrange(sys.maxint):
    if there_is_a_reason_to_break(i):
        break

En Python3, range() peut aller beaucoup plus haut, 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 probablement préférable d'utiliser count().

84
répondu John La Rooy 2017-04-19 08:01:51
def to_infinity():
    index=0
    while 1:
        yield index
        index += 1

for i in to_infinity():
    if i > 10:break
11
répondu spicavigo 2012-03-27 06:17:08

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 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 c for" bien comportée": 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 comportées", telles que la modification de i dans le corps de la boucle. Il est possible d'imiter ceux-ci aussi en utilisant takewhile, si le générateur est une fermeture sur une variable locale i que vous manipulez ensuite. D'une manière, définir cette fermeture rend particulièrement évident que vous faites quelque chose de potentiellement confus avec votre structure de contrôle.

5
répondu Steve Jessop 2012-03-27 11:01:41

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, Modifieri n'affectera pas le flux de la boucle comme il le ferait en C. Par conséquent, l'utilisation d'une boucle while est en fait un choix plus approprié pour porter ce code C en Python.

3
répondu wim 2017-04-30 21:31:43

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

La meilleure façon de C serait:

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

Ou:

int i;  // *may* be better inside the for statement to localise scope
for (i = 0; ! thereIsAReasonToBreak (i); i++) {
    // do something
}

Cela se traduirait par le Python:

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

Seulement si vous avez besoin de sortir dans le Milieu de la boucle quelque part auriez-vous besoin de vous inquiéter de la rupture. Si votre potentiel de sortie est au début de la boucle (comme cela semble être ici), il est généralement préférable d'encoder la sortie dans la boucle elle-même.

2
répondu paxdiablo 2012-03-27 06:30:15
a = 1
while a:
    if a == Thereisareasontobreak(a):
        break
    a += 1
0
répondu fraxel 2012-03-27 06:16:38
while 1==1:  
    if want_to_break==yes:  
       break  
    else:
       # whatever you want to loop to infinity  

Cette boucle avec go indéfiniment.

-1
répondu laurie 2017-07-26 14:33:50

Cela fonctionne pour toutes les versions de python:

m=1    
for i in range(m):
        #action here
        m+=1

Simple et direct.

-2
répondu Questionare232 2017-10-02 01:11:11

Vous pouvez également faire de la manière suivante:

list=[0] for x in list:
    list.append(x+1)
    print x

Cela donnera un for loop infini.

-2
répondu Dhruv Sethi 2017-10-16 07:27:23