如何从被调用函数“继续”调用函数中的循环?
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 您发布的代码非常清楚地使 一个 尝试依次尝试 a
和 b
。如果您想要其他东西,请更新您的问题并尝试反映这种需求。您的评论描述的是两个连续的循环。
@Prune 我可以做点什么让“a”成功 7 次然后执行“b”吗?
当然可以——但这是另一个问题。看来您需要在学习基本的 Python 控制结构以及练习使用这些结构进行编程方面做更多的工作。一次指导你一步超出了本网站的范围——或者任何网站,真的。以上是关于如何从被调用函数“继续”调用函数中的循环?的主要内容,如果未能解决你的问题,请参考以下文章
从被调用的函数调用函数时 VBA byref 参数类型不匹配
从被 CORS 阻止的 Firebase 托管代码调用 Firebase 函数