python高阶函数闭包装饰器_Python_基础_(装饰器,*args,**kwargs,高阶函数,函数闭包,函数嵌套)...
一,装饰器
装饰器:本质就是函数,功能是为其它的函数动态添加附加的功能
原则:对修改关闭对扩展开放
1.不修改被修饰函数的源代码
2.不修改被修改函数的调用方式
装饰器实现的知识储备:高阶函数,函数嵌套,函数闭包
## 高阶函数
# 高阶函数的定义:
1:函数接收的参数是一个参数名
2:函数的返回值是一个函数名
3:满足上述的任意一个条件,都可以称为高阶函数
一,函数接收的参数是一个参数名
deforder():print("我是函数order")deftest(func):print(func) #
func() #我是函数order
test(order)#函数的实参是一个函数名,所以接收的参数是一个函数名
二,函数的返回值是一个参数名
#下方程序不合格,函数会重复执行两次(order函数执行两次)
importtimedeforder():
time.sleep(4)print("我是函数order")deftest(func):
start_time=time.time()
func()#我是函数order
stop_time =time.time()print("函数 %s 的执行是将为%s" %(func,(stop_time -start_time)))return func #返回值为函数名
test_order=test(order)
test_order()#相当于执行函数 order
#输出结果
我是函数order
函数 的执行是将为4.035168170928955我是函数order
## 函数嵌套
## 函数闭包
## 装饰器的架子
deftimmer(func):defwrapper():print(func)
func()return wrapper
# 下方的程序解决了重复执行函数问题
# 下方程序的问题是:对所要计算执行时间的函数都得加上 test = timmer(test)
importtimedeftimmer(func):defwrapper():
start_time=time.time()
func()#运行的为test函数
stop_time =time.time()print("程序运行的时间%s"%(start_time-stop_time))returnwrapperdeftest():
time.sleep(3)print("test函数执行完毕")
test= timmer(test) #返回函数wrapper地址
test() #执行的时wrapper
#结果
test函数执行完毕
程序运行的时间-3.000077962875366
## 语法糖
# @timmer 相当于 test = timmer(test)
# 当哪个函数需要加上装饰器,则在函数的上方加上@xxxx 语法糖
importtimedeftimmer(func):defwrapper():
start_time=time.time()
func()#运行的为test函数
stop_time =time.time()print("程序运行的时间%s"%(start_time-stop_time))returnwrapper
@timmerdeftest():
time.sleep(3)print("test函数执行完毕")
test()#执行的是wrapper
# 当被装饰的函数的参数变化时,装饰器的参数也得变化
importtimedeftimmer(func):defwrapper(name,age):
start_time=time.time()
func(name,age)#运行的为test函数
stop_time =time.time()print("程序运行的时间%s"%(start_time-stop_time))print(name,age)returnwrapper
@timmerdeftest(name,age):
time.sleep(3)print("test函数执行完毕")
test("henry",18)
@timmerdeftest2(name,age,addr):
time.sleep(3)print("test2函数执行完毕")
test2("heihei","16","China")#程序报错:当被装饰的函数有三个实参时,装饰器中也得有对应的形参
# 使用 *args,**kwargs解决,当被装饰的函数的参数变化时,装饰器的参数也得变化的问题
importtimedeftimmer(func):def wrapper(*args,**kwargs):
start_time=time.time()
func(*args,**kwargs) #运行的为test函数
stop_time =time.time()print("程序运行的时间%s"%(start_time-stop_time))print(*args,**kwargs)returnwrapper
@timmerdeftest(name,age):
time.sleep(3)print("test函数执行完毕")
test("henry",18)
@timmerdeftest2(name,age,addr):
time.sleep(3)print("test2函数执行完毕")
test2("heihei","16","China") #程序不在报错
#输出
test函数执行完毕
程序运行的时间-3.000153064727783henry18test2函数执行完毕
程序运行的时间-3.0007944107055664heihei16 China
## 浅浅了解*args与**kwargs
*args:将多个实参放入一个元组中,可以传多个参数
**kwargs:按照关键字传值,将多余的值以字典的形式传递
## *agrs
## 将实参与形参对应的按位置传值,多出来的给grgs#示例1
def test(a,*args):print(a)print(args)
test(1,2,3,4,5,6,7)#输出
1(2, 3, 4, 5, 6, 7)--------------------------------------------------------------
#示例2(位置参数,默认参数,*args)
def test(a,b = 1 ,*args):print(a)print(b)print(args)
test(1,2,3,4,5,6,7) #1给了a,b=1的值被重置为2,其余的给了args#输出
1
2(3, 4, 5, 6, 7)-------------------------------------------------------------
#示例3(位置参数,*args,默认参数)
def test(a,*args,b = 1):print(a)print(b)print(args)
test(1,2,3,4,5,6,7)#输出
1
1(2, 3, 4, 5, 6, 7)
示例代码
## **kwargs(形参中按关键字传值,多余的以自定的形式传递)
#示例1 将所有的值给了args
def test(*args,**kwargs):print(args)print(kwargs)
test(1,2,3,4,5)#输出
(1, 2, 3, 4, 5)
{}---------------------------------------------------------
#示例2
def test1(a,**kwargs):print(a)print(kwargs)
test1(1,b=2,c=3,d=4)#输出 将1给了a,将其余的以字典的形式给了Kwargs
1{'b': 2, 'c': 3, 'd': 4}-------------------------------------------------------
#示例3
def test3(a,*args,**kwargs):print(a)print(args)print(kwargs)
test3(1,2,3,4,5,b=6,c=7)#输出
1(2, 3, 4, 5)
{'b': 6, 'c': 7}-----------------------------------------------------
#错误示例
def test4(z,**kwargs,*args):print(z)print(kwargs)print(args)
test4(1,y=2,3,4,5)#报错 SyntaxError: invalid syntax
示例代码
小小补充:
num_l = [1,2,3,4,5,6,7,8]
a,*b,c =num_lprint(a)print(b)print(c)#输出
1[2, 3, 4, 5, 6, 7]8注:
普通调换两个数
a= 1b= 2c=a
a=b
b=a
Python中的一一对应
a,b= b,a
## 携带参数的装饰器
importtimedef timmer_test(file_type="aaa"):deftimmer(func):def wrapper(*args,**kwargs):if file_type == "aaa":#执行不同的功能
print("携带的参数为aaa")elif file_type == "bbb":print("携带的参数为bbb")
start_time=time.time()
res= func(*args,**kwargs) #运行的为test函数
stop_time =time.time()print("程序运行的时间%s"%(start_time-stop_time))returnresreturnwrapperreturntimmer
@timmer_test(file_type="aaa") #timmer = timmer_test(file_type="aaa") 最终的结果还是@timmer,已经附加一个file_type
deftest1():
time.sleep(3)print("test函数执行完毕")
@timmer_test(file_type="bbb") #携带不同的参数 执行不同的功能
deftest2():
time.sleep(2)print("test函数执行完毕")
test1()
test2()#输出
携带的参数为aaa
test函数执行完毕
程序运行的时间-3.0003297328948975携带的参数为bbb
test函数执行完毕
程序运行的时间-2.00068998336792
python高阶函数闭包装饰器_Python_基础_(装饰器,*args,**kwargs,高阶函数,函数闭包,函数嵌套)...相关推荐
- 装饰着模式示例_装饰器设计模式示例
装饰着模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原 ...
- python 描述器 详解_描述器使用指南
Python 的面向对象功能是在基于函数的环境构建的.通过使用非数据描述器,这两方面完成了无缝融合. Functions stored in class dictionaries get turned ...
- python装饰器和异常处理_装饰器异常处理-面向对象编程-Python教程自动化开发_Python视频教程...
课程目标:使学员掌握python基础教程知识,能够开发常用的PYTHON脚本 课程特色:实战,细致,生动,深入浅出 适用人群:适合PYTHON初学者 课程详情:该Python视频教程从0基础开始讲解P ...
- java类加载器 架构 设计_类加载器(DexClassLoader)与插件化(动态加载)
类加载器与插件化解析 2.1 类装载器 DexClassLoader 首先,我们需要了解关于java代码本地import的一些知识: import中所引用的类有两个特点: 1.必须存在于本地,当程序运 ...
- fusion构建器代码语法_构建器模式:适用于代码,适用于测试
fusion构建器代码语法 我发现构建器设计模式偶尔在代码中有用,但在测试中经常有用. 本文简要概述了该模式,然后介绍了在测试中使用该模式的一个有效示例. 请参阅github中的代码. 生成器模式的背 ...
- 拼装机器人感想_拼装机器人 感受未来科技
合影 手把手指导 紧张比赛中 提到机器人,你最先想到的是什么?繁琐的拼装.复杂的编程.机械一般的话语?其实并没有那么无趣,机器人比想象中更加有趣一些.这一次我们将带领我们的小记者提前走进未来,感受未来 ...
- Android原生视频播放器下载,视频播放器:VideoPlayer下载_视频播放器:VideoPlayer官方下载【手机安卓版】-华军软件园...
视频播放器:Video Player是最简单.高效的手机视频文件播放器.VideoPlayer可以支持大部分格式的视频及音频多媒体文件,如光盘,设备和网络流媒体.我们确保你的多媒体文件在原分辨率下播放 ...
- java基础类加载器_Java基础之类加载器
1. 什么是类加载器? 加载类的工具. 2. Java虚拟机中可以安装多个类加载器,系统默认三个主要的类加载器,每个类负责加载特定位置的类: BootStrap,ExtClassLoader,AppC ...
- java拦截器没有生效_拦截器不生效
解决思路: 1.SpringMVC springMVC容器中需要添加相关配置,其中的 authenticationInterceptor就是目标拦截器 2.SpringBoot SpringBoot中 ...
最新文章
- 淘宝服务端高并发分布式架构演进之路
- Struts2源码阅读(一)_Struts2框架流程概述
- python跨文件复制sheet_Python办公自动化-工作表复制(可跨文件)
- AdaBoost详解
- Beetl学习总结(3)——高级功能
- Spring Cloud with Turbine
- Spring Boot 2.0 Intellij Idea 中图文详解打包成可执行Jar
- 算法与数据结构 第3章 高级排序算法中 归并算法改进
- 如何使用Firepath工具方法定位元素
- 装机电脑用什么软件测试,有什么一键装机的软件比较好用?
- 输入法里打出特殊符号
- 机器学习之网格搜索(GridSearch)及参数说明,实例演示
- Crystal Reports - Add Subreport
- 实现原理 扫描枪_条码扫描枪原理
- 如何在WordPress中添加免费实时聊天(简便方法)
- Centos下安装Pure-ftpd
- 51单片机C语言访问外ram,C51中访问外部RAM的方法
- 《快学Scala》第二章练习题答案+概述
- c语言基础代码(基础代码编程)
- 不完美才美—少有人知道的幸福之路