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 ?
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 ?
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()
.
Cela fonctionne aussi très bien avec takewhile
: for x in takewhile(thereIsAReasonToContinue, count()):
Pour moi, for i in range(sys.maxint)
les pauses avec un MemoryError
. Vous avez également mentionné xrange()
qui fonctionne.
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.
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
...
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 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.
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".
1 votes
Le titre de cette question ne devrait-il pas être changé en "Bouclage de 0 à l'infini en Python" ? Vous essayez simplement d'avoir une boucle "infinie".
range
", ce qui vous permet d'éviterwhile True: i += 1