3

私は持っている

for i in xrange(repeat):
  #does my stuff
  time.sleep(10)

しかし、それが最後の実行である場合、私はそれをスリープ状態にしたくありません。つまり、これ以上繰り返しがない場合は、眠らないでください

これを優雅に処理するにはどうすればよいですか?

4

4 に答える 4

5
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()

参考までに、遅延がタスクに依存する場合、タスクは待機時間を返す必要があります。

于 2012-08-22T21:54:21.963 に答える
2

あなたがするのが寝ているだけなら、あなたはすることができます

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

于 2012-08-22T22:10:12.640 に答える
2

これを試して:

for i in xrange(repeat):
  if i<repeat:
    time.sleep(10)
于 2012-08-22T21:53:23.193 に答える
0

whileループが機能する可能性があります

while repeat > 0:
    #do stuff
    if repeat > 1:
        time.sleep(10)
    repeat -= 1

xrangeを使用する代わりに、repeatをループが繰り返される回数に直接設定するだけです。

于 2012-08-22T22:04:11.937 に答える