用列表理解替换while循环

时间:2012-05-17 13:51:22

标签: python while-loop list-comprehension

将循环表达为列表推导是很常见的:

mylist=[]
for i in range(30):
    mylist.append(i**2)

这相当于:

mylist = [i**2 for i in range(30)]

是否有任何一种机制可以通过while循环完成这种迭代?

mylist=[]
i=0
while i<30:
    mylist.append(i**2)
    i+=1

当然,通过这个简单的例子,很容易转换为for循环,然后转换为列表理解,但如果它不那么容易怎么办?

e.g。

mylist = [i**2 while i=0;i<30;i++ ]

(当然上面的伪代码不是合法的python)(itertools会想到这种事情,但我不太清楚这个模块。)

修改

一个(非常简单的)例子,我认为一段时间的理解是有用的:

dt=0.05
t=0
mytimes=[]
while t<maxtime:
   mytimes.append(t)
   t+=dt

这可以转化为:

dt=0.05
t=0
nsteps=maxtime/dt
mytimes=[]
for t in (i*dt for i in xrange(nsteps)):
    mytimes.append(t)

可以写成(复合)列表理解:

nsteps=maxtime/dt
mytimes=[t for t in (i*dt for i in xrange(nsteps)] 

但是,我认为while循环 MUCH 更容易阅读(并且没有索引错误)另外,如果你的对象(dt)支持'+'但不支持'*'怎么办?如果maxtime以某种方式改变循环的每次迭代,就会发生更复杂的例子......

1 个答案:

答案 0 :(得分:9)

如果你的while循环只检查一个正在递增的局部变量,你应该将它转换为for循环或等效的列表理解。

只有当将循环表示为迭代某些内容时,才应使用while循环。典型用例的一个示例是检查Event的状态,或调用本机代码的低级循环。因此(正确使用)while循环很少见,最好写出来。 虽然理解会让他们更难阅读。

如果您只想返回多个值,则应考虑编写generator

例如,您编辑的算法应编写为(使用numpy.arange):

mytimes = numpy.arange(0, maxtime, 0.05)

或者,使用生成器:

def calcTimes(maxtime):
  dt = 0.05
  t = 0
  while t < maxtime:
   yield t
   t += dt