闭包及装饰器

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)
上一篇下一篇

猜你喜欢

热点阅读