属于Python高阶部分,较难理解,看了多篇博客和教学视频,总结如下:
一 闭包(closure)
函数内的属性都是有生命周期的,都是在函数运行期间
内部函数对外部函数作用域变量的引用
闭包内的闭包函数私有化了变量,完成了数据的封装,类似于面向对象
用于装饰器
def func():
a = 1
print('this is func.')
def func1(num):
print('this is func1')
print(num + 1)
return func1
#func() #运行外部函数,内部函数就被创建了
var = func() #用一个函数变量接受func的返回值,也就是func1
var(2) #运行var
#输出
this is func.
this is func1
3
又如:
mylist = [1,2,3,4]
def func(obj):
print('func:', obj)
def func1():
obj[0] += 1
print('func1:', obj)
return func1
var = func(mylist)
var()
var()
var()
#输出
func: [1, 2, 3, 4]
func1: [2, 2, 3, 4]
func1: [3, 2, 3, 4]
func1: [4, 2, 3, 4]
二 装饰器(decorator)
不影响原有函数的功能,还能添加新的功能,可以使用装饰器对函数进行修饰,往往用语法糖
简化代码.而且是基于闭包的.
格式如下:
@func1
def myfunc():
例子 3
def func1(func):
def func2():
print('abc')
return func()
return func2
'''
return func 返回的是一个函数对象
return func() 返回的是一个函数调用
'''
@func1 #语法糖,等价于 myprint = func1(myprint)
def myprint():
print('hello')
myprint() #func1(myprint)()
#输出
abc
hello
从结果上看,myprint()函数被装饰了,即在以往的基础上多了一个打印.
被装饰的函数带参数,只需要在内部函数传入参数即可.
def func1(func):
def func2(x, y):
x += 5
y += 5
return func(x, y)
return func2
@func1
def mysum(a, b):
print(a + b)
mysum(1,2)
装饰函数带参数:
def arg_func(sex):
def func1(your_func):
def func():
if sex == 'man':
print('你不可以生娃')
if sex == 'woman':
print('你可以生娃')
return your_func()
return func
return func1
@arg_func(sex = 'man')
def man():
print('好好上班!')
@arg_func(sex = 'woman')
def woman():
print('好好上班!')
man()
woman()
#输出
你不可以生娃
好好上班!
你可以生娃
好好上班!