簡體   English   中英

用列表理解替換while循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM