Python 用列表理解替换while循环

Python 用列表理解替换while循环,python,while-loop,list-comprehension,Python,While Loop,List Comprehension,通常将for循环表示为列表理解: 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 (当然,上面的伪代码不是合法的python)(itertools想到了这类东西,但我对该模块不太

通常将for循环表示为列表理解:

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
(当然,上面的伪代码不是合法的python)(
itertools
想到了这类东西,但我对该模块不太了解。)

编辑

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

dt=0.05
t=0
mytimes=[]
while t<maxtime:
   mytimes.append(t)
   t+=dt
可以写为(复合)列表理解:

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

但是,我认为while循环更易于读取(并且没有索引错误),如果您的对象(dt)支持“+”而不是“*”,又会怎样呢?如果
maxtime
在循环的每次迭代中都会发生某种变化,则可能会出现更复杂的示例。

如果while循环只是检查一个正在递增的局部变量,则应将其转换为for循环或等效的列表

只有当可以而不是将循环表示为对某个对象进行迭代时,才应该使用while循环。典型用例的一个例子是检查调用本机代码的循环或低级循环的状态。因此,(正确使用)while循环很少,最好是直接写出来。一段时间的理解只会让他们更难阅读

如果你想返回多个值,你应该考虑写一个.< /p> 例如,您编辑的算法应写成(使用):

或者,使用发电机:

def calcTimes(maxtime):
  dt = 0.05
  t = 0
  while t < maxtime:
   yield t
   t += dt
def calcTimes(最大时间):
dt=0.05
t=0
当t
“但如果不是那么简单怎么办?”:你能举个例子吗?(无法转换为for循环的对象)如果循环中的上界在循环中发生变化怎么办?e、 g.如果whileⅡ不同意while循环只能在不可能直接迭代的情况下使用,那该怎么办。(我发布了一个例子,其中我认为使用
while
比使用等效的
for
循环更清楚。)@mgilson用一行代码和等效的生成器修改了答案。请注意,非整数
范围
是可以在中轻松实现的。我知道numpy.arange适用于这类事情——但是,如果您正在编写库,您不一定要强迫用户下载并安装numpy,这样您就可以做类似的事情。然而,你发布的生成器函数(我想)正是我想要的。谢谢
nsteps=maxtime/dt
mytimes=[t for t in (i*dt for i in xrange(nsteps)] 
mytimes = numpy.arange(0, maxtime, 0.05)
def calcTimes(maxtime):
  dt = 0.05
  t = 0
  while t < maxtime:
   yield t
   t += dt