Il est courant d'exprimer des boucles comme compréhensions de liste:remplaçant en boucle avec la compréhension de la liste
mylist=[]
for i in range(30):
mylist.append(i**2)
Cela équivaut à:
mylist = [i**2 for i in range(30)]
Y at-il sorte de mécanisme par lequel ce genre de l'itération pourrait être faite avec une boucle while?
mylist=[]
i=0
while i<30:
mylist.append(i**2)
i+=1
Bien sûr, avec cet exemple simple, il est facile de se traduire par une boucle for
puis à une compréhension de la liste, mais s'il est pas si facile?
par exemple.
mylist = [i**2 while i=0;i<30;i++ ]
(Bien sûr, le pseudo-code ci-dessus n'est pas python légitime) (itertools
vient à l'esprit pour ce genre de chose, mais je ne sais pas ce module terriblement bien.)
EDIT
un exemple (très simple) où je pense qu'une compréhension while serait utile serait:
dt=0.05
t=0
mytimes=[]
while t<maxtime:
mytimes.append(t)
t+=dt
Cela pourrait se traduire par:
dt=0.05
t=0
nsteps=maxtime/dt
mytimes=[]
for t in (i*dt for i in xrange(nsteps)):
mytimes.append(t)
qui peut être écrit sous la forme d'une liste (composé) Compréhension:
nsteps=maxtime/dt
mytimes=[t for t in (i*dt for i in xrange(nsteps)]
Mais, je dirais que la boucle while est BEAUCOUP plus facile à lire (et non avoir des erreurs d'index) Aussi, que se passe-t-il si votre objet (dt) supporte '+' mais pas '*'? Des exemples plus compliqués peuvent se produire si maxtime
change d'une manière ou d'une autre pour chaque itération de la boucle ...
« mais s'il est pas si facile? ": pouvez-vous donner un tel exemple?(qui n'est pas traduisible en une boucle for) – Pavel
Que faire si la limite supérieure de la boucle change dans la boucle? par exemple. Que se passe-t-il si c'est alors que i <30 * math.sqrt (i): ... ' – mgilson