前提:
"""
1、是一个嵌套函数;
2、内部函数引用了外部函数的变量;
3、返回值是内部函数;
符合以上三个条件就是闭包。
闭包本身没有太大作用,主要是用在装饰器上。
"""
def outer(n):
a = 10
def inner():
b = a + n
print("内部函数:",b)
return inner
r=outer(5)
print(r) #运行结果:<function outer.<locals>.inner at 0x00000234F3C2D6A8>
r() #运行结果:内部函数: 15
一、不带参数装饰器
#定义装饰器
def decorater(func): #装饰器中要传人一个函数,就是被装饰的函数
def wrapper(): #定义内部函数
func() #先调用一下传进来的函数本身
print("铺地板") #做其他执行操作
print("刷墙面")
print("买家具")
return wrapper #返回执行完毕的函数,要作为对象返回出去,不能加()
@decorater
def house():
print("毛坯房....")
house()
运行结果:
毛坯房....
铺地板
刷墙面
买家具
二、带参数装饰器
#带参数装饰器
def decorater(func):
def wrapper(*args,**kwargs):
#传进来的args是一个元组,所以在下面的调用中需要对元组解包,所以在args前面加上星号来解决这个问题。
func(*args,**kwargs)
print("铺地板")
print("刷墙面")
print("买家具")
return wrapper
@decorater
def house(address):
print("房子的地址是:{}".format(address))
@decorater
def changfang(address,area):
print("房子的地址是:{},面积是{}平米".format(address,area))
@decorater
def hotel(name,address,area=40):
print("酒店的名字:{},酒店地址是:{},单间房子的面积是{}平米".format(name,address,area))
house("北京四合院")
print("--------------")
changfang("北京沙河",1000)
print("--------------")
hotel("东岸","北京",area=100)
运行结果:
房子的地址是:北京四合院
铺地板
刷墙面
买家具
--------------
房子的地址是:北京沙河,面积是1000平米
铺地板
刷墙面
买家具
--------------
酒店的名字:东岸,酒店地址是:北京,单间房子的面积是100平米
铺地板
刷墙面
买家具
三、带返回值的装饰器
def decorater(func):
def wrapper(a,b):
f=func(a,b)
j=f+100
return j #原函数有返回值,装饰器内部函数也要有返回值
return wrapper
@decorater
def add(a,b):
c=a+b
return c
d=add(1,3)
print(d)
运行结果:
104