2

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

もちろん、この単純な例では、forループに変換してからリスト内包表記に変換するのは簡単ですが、そう簡単ではない場合はどうでしょうか?

例えば

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

(もちろん、上記の疑似コードは正当な python ではありません) (itertoolsこの種のことについて思い浮かびますが、私はそのモジュールをひどくよく知りません。)

編集

while 内包表記が役立つと思われる (非常に単純な) 例は次のとおりです。

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 ループの方がはるかに読みやすい (インデックス エラーがない) と主張したいと思いますmaxtimeループの反復ごとに何らかの方法で変更すると、より複雑な例が発生する可能性があります...

4

1 に答える 1

9

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
于 2012-05-17T13:57:47.190 に答える