闭包:
函数内的属性,都是有生命周期,都是在函数执行期间
内部函数对外部函数作用域里变量的引用
闭包内的闭包函数私有化变量,完成了数据的封装,类似于面向对象
#!/usr/bin/python
# -*- coding: UTF-8 -*-
def func():#外部函数
a = 1 #外部函数作用域的变量
print('this is func')
def func1(num): #内部函数
print('this is func1')
print(num + a)
return func1 #返回函数
#func() 运行外部函数,内部函数就被创建了
var = func() #创建过程在func函数的执行过程中
#var == func1
var(3)
var(4)
内存.jpg
外部函数func在调用后,内存没有了外部函数,但是返回了内部函数(闭包函数)func1,而var==func1。而外部函数的变量a被内部函数引用。
装饰器
装饰器不影响原有函数的功能,添加新的功能。装饰器就是一种的闭包的应用
一、普通装饰器
#!/usr/bin/python
# -*- coding: UTF-8 -*-
def func1(func): #外部闭包函数的参数是被装饰的函数对象
def func2():
print('aaabbb')
return func()#返回了外部函数接收的被装饰函数的调用
return func2
#return func #返回了函数对象
#return func() #返回的是一个函数调用
@func1
def myprint():
print('你好,我是print')
myprint()
二、装饰器函数带参数
#!/usr/bin/python
# -*- coding: UTF-8 -*-
def arg_func(sex):
def func1(b_func):
def func2():
if sex == 'man':
print('你不可以生娃')
if sex == 'woman':
print('你可以生娃')
return b_func()
return func2
return func1
@arg_func(sex='man')
def man():
print('好好上班。')
@arg_func(sex='woman')
def woman():
print ('好好上班。')
man()
woman()
三、被装饰和函数带参数
#!/usr/bin/python
# -*- coding: UTF-8 -*-
def func1(func):
def func2(x,y):
print(x,y)
y += 5
x += 5
return func(x,y)
return func2
@func1
def mysum(a,b):
print(a+b)
mysum(1,5)








网友评论