学到装饰器,然后总结一下理解装饰器需要的知识

一.python的作用域

当然,Python与大多数编程语言一样,搜索变量值的时候,即命名空间的规则,会采用'就近原则'.

  • 具体来说,由近及远依次为: 本地作用域(Local) --> 外部嵌套函数作用域(Enclosing Local) --> 全局/模块作用域(Global) --> 内置作用域(Built-in).
a 

  • Local 与 Enclosing 是一个相对的概念. 在函数 f1 中, a 是一个 Local 变量, 而在 f2 中 a 是一个 Enclosing 变量.
  • 只有模块、类、函数才会引入新的作用域. 而 if for while 语句不会引入新的作用域.
  • 全局作用域中的变量对于下层作用域比如函数来说, 是一个只读变量.
a 

函数内部不是修改全局变量 a 的值,而是重新定义了一个本地变量 a.所以全局变量 a 的值没有改变

a 

在函数 foo 内部, a = a + 3 这个表达式的存在会让 Python 编译函数的定义体时,它判断 a 是局部变量,因为在函数中给它赋值了。

  • 内部作用域中要修改外部作用域变量的值时,要用 global、nonlocal 关键字声明外部作用域变量
a 

二.闭包与自由变量

什么是闭包?

闭包指延伸了作用域的函数,其中包含函数定义体中引用、但是不在定义体中定义的非全局变量。函数是不是匿名的没有关系,关键是它能访问定义体之外定义的非全局变量

总结:闭包是个函数,它能够访问函数体之外定义的非全局变量,而这个非全局变量指的就是自由变量.

下面举一个例子, 定义一个 avg 函数,参数为一个值, 不断累加的计算从开始到现在所接收的全部值的平均值

def 

说明:1调用 make_average 返回一个 average 函数对象.这就是一个闭包函数,因为 avg 可以访问 average 函数定义体之外的 series .

注意:这里嵌套函数 average 并没有'改变' series, 只是修改它的值, 因为 series 是一个可变的列表.所以并不会报错.那么如果 series 是一个不可变对象呢? 会发生什么?

上面的例子效率比较低, 没一次都得 sum.我们难道不可以保存每一步计算的 total 吗?

def 

说明: 在嵌套函数 average 内部有 count += 1 ,此表达式等价为 count = count + 1.在编译阶段, 会把内部的 count 解释为一个本地变量, 所以如果没有 nonlocal 声明的话, 会报错 local variable 'count' referenced before assignment.

简单的处理当然不行, 我们需要使用 nonlocal 将 count 和 total 变成自由变量

def 

三.装饰器

装饰器用来'装饰'一个函数,为函数添加额外的功能,一般来说并不是核心功能.

装饰器接收一个函数作为参数,装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象。

举例, 我们定义一个装饰器,用来计算并且显示每个函数运行的时间

import 

让我们装饰一下别的函数

@decorate

`@decorate `是一个语法糖, 等同于 func = decorate(func), 所以此时 func 是 wrapper 函数的引用.

如何证明?

foo

这是一个瑕疵啊,我们需要改进.由此我们需要使用一些标准库装饰器.

使用 functools.wraps 装饰器把相关的属性(func._name 和 func.doc_)从 func 复制到 wrapper 中

from 

尾声

脚踏实地的前进, 希望自己学得越来越多, 然后分享出来喽.

