闭包及装饰器
2020-10-29 本文已影响0人
木子李007
递归:是自己调用自己
闭包:函数嵌套,并且保存局部作用域变量
## 普通装饰器
def wai(func):
def nei():
res = func()
return res + '你好'
return nei
@wai
def work():
return '123'
def func():
return 123
print(work()) # 结果是:123你好
print(func()) # 结果是:123
## 被装饰函数带参数
def wai(func): #装饰器
def nei(var1,var2):
var1 = 100 #在闭包函数内部对被装饰函数参数进行干预
var2 = 99
return func(var1,var2)
return nei
@wai
def work(a,b):
return a + b
res = work(20,30) #wai(work)(a,b)
print(res) # 结果是:199
## 装饰器函数也可以有参数
#商品
mind = True
zhekou = 0.9 #折扣的数值
youhuiquan = 5
# 当你的装饰器函数也需要参数的时候,只需要多一层包装即可
def dazhe(con,zk,yhq):
def wai(func):
def nei(money):
print('-----------')
if con:
print('打折!')
money = money * zk
elif yhq:
print("优惠券!")
money = money - yhq
return func(money)
return nei
return wai
#dazhe -> wai
#wai -> nei
#nei -> func()
@dazhe(mind,zhekou,youhuiquan)
def apple(money):
print('苹果的价钱是:%d' % money)
return money
@dazhe(mind,zhekou,youhuiquan)
def pants(money):
print('裤子的价钱是:%d' % money)
return money
@dazhe(mind,zhekou,youhuiquan)
def skirt(money):
print('裙子的价钱是:%d' % money)
return money
apple(10)
pants(50)
skirt(100)
运行结果:======
-----------
打折!
苹果的价钱是:9
-----------
打折!
裤子的价钱是:45
-----------
打折!
裙子的价钱是:90
## 思考
def work():
return '123'
def func():
work() #== '123'
print(func()) #问题:返回值是啥?
#答案:None
def wai(b_func): #外函数的参数是一个函数对象
def nei():
print("嘿嘿嘿") #在nei函数里写的代码基本上都是添加的功能
return b_func() #这个是nei函数返回值,用来返回之前在wai函数所接收的参数
#b_func()
#return ''
return nei #返回了wai函数里的这个定义好的闭包容器
@wai #语法糖
def func():
print('哈哈哈哈')
return 'func'
res = func() #调用一个被装饰函数 其实相等于 wai(func)()
print('func的返回值:',res)