Python函数闭包&&递归

319 阅读2分钟

「这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战

函数再升级的骚操作啦:::!!!

(1)闭包

简单来说就是一个函数定义中引用了函数外定义的变量,并且该函数可以在其定义环境外被执行。这样的一个函数我们称之为闭包。

小知识点:
函数引用:

def fun1():
        print('this is fun1')

fun1()      #这样可以调用
fun = fun1    #赋值   能够让fun和fun1指向同一片内存空间
fun()         #通过赋值之后的也可以调用函数

引入的话看这个例子:

def fun1():
        print('this is fun1')
        def fun2():
                print('this is fun2')
        fun2()        #如果要使用函数里嵌套的函数fun2,就要调用,这样在调用fun1的时候才会使用到内层函数fun2
fun1()     

仔细看看,现在我要把这个例子变成闭包了:::

def fun1():
        print('this is fun1')
        def fun2():
                print('this is fun2')
        return fun2     #在函数fun1下面返回里面函数的名字
fun1() ()

注意:::
return fun2相当于fun1()里面有了fun2()
现在如果调用fun1()的时候直接fun1(),就相当于fun1() = fun2 。这样还是只执行了fun1()。
所以等号两边同时加个括号,看可以把fun2()函数也执行了:fun1()() = fun2()

升华一下啦:::!!!
内嵌函数:
闭包是函数里面嵌套函数,外层函数返回里层函数的函数名,这种情况称为闭包。
闭包是概念,不是某种函数类型,和递归的概念类似,就是种特殊的函数调用
闭包可以得到外层函数的局部变量,是函数内部和函数外部沟通的桥梁

例子:

def zhangxinyi():
    x = 2000

    def wuhan(y):
        return y + x

    return wuhan

print(zhangxinyi()(1000))

# 输出为:3000

根据闭包函数中引用的自由变量的一些特性,闭包的应用场景还是比较广泛的。后面会有文章介绍其应用场景之一——单例模式,后面可以讲讲~

(2)递归:

函数自己调用自己,如果不做限制,就一直调用自己,直到超出最大的递归深度而报错。

引入例子:

def fun():
        print('this is fun')
        fun()

fun()

下面讲到正题:::!!!

阶乘factorical::: 5! = 54321
例子:

def fun(n):
        if n == 1:
                return 1
        return n*fun(n-1)

print(fun(5))

解释下:::
#nfun(n-1)
#fun(5)返回5
fun(4)
#fun(4)返回4fun(3)
#fun(3)返回3
fun(2)
#fun(2)返回2*fun(1)
#fun(1)返回 1 #如果不加限制,就会一直往下递归,所以应该加个限制,就是上面的if语句

在来个例子:::
#递归求高斯求和

def sum(n):
    if n == 1:
        return 1
    return n + sum(n-1)
print(sum(100))

#n = 100  return 100 + sum(99)
#n = 99   return 99  + sum(98)
#n = 98   return 98  + sum(97)
#...
#n = 1    return 1