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?
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()
.
def to_infinity():
index=0
while 1:
yield index
index += 1
for i in to_infinity():
if i > 10:break
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.
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.
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.
while 1==1:
if want_to_break==yes:
break
else:
# whatever you want to loop to infinity
Cette boucle avec go indéfiniment.
Cela fonctionne pour toutes les versions de python:
m=1
for i in range(m):
#action here
m+=1
Simple et direct.
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.