防锤宣言:本教程仅为个人理解,如有错误还请指正
翻阅关于闭包的时候发现python的讲解相对少一点。大部分是java的,故做此教程
一,基础闭包
第一个小目标
我们先设定一个目标:
求解一元一次方程y=2+3的值
这个很简单
y=2+3
print(y)
得到y=5
第二个小目标
好的,现在我们升级难度,要求2和3,可以变成从外界传入的参数
那么我们增加函数的操作得到:
def yy(a,b):
y = a + b
print(y)
if __name__ == '__main__':#这一行只是方便调试,没有它也可以
myf=yy(a=2,b=3)
现在可以更改a和b的值了
第三个小目标
现在就可以升级难度了,这次目标是:
请制作一个二元一次方程组,y=ax+b,这个变量“x”希望是可以通过缓存方式调用的
那么接下来就可以加上闭包的操作得到:
def yy(a,b):
def xx(x):
y = a * x + b
print(y)
return xx
if __name__ == '__main__'
mya=yy(a=2,b=3)
mya(1)
到这里可能有些人会有点迷糊了,这一步是怎么达成的?
那么我们拆分一下新出现的每一行代码的作用就可以了,(当然你可以自己使用pycharm里面的“调试”自己尝试一下)
第三个小目标解释
首先在yy函数内部增加一个返回值,这个返回值是用来引用内部函数xx
这一步返回值十分关键,它代表mya=y(a,b)转变为了mya=xx
return xx
接下来执行了下面这一行代码,这行代码的作用是将参数x的值返回给内部函数
由于上一步的返回值,导致这一步不再是mya(y的参数)而变成了mya(x的参数)
mya(1)
这时执行下方代码,y=2*1+3 print(输出y的值)
def xx(x):
y = a * x + b
print(y)
这就简单的达成了闭包操作逻辑
二,nonlocal关键字
nonlocal:用来从内部函数改变外部函数的参数值
举个例子:我们在前面基础上新加一个要求,新增加一个参数c,并且每多调用一次,就增加一
那么我们可以增加一个nonlocal关键字,用来告诉python解释器,我要通过内部函数改变外部函数传进来的参数值
那么就得到了下面的代码:
def yy(a,b):
c=0
def xx(x):
nonlocal c #声明要改变变量c
c+=1 #每调用一次C就加1
y = a * x + b + c
print(y)
return xx
if __name__ == '__main__'
mya=yy(a=2,b=3)
mya(1)
以上就是python的基础闭包教程了,谢谢观看
2万+

被折叠的 条评论
为什么被折叠?



