python装饰器初级
global与nonlocal
1.global的作用:
可以在局部空间里直接就该全局名称工具中的数据
代码展示:
name = 'moon' #设置了一个全局变量
def fucn():
name = 'god' #设置了一个局部变量
fucn() #执行函数
print(name) # moon 因为局部变量只在局部有作用,所以没有更改全局变量name
def fucn():
global name # 使用了global方法,可以在局部空间直接修改全局空间命名
name = 'god'
fucn()
print(name) # god 因为global方法,在函数代码体执行时更改了全局变量
2.nonlocal的作用:
可以是内部局部空间修改外层局部空间变量数据
def fucn(): # 1 定义一个函数fucn
age = 18 # 3 定义变量age = 18
def fucn2(): # 4 定义一个函数fucn2
age = 20 # 6 执行函数 age=20 (局部命名仅限fucn2函数中)
fucn2() # 5 调用函数fucn2
print(age) # 7 打印 fucn函数体内age #18
fucn() # 2 调用函数fucn代码体
def fucn():
age = 18
def fucn2():
nonlocal age #使用nonlocal方法,可以更改外层局部空间数据
age = 20 # 更改了函数fucn中的数据
fucn2()
print(age) # 20
fucn()
函数名的多种用法
函数名其实也是类似一个变量名,只是一个名字和一个内存地址的链接,该地址内存放的不是数据值而是一端代码,当使用函数名后面加上()时 则会通过这个名字找到这段代码并执行
1.函数名可以用来给变量名赋值
def func():
name = 'moon'
res = func # 把函数名func绑定的内存地址 赋予了变量名 res
res()
print(res)
2.可以当做函数的实参
def func():
print('moon')
def func2(func):
print('god') #god
print(func) # 打印函数 func的绑定地址
func2(func) #把函数名func作为实参传入 func2函数里
3.可以当做函数的返回值
def func()
print('func')
def func1()
print('func1')
return func #此函数体代码立刻运行完毕,返回 func变量名的内存地址
res = func1() #func1返回值 func的地址 赋值给 res
print(res) # func函数的绑定地址
res() #func 调用res等于调用func
4.函数名也可以当做是容器类型,可以放在字典中
def register():
print('注册功能')
def login():
print('登录功能')
func_dict = {'1':register,'2':login} # 函数名被当做字典的值来处理
choice = input('请选择要执行的功能>>>')
if choice in func_dict
func_dict.get(choice)() # 如果用户输入的在功能字典中
#则调取 功能字典中键对应的值的函数地址 ()并运行
else:
print('功能不存在')
闭包函数
1,什么是闭包函数?
在函数体内部的函数,并且用到了外部函数名称空间中的名字
需要满足,定义在函数体内 并且 用到了外部函数名称空间中的名字
代码展示:
def func():
a = 1
b = 2
def func2():
print(a+b) #定义在函数体内 并且 用到了外部函数名称空间中的名字
func2()
func() # 3
2,闭包函数实际应用
给另外一种函数体代码传参的方式
2.1方式1:代码里面缺什么变量名形参里面就补什么变量名
def func(a,b):
a = a
b = b
def func2():
print(a+b) #定义在函数体内 并且 用到了外部函数名称空间中的名字
func2()
func(1,2) # 3
func(1,2)
func(1,2)
2.2闭包函数传参
def func(a, b): # 执行1 先定义一个函数
def func2():
print(a + b)
return func2 # 执行3 被调用看返回值 返回值是func2
res = func(2,3) # 执行2 先看右边 调用函数 func2被赋值给res
res() #5 执行res 等于执行 func2 所以等于5
res() #5
res = func(3,3)
res() #6
res() #6
装饰器简介
1,装饰器的概念
在!不改变被装饰对象的源代码!和!调用方式!的情况下给被装饰的对象添加新的功能
2.本质
是由 函数参数 加上 名称空间 函数名多种用法 闭包函数技术的组合产生的
3.口诀
对修改封闭 对扩展开发
4,装饰器的推导流程
import time
def index():
time.sleep(3)
print('from index')
def home():
time.sleep(1)
print('from home')
--------现在如果我们想在 index函数体代码前后添加代码-------
start_time = time.time()
index()
end_time = time.time()
print('函数index的执行时间为>>>:', end_time-start_time)
--------现在如果这段代码需要在不同地方反复使用 我们再把他们包装成函数-------
def get_time():
start_time = time.time()
index()
end_time = time.time()
print('函数index的执行时间为>>>:', end_time-start_time)
get_time()
--------现在如果这段代码需要在不同地方反复使用 并且是不同的函数体-------
def get_time(xxx): #设置一个形参
start_time = time.time()
xxx() #这样就可以根据不同传参 这里的函数也会更改
end_time = time.time()
print('函数index的执行时间为>>>:', end_time-start_time)
get_time(index)
get_time('其他实参') # 这样也就可以实现 同样的功能对不同的实参是实施
------------更加完善一点,加上闭包函数的功能---------------
def outer(xxx):
def get_time():
start_time = time.time()
xxx() #这里的xxx其实就是对应形参的xxx 因为局部空间没有这个就会在外层找
end_time = time.time()
print('函数index的执行时间为>>>:', end_time-start_time)
return get_time
res = outer(index) # 这里就是用res来接受这个闭包变量名(index) 的返回值
# 先执行outer函数体,实参为index函数,这个函数体返回值为 get_time函数,所以现在
# res = get_time 实参为 index
res()
------------更加完善一点,如果传递的函数本身还有形参---------------
import time
def index(a):
print(a)
time.sleep(3)
print('from index')
def home(a,b):
time.sleep(1)
print('from home')
def outer(xxx): #形参被传入实参 被装饰函数
def get_time(a):
start_time = time.time()
xxx(a) #局部空间没有,向外找,找到了 是index 但是这个函数需要有传参 他的传参哪里找。可以通过get_time的形参去获取,
end_time = time.time()
print('函数index的执行时间为>>>:', end_time-start_time)
return get_time
res = outer(index) # 给被装饰函数outer传参 index 然后returun了 get_time 给了 res
res(a) # res传参等于 给get_time传参 为什么要给get_time传参 因为内部函数体index需要参数。
#所以这个代码就成功运行了
------------更加完美,被装饰函数不确认有多少传参---------------
def outer(xxx): #形参被传入实参 被装饰函数
def get_time(*regs,**wregs): # 更加完善,这里可以接受任意的数据
start_time = time.time()
xxx(*regs,**wregs) #也是可以接收任意的数据
end_time = time.time()
print('函数index的执行时间为>>>:', end_time-start_time)
return get_time
res = outer(index)
res(a,2,2,3,2)
------------被装饰函数如果有返回值---------------
import time
def index(*args):
print(args)
time.sleep(2)
print('from index')
return '我是index'
def moon(a,b):
time.sleep(1)
print('from MOON')
return '我是moon'
def outer(xxx):
def get_time(*args,**kwargs):
start_time = time.time()
res = xxx(*args,**kwargs) #这里使用了res来接受这个函数体的返回值
end_time = time.time()
print('函数index的执行时间为>>>:', end_time - start_time)
return res #这里证明get_time代码运行接受返回值为 res
return get_time
res = outer(moon)
print(res(123,222)) #成功运行
装饰器固定模板
def 装饰器函数名(被装饰函数名):
def inner(*args,**kwargs):
#执行被装饰对象 之前可以做的额外操作
res = 被装饰函数名(*args,**kwargs)
#执行被装饰对象之后可以做的额外操作
return res
return inner
装饰器语法糖
def outer(func_name):
def inner(*args,**kwargs):
#执行被装饰对象 之前可以做的额外操作
res = func_name(*args,**kwargs)
#执行被装饰对象之后可以做的额外操作
return res
return inner
@outer # 这个代表 func = outer(func)
def func():
print('im func')
return 'func'
#注意一定要紧挨被装饰的函数, 会自动已被装饰函数名 来接收装饰后的结果
python装饰器初级的更多相关文章
- (十)Python装饰器
装饰器:本质就是函数,功能是为其他函数添加附加功能. 两个原则: 1.不修改被修饰函数的源代码 2.不修改被修饰函数的调用方式 一个栗子 def test(): res = 0 for i in ra ...
- 关于python装饰器
关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...
- python装饰器通俗易懂的解释!
1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...
- Python 装饰器学习
Python装饰器学习(九步入门) 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...
- python 装饰器修改调整函数参数
简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...
- python 装饰器学习(decorator)
最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...
- Python装饰器详解
python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...
- 关于python装饰器(Decorators)最底层理解的一句话
一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...
- Python装饰器由浅入深
装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...
- Python装饰器与面向切面编程
今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...
随机推荐
- CentOS7使用yum方式安装Containerd
# 安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 yum install -y yum-utils device-m ...
- 使用Prometheus和Grafana监控nacos集群
官方文档:https://nacos.io/zh-cn/docs/monitor-guide.html 按照部署文档搭建好Nacos集群 配置application.properties文件,暴露me ...
- kvm安装windows使用virtio驱动下载地址
https://dl.fedoraproject.org/pub/alt/virtio-win/latest/images/bin/deprecated-README 老版本下载地址:https:// ...
- img和div之间有间隙的原因及解决方法
div 中 存在 img标签,由于img标签的 display:inline-block 属性. #####display:inline-block布局的元素在chrome下会出现几像素的间隙,原因是 ...
- vue中修改滚动条样式
这是一个在VUE中的设置滚动条样式的方法,该方法只适用于Chrome浏览器,亲测在火狐不适用 样式写在 APP.vue 中,可以用在全局,如果只用在那个盒子中,只需要在::前面加上盒子的class名就 ...
- Mysql 数据库SQL脚本导入
1.进入mysql命令行窗口 mysql -uroot -p123456 2.展示所有数据库 show databases: 3.选择数据库 use 数据库名 4.展示选择的数据库中所有表 show ...
- python之流程控制上-if、while
流程控制 编写程序,是将自己的逻辑思想记录下来,使得计算机能够执行的过程. 而流程控制,则是逻辑结构中十分重要的一环. 在程序中,基础的流程结构分为顺序结构.分支结构.顺序结构 顺序结构自不必多说,上 ...
- 一文讲清楚 JVM Safe Point
大家好,我是树哥. 关于 Safe Point 是 JVM 中很关键的一个概念,但我估计有不少同学不是很懂.于是今天跟大家来深入聊聊 Safe Point,希望通过这篇文章能解答这样几个问题: 什么是 ...
- git中 gitignore 忽略文件操作
通常,.gitignore文件被放置在存储库的根目录中.根目录也称为父目录和当前工作目录.根文件夹包含组成项目的所有文件和其他文件夹.也就是说,您可以将它放在存储库中的任何文件夹中.你甚至可以有多个. ...
- 经典排序算法之-----选择排序(Java实现)
其他的经典排序算法链接地址:https://blog.csdn.net/weixin_43304253/article/details/121209905 选择排序思想: 思路: 1.从整个数据中挑选 ...