[英]Break out of a for loop nested in a while loop when while loop's condition becomes False
我有一个迭代 8 秒的 while 循环,在它里面是一个迭代 4 次的 for 循环,每次执行一些 pyautogui press 函数。 但是,当我的循环中断时,内部的 for 循环会继续直到完成。 代码:
import time
import pyautogui
timeout = time.time() + 8
while time.time() < timeout:
for i in range(4):
pyautogui.press("1")
pyautogui.press("1")
pyautogui.press("1")
pyautogui.press("1")
pyautogui.press("1")
pyautogui.press("1")
pyautogui.press("1")
pyautogui.press("1")
pyautogui.press("1")
pyautogui.press("1")
pyautogui.press("4")
pyautogui.press("enter")
print(f"{time.time() - timeout } seconds more than while loop execute time")
打印报表output:
2.4774444103240967 seconds more than while loop execute time
那么,我怎样才能让我的 for 循环以我的 while 循环结束呢? 我检查了堆栈溢出但一无所获。
(使用pyautogui.press("")
因为我在使用它们时出错并且它们执行得比打印语句慢(可以更好地看到时差))
好吧,你的描述并不能反映现实。 “for”循环肯定会以“while”循环结束,但是你不能在中间打断“for”循环。 如果你想在击键中途停止,那么你需要在每次击键时检查时间:
import time
import pyautogui
timeout = time.time() + 8
msg = "11111111114*" * 4
for c in msg:
if time.time() >= timeout:
break
if c == '*':
c = 'enter'
pyautogui.press(c)
print(f"{time.time() - timeout } seconds more than while loop execute time")
或者:
import time
import pyautogui
timeout = time.time() + 8
msg = (list("11111111114")+['enter']) * 4
while time.time() < timeout:
if msg:
pyautogui.press(msg.pop(0))
else:
time.sleep(0.1)
print(f"{time.time() - timeout } seconds more than while loop execute time")
您可以在适当定义的生成器上用对next
的调用替换while
循环的主体。 从某种意义上说,这是线程的原始实现; 生成器的执行与超时条件的重复评估交织在一起。 (在实践中,这可能仅作为线程如何工作的示例有用。)
def my_generator():
for i in range(4):
yield pyautogui.press("1")
yield pyautogui.press("1")
yield pyautogui.press("1")
yield pyautogui.press("1")
yield pyautogui.press("1")
yield pyautogui.press("1")
yield pyautogui.press("1")
yield pyautogui.press("1")
yield pyautogui.press("1")
yield pyautogui.press("1")
yield pyautogui.press("4")
yield pyautogui.press("enter")
foo = my_generator()
while time.time() < timeout:
next(foo)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.