gpt4 book ai didi

python - python中的时间延迟循环

转载 作者:太空宇宙 更新时间:2023-11-03 13:03:26 27 4
gpt4 key购买 nike

我有

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

但是,如果它是最后一次运行,我不希望它休眠。意思是,如果没有更多的迭代,不要 sleep

我该如何优雅地处理这个问题?

最佳答案

case of 1x repetition: doStuff
case of 2x repetition: doStuff, sleep, doStuff
case of 3x repetition: doStuff, sleep, doStuff, sleep, doStuff
...

你似乎想要的是做一堆事情,然后在每件事之间 sleep 。

此外,延迟与任务的性质无关。


解决方案 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 -- 带 break 的 While 循环

解决这些问题的最直接的方法之一是跳出 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 -- 检测是否为 last

如果不是循环的第一次迭代,上述方法会执行一些操作。但是,“检测循环的最后一次迭代”是您尝试解决问题的方式。这有点烦人,但你可以这样做: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()

作为引用,如果延迟取决于任务,那么您的任务应该返回等待多长时间。

关于python - python中的时间延迟循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12081895/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com