我有
for i in xrange(repeat):
#does my stuff
time.sleep(10)
但是,如果它是最后一次运行,我不希望它睡觉。意思是,如果没有更多的迭代,请不要睡觉
我如何优雅地处理这个?
答案 0 :(得分:4)
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 break with break
解决这些问题最直接的方法之一就是打破一个循环。这是一种肮脏的,有些非功能性的编程,但它是人类如何自然地想到这个问题:
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()
作为参考,如果延迟取决于任务,那么您的任务应该返回等待的时间。
答案 1 :(得分:2)
试试这个:
for i in xrange(repeat):
if i<repeat:
time.sleep(10)
答案 2 :(得分: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
的列表。
答案 3 :(得分:0)
while循环可能有效
while repeat > 0:
#do stuff
if repeat > 1:
time.sleep(10)
repeat -= 1
只需将重复直接设置为重复循环的次数,而不是使用xrange。