如何从被调用函数“继续”调用函数中的循环?

Posted

技术标签:

【中文标题】如何从被调用函数“继续”调用函数中的循环?【英文标题】:How can I "continue" a loop in the calling function, from the called function? 【发布时间】:2021-08-06 22:21:15 【问题描述】:

我有以下工作代码:

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。更好的方法是让 a()b() 返回一个值,指示主 while 循环应该继续或终止。 我知道我不能用它,很遗憾我听不懂你在说什么,我对功能不太了解,你能描述得更清楚吗? try/except(不是“预期”)不是循环。你不能使用continue 的原因不是因为“它在函数内部”——你绝对可以在函数内部使用continue——而是因为没有循环可以继续。在您显示的工作代码中,不需要continue 语句;他们现在所做的只是确保如果找不到a.png,下一次尝试 也将在a.png 而不是b.png 上(因为循环从顶部重新开始)。 看起来你想要做的是有一个函数来控制调用它的代码的行为。它不是那样工作的。调用代码必须决定自己的行为。它可以使用从调用函数中获得的信息,例如,return 值。 我试图编辑这个问题,使其更适合作为其他人的搜索目标,因为我认为基本问题很好,并且可以解释一项重要的技术。 【参考方案1】:

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

如果是这样,请再次查看您的代码:是什么导致您退出循环?请注意,直接从函数内部控制循环逻辑是不可能的:函数无法知道它是从循环内部调用的。相反,让函数返回其成功状态:

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(),将返回值分配给found

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

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

OP 差异后的响应

如果您只需要重复单击每张图片,直到找到每张图片,那么您的循环逻辑与您需要的不匹配。这使问题变得更加简单:

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

【讨论】:

此代码在“a”失败后运行“b”。我希望它在“a”失败后运行“a”,直到成功。 and 切换为or,反之亦然,它应该可以按照您的描述工作。 @EmreOz 您发布的代码非常清楚地使 一个 尝试依次尝试 ab。如果您想要其他东西,请更新您的问题并尝试反映这种需求。您的评论描述的是两个连续的循环。 @Prune 我可以做点什么让“a”成功 7 次然后执行“b”吗? 当然可以——但这是另一个问题。看来您需要在学习基本的 Python 控制结构以及练习使用这些结构进行编程方面做更多的工作。一次指导你一步超出了本网站的范围——或者任何网站,真的。

以上是关于如何从被调用函数“继续”调用函数中的循环?的主要内容,如果未能解决你的问题,请参考以下文章

从被调用的函数调用函数时 VBA byref 参数类型不匹配

如何覆盖特征函数并从被覆盖的函数中调用它?

从被 CORS 阻止的 Firebase 托管代码调用 Firebase 函数

返回函数的返回值的return和结束for循环的return是一个东西吗?

可以继续添加带有增加的类变量的调用函数吗?

C语言调用一个函数无法跳出,死循环