mgi*_*son 2 python list-comprehension while-loop
将循环表达为列表推导是很常见的:
mylist=[]
for i in range(30):
mylist.append(i**2)
Run Code Online (Sandbox Code Playgroud)
这相当于:
mylist = [i**2 for i in range(30)]
Run Code Online (Sandbox Code Playgroud)
是否有任何一种机制可以通过while循环完成这种迭代?
mylist=[]
i=0
while i<30:
mylist.append(i**2)
i+=1
Run Code Online (Sandbox Code Playgroud)
当然,通过这个简单的例子,很容易转换为for
循环,然后转换为列表理解,但是如果它不那么容易呢?
例如
mylist = [i**2 while i=0;i<30;i++ ]
Run Code Online (Sandbox Code Playgroud)
(当然上面的伪代码不是合法的python)(itertools
想到这种事情,但我不太清楚这个模块.)
编辑
一个(非常简单)的例子,我认为一段时间的理解是有用的将是:
dt=0.05
t=0
mytimes=[]
while t<maxtime:
mytimes.append(t)
t+=dt
Run Code Online (Sandbox Code Playgroud)
这可以转化为:
dt=0.05
t=0
nsteps=maxtime/dt
mytimes=[]
for t in (i*dt for i in xrange(nsteps)):
mytimes.append(t)
Run Code Online (Sandbox Code Playgroud)
可以写成(复合)列表理解:
nsteps=maxtime/dt
mytimes=[t for t in (i*dt for i in xrange(nsteps)]
Run Code Online (Sandbox Code Playgroud)
但是,我认为,while循环是MUCH更容易阅读(而不是有索引错误)另外,如果你的对象(DT)支持"+"而不是"*"?如果maxtime
循环的每次迭代以某种方式改变,可能会发生更复杂的例子......
如果你的while循环只是检查一个正在递增的局部变量,你应该将它转换为for循环或等效列表理解.
只有当你不能将循环表示为迭代某些东西时,才应该使用while循环.典型用例的一个示例是检查事件的状态,或调用本机代码的低级循环.因此(正确使用)while循环很少见,最好写出来.一个同时理解只想让他们难以阅读.
如果您只想返回多个值,则应考虑编写生成器.
例如,您编辑的算法应该写为(使用numpy.arange
):
mytimes = numpy.arange(0, maxtime, 0.05)
Run Code Online (Sandbox Code Playgroud)
或者,使用发电机:
def calcTimes(maxtime):
dt = 0.05
t = 0
while t < maxtime:
yield t
t += dt
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5788 次 |
最近记录: |