|
发表于 2024-4-11 10:42:47
|
显示全部楼层
本帖最后由 jackz007 于 2024-4-11 12:13 编辑
【闭包】:
- def fooA(a , b) :
- def fooB(x , y) :
- return (x + a) // (y - b)
- return fooB
- fx1 = fooA(900 , 45) # 以 a = 900 , b = 45 调用 fooA(a , b),得到其内嵌函数 fooB() 的调用句柄 fx1
- fx2 = fooA(150 , 15) # 以 a = 150 , b = 15 调用 fooA(a , b),得到其内嵌函数 fooB() 的调用句柄 fx2
- print('%d' % fx1(30 , 75)) # 以 a = 900 , b = 45 , x = 30 , y = 75 调用 fooA() 的内嵌函数 fooB(x , y)
- print('%d' % fx2(30 , 75)) # 以 a = 150 , b = 15 , x = 30 , y = 75 调用 fooA() 的内嵌函数 fooB(x , y)
复制代码
【装饰器】:
- def fooA(fx) : # 调用参数 fx 就是被装饰函数 work() 的调用句柄
- def fooB(x , y) : # 由于 work() 有 2 个输入参数,所以,这里也得有 2 个输入参数
- a , b = 3 , 5 # 用于修改计算公式
- print('开始调用被装饰函数')
- k = fx(a * x , b + y) # 用修改过的参数调用被装饰函数 work()
- print('被装饰函数调用完毕')
- return k + 30 # 修改对被装饰函数 work() 调用的结果
- return fooB # 以内嵌函数 fooB 作为被装饰函数的实际调用句柄
- @fooA # 用函数 fooA() 提供的新调用句柄 fooB 替代 work
- def work(c , d) : # 被装饰函数 work() 带有 2 个输入参数
- print('在被装饰函数内')
- return a * b # 被装饰函数有返回值
- print('计算结果为 : %d' % work(7 , 9)) # 调用经过装饰的函数 work()
复制代码
fooA() 装饰 work(),当调用 work() 时,会实际调用由 fooA 提供的内嵌函数 fooB(),并由 fooB() 来负责完成对被装饰函数 work() 的调用 |
|