python avg_Python:作用域、闭包、装饰器
学到装饰器,然后总结一下理解装饰器需要的知识
一.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:作用域、闭包、装饰器相关推荐
- python入门day11闭包装饰器
目录 闭包 例子 同级闭包 装饰器引入 装饰器使用 无参例子 有参例子 可变参数例子 带关键字参数的装饰器 双层装饰器 装饰器带参数 装饰器的应用 闭包 def func():a=100def inn ...
- Python 进阶_闭包 装饰器
目录 目录 闭包 函数的实质和属性 闭包有什么好处 小结 装饰器 更加深入的看看装饰器的执行过程 带参数的装饰器 装饰器的叠加 小结 装饰器能解决什么问题 小结 闭包 Closure: 如果内层函数引 ...
- SIGIA_4P python学习 列表 字典 集合 面对对象编程 闭包 装饰器 函数式编程 作用域 异常处理
SIGIA_4P python学习 列表 字典 集合 面对对象编程 闭包 装饰器 函数式编程 作用域 异常处理 本文连接 简介 SIGIA_4P 网址 a. 课程OKR Objectives and ...
- python学习笔记(六)——函数的作用域和装饰器
目录 函数作用域 global和nonlocal关键字 递归 闭包 装饰器 函数作用域 global和nonlocal关键字 思考: def func():name = 'laowang' print ...
- python高阶函数闭包装饰器_Python_基础_(装饰器,*args,**kwargs,高阶函数,函数闭包,函数嵌套)...
一,装饰器 装饰器:本质就是函数,功能是为其它的函数动态添加附加的功能 原则:对修改关闭对扩展开放 1.不修改被修饰函数的源代码 2.不修改被修改函数的调用方式 装饰器实现的知识储备:高阶函数,函数嵌 ...
- python高级-闭包-装饰器
闭包内容: 匿名函数:能够完成简单的功能,传递这个函数的引用,只有功能 普通函数:能够完成复杂的功能,传递这个函数的引用,只有功能 闭包:能够完成较为复杂的功能,传递这个闭包中的函数以及数据,因此传递 ...
- python闭包函数使用教程_Python闭包装饰器使用方法汇总
闭包内容: 匿名函数:能够完成简单的功能,传递这个函数的引用,只有功能 普通函数:能够完成复杂的功能,传递这个函数的引用,只有功能 闭包:能够完成较为复杂的功能,传递这个闭包中的函数以及数据,因此传递 ...
- day4----函数-闭包-装饰器
day4----函数-闭包-装饰器 本文档内容: 1 python中三种名称空间和作用域 2 函数的使用 3 闭包 4 装饰器 一 python中三种名称空间和作用域 1.1名称空间: 当程序运行时, ...
- Python中的decorator装饰器使用方法
装饰器的运用是Python编程中的一项高级技巧,这里由浅入深,整理了12步入门Python中的decorator装饰器使用方法,需要的朋友可以参考下 装饰器(decorator)是一种高级Python ...
- 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解
第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一. 引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...
最新文章
- 插入记录时单引号的处理
- 从SQL Server 2000/2005到SQL Server 2008的升级测试
- 7、Power Query-合并查询
- 安装Extended WPF Toolkit
- iptables之iptables命令详解
- C# 互通操作 (二)基础知识1
- 关于Apache Tomcat解决localhost was unable to start within 45 seconds
- Javascript内部类
- 使用NRF2401 STM32F303ZET6 NUCLEO 开发板
- JavaScript学习(九十)—数组练习题(2)
- 谷歌推出 GKE 开源依赖关系漏洞奖励计划
- 移动端UI设计尺寸规范以及iPhone尺寸大小
- aws saa考试费用是多少?aws saa考试准备多久才能考试?
- XP系统如何禁止别人在电脑上安装程序
- 《没那么简单》-黄小琥
- C++ 智能指针(二) std::unique_ptr
- 2022仿淘宝网首页html+css
- Java8 Collectors.joining() 详解
- 批量更改Excel文件中大量工作表的内容(修改公司一千多份excel表格)
- physical examination
热门文章
- 【优化分类】基于matlab麻雀算法优化核极限学习机KELM分类【含Matlab源码 1791期】
- 【优化求解】基于matlab改进的遗传算法求解考虑环境效益DG优化问题【含Matlab源码 1483期】
- 【运动学】基于matlab GUI模拟投篮系统(角度+力度可调)【含Matlab源码 1114期】
- 【图像修复】基于matlab GUI三维图像复原【含Matlab源码 963期】
- 【语音编码】基于matlab PCM编解码【含Matlab源码 555期】
- 【三维路径规划】基于matlab A_star算法无人机三维路径规划【含Matlab源码 446期】
- 【路径规划】基于matlab A星+改进A星的路径规划【含Matlab源码 225期】
- 3打包忽略文件夹_Py打包exe(下篇): 进阶——用户体验改进
- 掩膜裁剪tif步骤_(8)空间数据投影变换、数据裁剪、拼接及提取
- php砸金蛋程序,简单的几句PHP生成美团3周年砸金蛋抽奖代码