如何从被调用函数 "continue" 调用函数中的循环?

How can I "continue" a loop in the calling function, from the called function?

我有以下工作代码:

while True:
    try:
        pyautogui.click('a.png')
    except pyautogui.ImageNotFoundException:
        print('a not found')
        continue
    try:
        pyautogui.click('b.png')
    except pyautogui.ImageNotFoundException:
        print('b not found')
        continue

我希望能够这样做:

def a():
    try:
        pyautogui.click('a.png')
    except pyautogui.ImageNotFoundException:
        print('a not found')
        continue
        
def b():
    try:
        pyautogui.click('b.png')
    except pyautogui.ImageNotFoundException:
        print('b not found')
        continue
        
while True:
    a()
    b()

当我将 try-except 块放入函数中时,我无法使用“continue”。我希望它 运行 直到我在函数内部单击它试图单击的图像。我该如何解决?

您未能对循环逻辑进行编程。如果我正确地解释了你的描述,你想在点击两个区域之间交替,并保持循环,直到你成功点击其中一个区域。

如果是这样,请再次查看您的代码:是什么原因导致您离开循环?请注意,无法直接从函数内部控制循环逻辑:函数无法知道它是从循环内部调用的。相反,函数 return 的成功状态为:

def a():
    try:
        pyautogui.click('a.png')
        return True
    except pyautogui.ImageNotFoundException:
        return False

# Do the same with function `b`

found = False
while not found:
    found = a() or b()    

这最后一行是典型的编程习惯用法,用于按特定顺序尝试事物。这取决于布尔短路逻辑。 运行-时间系统会调用a();它返回 True,然后它知道整个表达式将是 True,并且不会调用 b()。如果对 a 的调用返回 False,那么解释器只会调用 b(),将 return 值分配给 found

事实上,您可以将循环减少到

while not a() and not b():
    pass

OP 差异后的响应

如果您需要的只是重复点击每张图片,直到找到每张图片,那么您的循环逻辑与您的需要不匹配。这样问题就简单多了:

while not a():
    pass
while not b():
    pass