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装饰器与面向切面编程
今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...
随机推荐
- 创建多个节点的集群 - Elastic Stack 8.0
文章转载自:https://mp.weixin.qq.com/s/k6u9Q2nebW9qgZMghQwJng 详述如何安装3个节点的 Elasticsearch 集群.我将使用 Docker 来进行 ...
- Kibana插件
附加的功能在 Kibana 中是以插件的形式提供的.您可以利用 bin/kibana-plugin 命令来管理这些模块.您也可以手动安装这些插件,只需要将这些插件包放到 plugins 目录并解压到新 ...
- flutter系列之:查询设备信息的利器:MediaQuery
目录 简介 MediaQuery详解 MediaQuery的属性 MediaQuery的构造函数 MediaQuery的使用 总结 简介 移动的开发中,大家可能最头疼的就是不同设备的规格了,现在设备这 ...
- Go微服务实战 - 从0到1搭建一个类Instagram应用(持续更新)
概要 近几年各大移动应用基本都有社区Community(或动态Moments)的功能,展现形式各不相同,比如 国内的有:微博.朋友圈.抖音.小红书.keep.绿洲.即刻等 国外的有:Instagram ...
- Java代码审计之实战某博客
对某博客的代码审计 在gitee上面找了一个个人博客项目,来进行实战代码审计,主要还是学习为主 技术菜菜,哪里错误希望师傅们指正 1.SQL注入 先了解Java Web中的数据传输流程 graph T ...
- Spring Ioc容器xml配置
Spring Ioc容器xml配置基本结构: <?xml version="1.0" encoding="UTF-8"?> <beans xm ...
- HNOI2008GT考试
题目链接 考虑dp,f(i,j)表示做到了第i位(共n位),当前的后缀串与A1~Aj相匹配 接下来的方案数.转移的话枚举一个k=0~9表示这位选什么,如果选了以后,匹配的位置会改变到 j' ,j'可以 ...
- 微服务开发框架-----Apache Dubbo
文章目录 一.简介 二.概念与架构 一.简介 Apache Dubbo 是一款微服务开发框架,提供了RPC通信与微服务治理两大关键能力.使用Dubbo开发的微服务,将具备相互之间的远程发现与通信能力, ...
- 使用 Windows Core Audio APs 进行 Loopback Recording 并生成 WAV 文件
参考文档 COM Coding Practices Audio File Format Specifications Core Audio APIs Loopback Recording #inclu ...
- sql语法巧用之not取反
数据库的重要性和通用性都不用说了,什么sql的通用性,sql优化之类的也不必说了,咱们今天来聊聊另一个有意思的话题:如何取一个筛选的反面案例. 1. 举几个正反案例的例子 为了让大家理解我们的假设场景 ...