繁体   English   中英

当 while 循环的条件变为 False 时,跳出嵌套在 while 循环中的 for 循环

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM