【问题标题】:Is it possible to exit a function from a subfunction it calls是否可以从它调用的子函数中退出函数
【发布时间】:2022-01-11 00:00:40
【问题描述】:

我的问题很简单。这是概念:

from random import randrange, uniform

def match (x, y):
        if x == y:
                print("True!")
        else:
                print("False")
                return
def main():
        while True:
                match(randrange(0, 10), randrange(0, 10))
        while True:
                match(randrange(0, 10), randrange(0, 10))
        while True:
                match(randrange(0, 10), randrange(0, 10))

main()

    

如您所见,有两个功能。 main() 循环遍历随机整数直到它们匹配,match() 传入实际整数以便计算,并且 如果 遇到错误结果,两个循环都应该中断。这段代码有两个问题:

  1. 循环永远不会中断,因为返回只适用于运行代码的函数。我的目标是在返回错误结果时停止主函数。
  2. 可以在 每一行 上添加 if 语句来检查返回的结果是否为 False。然而,这将是非常低效的并且根本不理想。一定有更好的办法。

我应该注意,这是我在实际代码中遇到的问题后建模的代码,该代码很长并且在没有上下文的情况下无法在此处复制粘贴。尽管如此,同样的原则仍然适用:就像这里的代码一样,当它调用的子函数计算出错误的结果时,我必须阻止主函数进一步计算。

我该怎么做?我的想法是以某种方式从子函数match() 中停止主函数,但这可能吗?如果没有,我有什么选择?

【问题讨论】:

  • 我认为您的意思是想找到一种方法来打破所有while 循环,而不必修改每个while 循环?
  • 信不信由你,向我们展示您的实际代码和您的实际问题可能更有效率。 XY 问题就是这样产生的。

标签: python python-3.x function


【解决方案1】:
from random import randrange, uniform

def match (x, y):
        if x == y:
                print("True!")
        else:
                print("False")
                raise Exception()
def main():
    try:
            while True:
                    match(randrange(0, 10), randrange(0, 10))
            while True:
                    match(randrange(0, 10), randrange(0, 10))
            while True:
                    match(randrange(0, 10), randrange(0, 10))
    except:
        print("exit")
main()

这可能不是您想要的答案,但我想它可能会有所帮助。

通过使用 try 和 except 创建一个包含所有 while 循环的范围,您可以通过引发异常退出函数。

如果你想完全结束函数(不在函数中做try/except),你可以简单地这样做:

try:
    main()
except:
    #something else

这也允许您在不修改函数本身的情况下执行此操作。

【讨论】:

  • 那会得到相同的结果,所以我很高兴。谢谢!
  • @Myronaz 很高兴听到它有效:D
猜你喜欢
  • 2015-05-22
  • 2015-09-04
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
相关资源
最近更新 更多