day11 闭包函数和装饰器
1.函数不是新知识点 主要是学习函数的用法
在面向对象编程中,一切皆对象,函数也不例外
具体的表现
1.函数可以引用
2.函数可以作为函数的参数
3.函数可以作为函数的返回值
4.可以被存储到容器类型中
def func1():
pass
a=func()
def func(func):
func()
func2(func1)
def func3():
return func1
def fun5():
print('func5 run')
li2 = [func5]
li2[2]()
2.函数的嵌套
1.定义的嵌套,在一个函数的定义内再定义函数
def f1():
print('f1')
def f2():
print('f2')
f2()
f1()
2.嵌套的调用,先定义好函数,在其他函数体内调用
def f1():
print('f1')
def f2():
print('f2')
f1()
f2()
名称空间就是一个字典,专门存储名称的空间,不仅存储名字,还要知道内存地址
名称空间分类
1.内置名称空间,存储解释器的一些名称与值的对应关系
(python 解释器启动时创建,所有代码全部执行完毕,关闭解释器时销毁)
2.全局名称空间 文件级别的名称,只要你的名字的定义是顶着最左边写的就是全局空间
(执行py文件时创建全局名称空间,所有文件中的代码全部执行完毕,关闭解释器时销毁)
除了内置和函数内,都在全局名称空间中
3.局部名称空间:只要是在函数内的名称都是局部的
(调用函数时创建,函数执行完毕就销毁)
名称空间的加载顺序
内置-》全局-》局部
名称的查找顺序
局部-》全局-》内置的
3.作用域
域就是范围的意思
全局名称空间和内置名称空间,在使用上没有区别
局部的和全局/内置的就有区别了:局部定义的只能在局部使用
给三个空间划分范围
全局的内置的可以划分为同一个范围
global表示全局范围,就是所谓的全局作用域
局部的单独划分为一个范围
local局部作用域
查看全局作用域的内容globals()
查看局部作用域的内容 注意,你在全局作用域使用locals看到的就是全局的内容,域glaobals没有区别
函数locals()
a = 'aasdasd'
print()
查看全局作用域中的内容
print(dir(globals()["__builtins__"]))
查看局部作用域中的内容 注意 你在全局中使用locals 看到的就是全局的内容,与globals没有区别
关键字
global #声明要使用全局中的变量名
nonlocal #明确声明 要使用上一层的a,如果上一层没有,则找上上层,但是注意,不能找全局中的
age=18
def func2():
#明确声明 要使用全局中的age
global age
age = 19
print(age)
fun2()
print(age) #因为局部名称空间中用了global,所以直接用的全局变量age,直接被修改了
def f1():
#age = 19
def f2():
nonlocal age #会报错,因为往上层找没有找到age
print(age)
f2()
f1()
print(age)
4.闭包函数
如下就是一个闭包函数
def fun1():
age = 18
def inner():
print('hello')
print(age)
在返回这个内部的函数时 不是单纯的返回函数 还把函数中访问的局部名称一起打包了
相当于将内部函数域访问的数据打包在一起了 闭包这个名字就是这么得来的
return inner
f=fun1()
函数的作用域在定义时就固定了,与调用的位置没有关系
闭包函数的模版
def fun2():
a = 1
b=10
def inner():
print(a)
print(b)
print(c)
return inner
f = fun2()
#__closure__用于访问闭包函数 打包的数据
什么是闭包函数
1.定义在另一个函数内的函数
2.内部的函数访问了外部的名称(数据) 注意 不包含全局的
5.装饰器
什么是装饰 给一个已有的对象(一个函数)添加新的功能
为什么要装饰:为了 增强功能
器:指一个工具,在python中,值得是具备某个功能的函数
简单的说:装饰器是一个用于其他函数增加功能的函数
开闭原则
指的是对扩展开放,对修改封闭(可以添加新功能,但不能修改原代码和代码的调用方式)
用户程序的用户
用框架的用户
print(time.time())返回一个时间戳,指的是1970年1月1日(unix元年)到现在一共经过的秒数
mac是Linux 内核,linux是unix的一个分支
装饰器和闭包函数的关系:装饰器是一种设计代码的套路(不修改源代码和调用方式的情况下,增加功能)
要完成装饰器就需要使用闭包函数
装饰器不是闭包,闭包也不是装饰器,只是通过闭包函数完成装饰器的设计
把旧功能的函数传进闭包函数,加好新功能,返回闭包函数,这样在下次调用时,其实是在调用改版的旧函数
装饰模式
def otter(func):
def inner():
在调用原始函数前,添加新功能
func()
return inner
download = otter(download)
download()
既遵守了开闭原则,又添加了新功能
day11 闭包函数和装饰器的更多相关文章
- python基础-闭包函数和装饰器
闭包函数和装饰器 闭包函数 概念:在函数中(嵌套)定义另一个函数时,内部函数引用了外层函数的名字. 特性 闭包函数必须在函数内部定义 闭包函数可引用外层函数的名字 闭包函数是函数嵌套.函数对象.名称空 ...
- Python之函数对象、函数嵌套、名称空间与作用域、闭包函数、装饰器
目录 一 函数对象 二 函数的嵌套 三 名称空间和作用域 四 闭合函数 五 装饰器 一.函数对象 1.函数是第一类对象 #第一类对象的特性:# 可以被引用 # 可以当做参数传递 # 返回值是函数 # ...
- 【Python3的命名空间与作用域,闭包函数,装饰器】
一.命名空间与作用域 命名空间是名字和对象的映射,就像是字典,key是变量名,value是变量的值 1.命名空间的定义 name='egon' #定义变量 def func(): #定义函数 pass ...
- day11_7.11 闭包函数与装饰器
补充: callable 代表可调用的,加括号可以执行.(函数或者类) import this 查看python之禅 一.闭包函数 所谓闭包函数,就是定义在函数内部的函数,也就是函数定义的嵌套.而在 ...
- CSIC_716_20191112【闭包函数和装饰器】
闭包函数 什么是闭包函数:闭包函数是函数嵌套.函数对象.名称空间和作用域的集合体. 闭包函数必须在函数内部定义,闭包函数可以引用外层函数的名字. # _*_ coding: gbk _*_ # @Au ...
- Python--day13(函数嵌套定义,global、nonlocal、闭包函数、装饰器)
今日主要内容 1. 函数的嵌套定义 2. global.nonlocal关键字 3. 闭包及闭包的应用场景 4. 装饰器 1. 函数的嵌套定义 概念:在一个函数的内部定义另一个函数 为什么要有 ...
- python---基础知识回顾(二)(闭包函数和装饰器)
一.闭包函数: 闭包函数: 1.在一个外函数中定义了一个内函数 2.内函数里运用了外函数的临时变量,而不是全局变量 3.并且外函数的返回值是内函数的引用.(函数名,内存块地址,函数名指针..) 正确形 ...
- Python之闭包函数、装饰器
1.闭包函数 #作用域关系在函数定义阶段时就已经固定死了,与调用位置无关 # 即:在任意位置调用函数都需要跑到定义函数时寻找作用域关系 # def f1(): # x=1 # def inner(): ...
- python基础之闭包函数与装饰器
闭包函数: 什么是闭包函数: 闭指的是定义在一个函数内部 包指的是该函数包含对外部作用域(非全局作用域)名字的引用 def counter(): n=0 def incr(): nonlocal n ...
随机推荐
- openStack cpu绑定
来自:http://fishcried.com/2015-01-09/cpu_bindings/ 前一篇理解cpu topology对CPU Topology进行了学习总结,这里想总结下OpenSta ...
- tkinter widget
tkinter messagebox
- ClientAbortException: java.net.SocketException: 断开的管道
这次终于解决了 ClientAbortException ! [ERROR] [- ::] net.jweb.actions.CommonDiskAction - 系统异常 ClientAbortEx ...
- Shell 编程(实例二)
创建一个脚本,为指定硬盘创建分区 1.列出当前系统所有磁盘,让用户选择,如果选择quit则退出脚本:如果选择错误,则重新选择 2.当用户选择完成后,询问是否继续 3.抹除选择磁盘上的分区,为其创建三个 ...
- 功能测试-UI测试思考点
界面是否美观 元素大小 界面元素是否对齐方式统一 界面字体属性是否正确 界面链接及触发动作( 链接的地址是否正确,不允许存在死链的情况 链接打开方式,当前页面还是新开页面 鼠标点击后的颜色是否美观,不 ...
- Mysql 定时任务事件
参考文献:https://blog.csdn.net/dream_ll/article/details/73499750
- 尚硅谷springboot学习10-@PropertySource,@ImportResource,@Bean
@PropertySource 使用指定的属性文件而不一定是application.xxx 同样可以注入相关内容 @ImportResource 导入Spring的配置文件,让配置文件里面的内容生效: ...
- MOBA项目定点数的一个想法
能不能这样: 写逻辑时全用整数,不用每用到一个浮点数就要转一下成浮点数. 主要是除法 题细节较多,待思考
- [Shell]Bash基本功能:历史命令 & 别名 & Bash快捷键
/*----------------------------------------------------------------------------------------------- @黑 ...
- WINDOWS之CMD命令
用法 1.切换盘符 2.切换到指定盘符后 在使用命令 cd +路径 一般介绍DOS命令,切换工作目录都是用CD命令,但是我在win7下的DOS中使用CD D:\却一直无法转到D盘. 后来在网上查找,发 ...