私は持っている
for i in xrange(repeat):
#does my stuff
time.sleep(10)
しかし、それが最後の実行である場合、私はそれをスリープ状態にしたくありません。つまり、これ以上繰り返しがない場合は、眠らないでください
これを優雅に処理するにはどうすればよいですか?
私は持っている
for i in xrange(repeat):
#does my stuff
time.sleep(10)
しかし、それが最後の実行である場合、私はそれをスリープ状態にしたくありません。つまり、これ以上繰り返しがない場合は、眠らないでください
これを優雅に処理するにはどうすればよいですか?
case of 1x repetition: doStuff
case of 2x repetition: doStuff, sleep, doStuff
case of 3x repetition: doStuff, sleep, doStuff, sleep, doStuff
...
あなたが望んでいるように見えるのは、たくさんのことをしてから、それぞれの間に寝ることです。
さらに、遅延はタスクの性質とは無関係です。
解決策 1 -- 最後でない場合はスリープする
最も簡単な方法は、for ループを特殊なケースにすることです。
for i in range(numTimesToRepeat):
if i>0:
time.sleep(lengthToSleep)
doStuff()
次のこともできますが、 を繰り返すため、あまりエレガントではありませんdoStuff()
。
doStuff()
for i in range(numTimesToRepeat-1):
time.sleep(lengthToSleep)
doStuff()
解決策 2 -- ブレーク付き while ループ
これらの問題を解決する最も簡単な方法の 1 つは、while ループから抜け出すことです。それは汚く、やや非機能的なプログラミングですが、人間が問題を自然に考える方法はまさに次のとおりです。
numTimesToRepeat = ...
while True:
doStuff() # we did stuff
numTimesToRepeat -= 1 # repeat one less time because we just did it
if numTimesToRepeat==0: # do we repeat again?
break # no -> done!
else:
time.sleep(lengthToSleep) # yes -> sleep before repeating
ループは煩わしいものですが、プログラミング エラーが発生すると、プログラムは無限ループになります。
解決策 3 -- 最後かどうかを検出する
上記のメソッドは、ループの最初の繰り返しでない場合に何かを行います。ただし、「ループの最後の反復を検出する」ことは、問題にアプローチしようとした方法です。もう少し面倒ですが、次のように行うことができます: https://stackoverflow.com/a/6090673/711085そして、次のように使用します:
for i,task,isLast in enumerateLast(tasks):
task()
if not isLast:
time.sleep(lengthToSleep)
あまり洗練されていないのは、リストを逆にして実行することですenumerate()
:
for untilLast,task in reversed(enumerate(reversed(tasks))):
task()
if untilLast>0:
time.sleep(lengthToSleep)
(非常に小さな無関係な細目:reversed(enumerate(reversed(iterable)))
タスクがジェネレーターである場合、実行するすべてのタスクを生成し、それらを逆の順序で列挙してから実行することに注意してください:これにより遅延が発生する可能性があり、また、無限タスクジェネレーター)
タスクの抽象化
どちらの方法でも、コールバックを作成してタスクを持つという概念を抽象化し、それぞれの間に遅延を挿入したい場合があります''.join
。
def callAndWaitBetween(tasks):
for ..task.. in enumerate?(tasks):
#... some solution to this problem...
task()
参考までに、遅延がタスクに依存する場合、タスクは待機時間を返す必要があります。
あなたがするのが寝ているだけなら、あなたはすることができます
for i in range(repeat)[:-1]:
time.sleep(10)
ただし、実際に何らかのアクションを実行する必要がある場合は、次のようにします。
sleep = [lambda: time.sleep(20) for i in range(repeat)[:-1]] + [lambda: None]
for i in xrange(repeat):
# do stuff
sleep.pop(0)()
本当に多くの反復がある場合itertools
は、のリストの代わりにジェネレーターを作成するために使用しますsleep
。
これを試して:
for i in xrange(repeat):
if i<repeat:
time.sleep(10)
whileループが機能する可能性があります
while repeat > 0:
#do stuff
if repeat > 1:
time.sleep(10)
repeat -= 1
xrangeを使用する代わりに、repeatをループが繰り返される回数に直接設定するだけです。