[英]replacing while loop with 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
循環,然后轉換為列表理解,但如果不是那么容易呢?
例如
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循環更容易讀取(而不是有索引錯誤)另外,如果你的對象(DT)支持“+”而不是“*”? 如果maxtime
以某種方式改變循環的每次迭代,就會發生更復雜的例子......
如果你的while循環只是檢查一個正在遞增的局部變量,你應該將它轉換為for循環或等效列表理解。
只有當你不能將循環表示為迭代某些東西時,才應該使用while循環。 典型用例的一個示例是檢查事件的狀態,或調用本機代碼的低級循環。 因此(正確使用)while循環很少見,最好寫出來。 一段時間的理解只會讓他們更難閱讀。
如果您只想返回多個值,則應考慮編寫生成器 。
例如,您編輯的算法應該寫為(使用numpy.arange
):
mytimes = numpy.arange(0, maxtime, 0.05)
或者,使用發電機:
def calcTimes(maxtime):
dt = 0.05
t = 0
while t < maxtime:
yield t
t += dt
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.