python之利用递归函数实现goto或者label功能

       c/cpp的goto和java的label都是一种可以从指定的语句处重新运行的功能,即可以在程序的其他地方跳转到指定处重新开始执行。那么在python中,其实并没有原生支持的类似语法,但是本文将说明,利用python的递归函数也可以实现类似的功能。

       比如,我们程序在运行到某处时,如果不满足某些条件,我们希望其可以在某个地方重新开始运行,这时我们就可以将这部分需要重新运行的语句以及条件判断封装成一个函数,之后再进行递归调用即可,伪代码如下所示。

---
some codes
---
#rerun from here
def rerun():
    ---
    some codes
    ---
    if not (some conditions):
        rerun()

       这样,我们把需要重新运行的逻辑以及条件判断都封装进了rerun函数,如果不满足这些conditions的话,那么就会重新运行这个函数里面的codes,从而可以实现类似goto和label的功能。

       最后需要注意的点是,python中对于递归函数的递归次数是有限制的,这个限制次数由不同的机器而已,目的是为了防止堆栈溢出,可以通过sys库的getrecursionlimit()函数获取本机器的最大递归次数。因此我们一定要注意这种限制给程序可能带来的问题,防止递归次数过多而报错。

       当然,我们自己也可以通过sys库的sys.setrecursionlimit(maxnum)函数设置最大递归次数为maxnum,当然这个maxnum不能超过python本身的限制。但是要注意的是,maxnum的值并不是可以随意小的,是有一个下限的,如果你设置的次数小于这个下限,python也会报错,在笔者的机器上,就不能小于40。但是,如果你就是不想让其递归次数太多,想要设置一个较小的值,那么你可以通过对该函数的引用次数的判断来实现,因为每递归一次,就会增加一次引用。所以可以通过sys.getrefcount(rerun)的方式来获取rerun的被引用次数,然后再在函数中增加一个判断语句,如果引用次数超过某个阈值就直接返回即可。

猜你喜欢

转载自blog.csdn.net/S_o_l_o_n/article/details/108026671