「这是我参与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)返回5fun(4)
#fun(4)返回4fun(3)
#fun(3)返回3fun(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