欢迎来到“只读课堂”!
In [1]:
#这节课我们来学习闭包。
什么是闭包
内部函数对外部函数作用域里变量的引用(非全局变量 ) ,则称内部函数为闭包
一个闭包就是你调用了外部函数,外部函数返回内部函数。此时的内部函数就叫做闭包函数
闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例
In [2]:
#它有一个内部函数和一个外部函数。
In [5]:
def wai():
a = 1
def nei():
print(a)
return nei
In [6]:
#这样就生成了一个闭包
In [7]:
func = wai()
In [8]:
#这是内部函数
In [9]:
#外部函数的返回值
In [10]:
func()
1
In [11]:
#a变量就被打印出来了。
In [12]:
#但是我们在外部就不能直接打印a。
In [13]:
print(a)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-13-bca0e2660b9f> in <module>()
----> 1 print(a)
NameError: name 'a' is not defined
In [14]:
#我们在运行完func()之后还可以再次使用a。
In [15]:
#闭包的模板代码:
def func1(num):
print(‘func1:’ num)
def func2(numl):
print(‘func2:’ num1)
return numl+num
return func2
func2 funcl(20)
res = func2(30)
In [16]:
#我们再来举个例子
In [22]:
def func(num):
def func1(num1):
print(num+num1)
return func1
In [23]:
var = func(10)
In [24]:
var(20)
30
In [25]:
#为什么我们现在还可以用呢,因为我们用var把它给继承下来了。
In [26]:
#再介绍一下闭包函数有什么用处:
In [27]:
mylist = [1,2,3,4,5]
In [28]:
def func(obj):
def func1():
obj[0] += 1
print(obj)
return func1
In [29]:
var = func(mylist)
In [30]:
var()
[2, 2, 3, 4, 5]
In [31]:
#第一次是22345
In [32]:
#我们再来看一下它是不是累加的:
In [33]:
var()
[3, 2, 3, 4, 5]
In [34]:
var()
[4, 2, 3, 4, 5]
In [35]:
var()
[5, 2, 3, 4, 5]
In [36]:
#它这个闭包是累加的。
In [37]:
#再看一下我们的mylist:
In [38]:
print(mylist)
[5, 2, 3, 4, 5]
In [39]:
#var修改了,我们的变量也会修改。
In [40]:
#var就是一个充满数据的容器。
思考
闭包私有化了变量,原来需要类对象完成的工作,闭包也可以完成
由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
在 python 中,使用闭包的另一个场景就是装饰器,也叫语法糖@
In [41]:
#什么叫类对象呢
In [42]:
#类似功能-》类-》实例
本次只读课堂的python教程就到这了,欢迎下一次的收看!