python avg_Python:作用域、闭包、装饰器相关推荐

  1. python入门day11闭包装饰器

    目录 闭包 例子 同级闭包 装饰器引入 装饰器使用 无参例子 有参例子 可变参数例子 带关键字参数的装饰器 双层装饰器 装饰器带参数 装饰器的应用 闭包 def func():a=100def inn ...

  2. Python 进阶_闭包 装饰器

    目录 目录 闭包 函数的实质和属性 闭包有什么好处 小结 装饰器 更加深入的看看装饰器的执行过程 带参数的装饰器 装饰器的叠加 小结 装饰器能解决什么问题 小结 闭包 Closure: 如果内层函数引 ...

  3. SIGIA_4P python学习 列表 字典 集合 面对对象编程 闭包 装饰器 函数式编程 作用域 异常处理

    SIGIA_4P python学习 列表 字典 集合 面对对象编程 闭包 装饰器 函数式编程 作用域 异常处理 本文连接 简介 SIGIA_4P 网址 a. 课程OKR Objectives and ...

  4. python学习笔记(六)——函数的作用域和装饰器

    目录 函数作用域 global和nonlocal关键字 递归 闭包 装饰器 函数作用域 global和nonlocal关键字 思考: def func():name = 'laowang' print ...

  5. python高阶函数闭包装饰器_Python_基础_(装饰器,*args,**kwargs,高阶函数,函数闭包,函数嵌套)...

    一,装饰器 装饰器:本质就是函数,功能是为其它的函数动态添加附加的功能 原则:对修改关闭对扩展开放 1.不修改被修饰函数的源代码 2.不修改被修改函数的调用方式 装饰器实现的知识储备:高阶函数,函数嵌 ...

  6. python高级-闭包-装饰器

    闭包内容: 匿名函数:能够完成简单的功能,传递这个函数的引用,只有功能 普通函数:能够完成复杂的功能,传递这个函数的引用,只有功能 闭包:能够完成较为复杂的功能,传递这个闭包中的函数以及数据,因此传递 ...

  7. python闭包函数使用教程_Python闭包装饰器使用方法汇总

    闭包内容: 匿名函数:能够完成简单的功能,传递这个函数的引用,只有功能 普通函数:能够完成复杂的功能,传递这个函数的引用,只有功能 闭包:能够完成较为复杂的功能,传递这个闭包中的函数以及数据,因此传递 ...

  8. day4----函数-闭包-装饰器

    day4----函数-闭包-装饰器 本文档内容: 1 python中三种名称空间和作用域 2 函数的使用 3 闭包 4 装饰器 一 python中三种名称空间和作用域 1.1名称空间: 当程序运行时, ...

  9. Python中的decorator装饰器使用方法

    装饰器的运用是Python编程中的一项高级技巧,这里由浅入深,整理了12步入门Python中的decorator装饰器使用方法,需要的朋友可以参考下 装饰器(decorator)是一种高级Python ...

  10. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

最新文章

  1. 插入记录时单引号的处理
  2. 从SQL Server 2000/2005到SQL Server 2008的升级测试
  3. 7、Power Query-合并查询
  4. 安装Extended WPF Toolkit
  5. iptables之iptables命令详解
  6. C# 互通操作 (二)基础知识1
  7. 关于Apache Tomcat解决localhost was unable to start within 45 seconds
  8. Javascript内部类
  9. 使用NRF2401 STM32F303ZET6 NUCLEO 开发板
  10. JavaScript学习(九十)—数组练习题(2)
  11. 谷歌推出 GKE 开源依赖关系漏洞奖励计划
  12. 移动端UI设计尺寸规范以及iPhone尺寸大小
  13. aws saa考试费用是多少?aws saa考试准备多久才能考试?
  14. XP系统如何禁止别人在电脑上安装程序
  15. 《没那么简单》-黄小琥
  16. C++ 智能指针(二) std::unique_ptr
  17. 2022仿淘宝网首页html+css
  18. Java8 Collectors.joining() 详解
  19. 批量更改Excel文件中大量工作表的内容(修改公司一千多份excel表格)
  20. physical examination

热门文章

  1. 【优化分类】基于matlab麻雀算法优化核极限学习机KELM分类【含Matlab源码 1791期】
  2. 【优化求解】基于matlab改进的遗传算法求解考虑环境效益DG优化问题【含Matlab源码 1483期】
  3. 【运动学】基于matlab GUI模拟投篮系统(角度+力度可调)【含Matlab源码 1114期】
  4. 【图像修复】基于matlab GUI三维图像复原【含Matlab源码 963期】
  5. 【语音编码】基于matlab PCM编解码【含Matlab源码 555期】
  6. 【三维路径规划】基于matlab A_star算法无人机三维路径规划【含Matlab源码 446期】
  7. 【路径规划】基于matlab A星+改进A星的路径规划【含Matlab源码 225期】
  8. 3打包忽略文件夹_Py打包exe(下篇): 进阶——用户体验改进
  9. 掩膜裁剪tif步骤_(8)空间数据投影变换、数据裁剪、拼接及提取
  10. php砸金蛋程序,简单的几句PHP生成美团3周年砸金蛋抽奖代码