Python闭包
为什么要有闭包
#内部函数对外部函数作用域里变量的引用
def func():#外部函数
print("this is func")
def func1():#内部函数
print("this is func1")
func()#运行外部函数,内部函数就被创建了
func1()#创建过程在func函数的执行过程中
闭包解释
def func():
# 函数内的属性,都是有生命周期
print('this is func')
def func1():
print('this is func1')
# 虽然死掉了,但是可以用return返回生命print('this is func1')
return func1
closure=func()
closure()
闭包是什么
内部函数完成了对数据的封装,类似于面向对象
def func():#外部函数
a = 1#外部函数作用域里的变量
print('this is func')
def func1(num):#内部函数
print('this is func1')
print (num +a)
return func1
closure=func()
closure(3)
闭包怎么用
mylist = [1,2,3,4,5]
def func(obj):
print('func:',obj)
def func1():
obj[0] +=1
print('func1:',obj)
return func1
closure=func(mylist)
closure()
closure()
closure()
闭包定义
定义:在函数嵌套的前提下,内部函数使用外部函数的变量,并且外部函数返回了内部函数,那么我们]把内部函数称为闭包。
- 构成条件:
1.函数嵌套前提
2.内部函数使用外部函数变量
3.外部函数返回内部函数 - 注意点:消耗内存
- 作用:闭包可以保存外部函数的变量,不会随着外部函数调用完销毁
# 外部函数
def func_out(num1):
# 定义内部函数
def func1_inner(num2):
# 内部函数中使用外部函数的变量
result = num1+num2
print('sum:',result)
# 返回的内部函数,就是闭包
return func1_inner
f=func_out(1) #指向func1_inner
# 执行闭包
f(2)
装饰器定义
- 定义:在已有函数增加额外功能的函数
- 装饰器特点:
1.不修改已有函数的源代码
2.不修改已有函数的调用方式
3.给已有函数增加额外功能def check(f):
def inner():
print('please log in')
f()
# 返回的是函数名,是闭包函数
return inner
def comment():
print('add a comment')
# 使用装饰器来装饰函数
comment = check(comment)
comment()
装饰器使用语法糖
def check(f):
def inner():
print('please log in')
f()
# 返回的是函数名,是闭包函数
return inner
# @装饰器函数的名字
@check # comment = check(comment)
def comment():
print('add a comment')
# 函数装饰器名字
# comment = check(comment)
# comment()
comment()