如何在调用另一个函数后强制函数退出?
How to force a function to exit after calling another function?
我有两个函数,每个函数都在最后一行调用另一个函数作为传递控制的一种方式。有没有一种优雅的方法可以强制一个函数在另一个函数执行之前退出,这样你就不会把你的程序堆成一具尸体?
示例:
def f1(x):
print("f1",x)
f2(x+1)
def f2(x):
print("f2",x)
f1(x+1)
f1(0)
现在的情况是,在约 1000 次调用后,它遇到了递归限制。
当然,一个简单的外部控制结构可以解决这个问题,但我宁愿拥有控制权流刻在函数中。
编辑:
但这不是很碍事吗?
如果 Python 努力成为一种具有高度抽象的高级语言,那么在模块之上构建模块的某个时刻,Python 不会因为它自己的 not 行为而崩溃吗减少足迹?
最简单的方法是在您的函数中设置一个条件,以便 terminate/stop 递归。
可能是这样的:
def f1(x):
if x == 30: #Set a limit in order to just print, without calling
print("f1", x)
else:
print("f1",x)
f2(x+1)
def f2(x):
print("f2",x)
f1(x+1)
f1(0)
简单的解决方案
您可以只添加一个 if 语句:
def f1(x):
print("f1", x)
if x <= 30:
f2(x+1)
def f2(x):
print("f2",x)
if x <= 30:
f1(x+1)
长答案
关于是否可以在调用下一个函数之前强制函数退出的答案是否-ish。具体来说,您要求进行尾递归优化 python does not optimize.
如果您希望一个函数在另一个函数被调用之前退出,您必须实际退出该函数而不是让它调用另一个函数:
def f1(x):
print('f1', x)
return f2, (x+1,)
def f2(x):
print('f2', x)
return f1, (x+1,)
f, args = f1, (0,)
while True:
f, args = f(*args)
这将需要您想要避免的外部控制结构。
顺便说一句,您尝试使函数调用工作的方式很像 GOTO,并且最终会对程序复杂性和可维护性产生相同的影响。
正如 user2357112 所指出的,我不确定您为什么要这样做。
但是,如果您真的必须这样做,那么您可以为该函数分配一个布尔值,以指示它已经被调用。
def f1(x):
print("f1",x)
f1.called = True
if not f2.called:
f2(x+1)
def f2(x):
print("f2",x)
f2.called = True
if not f1.called:
f1(x+1)
f1(0)
我有两个函数,每个函数都在最后一行调用另一个函数作为传递控制的一种方式。有没有一种优雅的方法可以强制一个函数在另一个函数执行之前退出,这样你就不会把你的程序堆成一具尸体?
示例:
def f1(x):
print("f1",x)
f2(x+1)
def f2(x):
print("f2",x)
f1(x+1)
f1(0)
现在的情况是,在约 1000 次调用后,它遇到了递归限制。
当然,一个简单的外部控制结构可以解决这个问题,但我宁愿拥有控制权流刻在函数中。
编辑:
但这不是很碍事吗?
如果 Python 努力成为一种具有高度抽象的高级语言,那么在模块之上构建模块的某个时刻,Python 不会因为它自己的 not 行为而崩溃吗减少足迹?
最简单的方法是在您的函数中设置一个条件,以便 terminate/stop 递归。
可能是这样的:
def f1(x):
if x == 30: #Set a limit in order to just print, without calling
print("f1", x)
else:
print("f1",x)
f2(x+1)
def f2(x):
print("f2",x)
f1(x+1)
f1(0)
简单的解决方案
您可以只添加一个 if 语句:
def f1(x):
print("f1", x)
if x <= 30:
f2(x+1)
def f2(x):
print("f2",x)
if x <= 30:
f1(x+1)
长答案
关于是否可以在调用下一个函数之前强制函数退出的答案是否-ish。具体来说,您要求进行尾递归优化 python does not optimize.
如果您希望一个函数在另一个函数被调用之前退出,您必须实际退出该函数而不是让它调用另一个函数:
def f1(x):
print('f1', x)
return f2, (x+1,)
def f2(x):
print('f2', x)
return f1, (x+1,)
f, args = f1, (0,)
while True:
f, args = f(*args)
这将需要您想要避免的外部控制结构。
顺便说一句,您尝试使函数调用工作的方式很像 GOTO,并且最终会对程序复杂性和可维护性产生相同的影响。
正如 user2357112 所指出的,我不确定您为什么要这样做。
但是,如果您真的必须这样做,那么您可以为该函数分配一个布尔值,以指示它已经被调用。
def f1(x):
print("f1",x)
f1.called = True
if not f2.called:
f2(x+1)
def f2(x):
print("f2",x)
f2.called = True
if not f1.called:
f1(x+1)
f1(0)