博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 闭包和装饰器
阅读量:4691 次
发布时间:2019-06-09

本文共 1487 字,大约阅读时间需要 4 分钟。

闭包

概念:内部函数对外部函数作用域里变量的引用

  • 例子

    def fun():#外部函数      a = 1#外部函数作用域里的变量      print('this is func')      def func1(num):#内部函数也就是闭包函数          print('this is func1')          print(num + a)            return func1  var = fun()  #此时的 var = func1  var(3)  #结果  this is func  this is func1  4

闭包存在的意义:

1.闭包内的闭包函数私有化了变量

2.完成了数据的封装,类似于面向对象

  • 再来看个例子

    mylist = [1,2,3,4,5]  def func(obj):      print('func:',obj)      def func1():          obj[0] += 1          print('func1:',obj)      return func1  var = func(mylist)  var()  var()  var()  #结果:  func:[1,2,3,4,5]  func1:[2,2,3,4,5]  func1:[3,2,3,4,5]  func1:[4,2,3,4,5]

装饰器(也叫做语法糖)

概念:外部函数传入被装饰函数名,内部函数返回装饰函数名。不影响原有函数的功能,还能够添加新的功能。

  • 例子

    def fun1(func):      #外部闭包函数的参数是被装饰的函数对象      def fun2():          print('aaabbb')          return func()#返回的是外部函数接收的被装饰函数的调用,也就是返回函数的调用      return fun2      #这个是返回函数对象  @fun1  def myprint():        #myprint传入func      print('我是myprint')  myprint()  #结果  aaabbb  我是myprint
  • 过程解析

1.调用myprint ---> 识别到语法糖。

2.将myprint传入func --->也就是 fun1(myprint)() //后面这个括号是语法糖的效果

3.由于遇到return fun2 所以fun1(myprint)()就是 fun2()

4.执行fun2()方法,打印'aaabbb',返回func()

5.前面说过,myprint当做参数传递过去给func,所以func() = myprint()

6.所以执行方法myprint(),打印'我是myprint'

  • 再来看个例子

    def fun1(func):      def fun2(x,y):          print(x,y)          x += 3          y += 3          return func(x,y)      return fun2  @fun1  def mysum(a,b): #a = a + 5  b同理      print(a+b)  mysum(1,1)  #结果  1 1  8

被装饰的函数带参数,只需要在最内部函数传入参数即可。

转载于:https://www.cnblogs.com/jiajiaba/p/10659544.html

你可能感兴趣的文章
Ubuntu做Tomcat服务:insserv: warning: script 'tomcat' missing LSB tags and overrides
查看>>
Binary Agents
查看>>
入门Webpack,看这篇就够了
查看>>
短信拦截马”黑色产业链与溯源取证研究
查看>>
Mac Xdebug安装时遇到了Zend Engine API 不一致的问题
查看>>
最小公倍数
查看>>
asp.net如何定时执行任务
查看>>
在github上实现页面托管预览功能
查看>>
css选择器
查看>>
prim
查看>>
给陌生人写一封信
查看>>
noip2013花匠
查看>>
[CF]Equalize Them All
查看>>
React Ant design table表单与pagination分页配置
查看>>
重大发现: windows下C++ UI库 UI神器-SOUI(转载)
查看>>
linux 压缩文件的命令总结
查看>>
快速排序
查看>>
洛谷P1044 栈(Catalan数)
查看>>
loj #6013. 「网络流 24 题」负载平衡
查看>>
linux tail 命令详解
查看>>