python闭包和修饰器

闭包

例子
代码均以python3为例。
函数f1 内部定义一个函数f2,并且f1函数返回值为内部函数f2,这样在内部函数f2中就可以使用外部函数f1定义的变量a了。以下程序运行结果为4。

[python]  view plain  copy
  1. def f1():  
  2.     a = 1  
  3.     def f2():  
  4.         b = 1  
  5.         c = a + 1  
  6.         return a + b + c  
  7.     return f2  
  8.   
  9. f3 = f1()  
  10.   
  11. print(f3())  
但是,注意在f2函数中不能修改变量a,如果把f2函数中的语句‘c=a+1'修改成'a=a+1',则会报错。
  
  
[python] view plain copy
  1. def f1():  
  2.     a = 1  
  3.     def f2():  
  4.         b = 1  
  5.         a = a + 1  
  6.         return a + b  
  7.     return f2  
  8.   
  9. f3 = f1()  
  10.   
  11. print(f3())  
上段程序结果如下:UnboundLocalError: local variable 'a' referenced before assignment。已经报错了。
解决问题
在python3里面,引入了一个关键字:nonlocal来解决这个问题,告诉系统该变量是在外部定义的。
  
  
[html] view plain copy
  1. def f1():  
  2.     a = 1  
  3.     def f2():  
  4.         nonlocal a  
  5.         b = 1  
  6.         a = a + 1  
  7.         return a + b  
  8.     return f2  
  9.   
  10. f3 = f1()  
  11.   
  12. print(f3())  
以上程序没有报错,运行结果为3。

修饰器

提出问题
在写代码时,一般不会轻易对已经实现的类或函数进行修改。为了扩充函数功能,可以使用修饰器。
函数f1功能是求两个数之和,现在还想求这两个数之积,又不能修改函数f1,该怎么办?
[python]  view plain  copy
  1. def f1(a, b):  
  2.     print('两数之和:', a+b)  
结果如下:两数之和: 7

不是凉拌,可以酱紫:
[python]  view plain  copy
  1. def w1(func):  
  2.     def inner(a, b):  
  3.         print('两数之积:', a*b)  
  4.         func(a, b)  
  5.     return inner  
  6.  
  7. @w1  
  8. def f1(a, b):  
  9.     print('两数之和:', a+b)  
  10.   
  11. f1(34)  

结果如下:
两数之积: 12
两数之和: 7


原理

python解释器就会从上到下解释代码,步骤如下:
1.def w1(func): ==>将w1函数加载到内存
2.@w1
执行w1函数 ,并将 @w1 下面的函数作为w1函数的参数,即:@w1 等价于 w1(f1) 所以,内部就会去执行。将执行完的w1函数返回值 赋值 给@w1下面的函数的函数名f1,即将w1的返回值再重新赋值给 f1。些时的f1函数已经不是表面上看到的函数,而是增加了inner函数中的内容,函数功能得到了扩充。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值