一,装饰器

装饰器:本质就是函数,功能是为其它的函数动态添加附加的功能

原则:对修改关闭对扩展开放

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,高阶函数,函数闭包,函数嵌套)...相关推荐

  1. 装饰着模式示例_装饰器设计模式示例

    装饰着模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原 ...

  2. python 描述器 详解_描述器使用指南

    Python 的面向对象功能是在基于函数的环境构建的.通过使用非数据描述器,这两方面完成了无缝融合. Functions stored in class dictionaries get turned ...

  3. python装饰器和异常处理_装饰器异常处理-面向对象编程-Python教程自动化开发_Python视频教程...

    课程目标:使学员掌握python基础教程知识,能够开发常用的PYTHON脚本 课程特色:实战,细致,生动,深入浅出 适用人群:适合PYTHON初学者 课程详情:该Python视频教程从0基础开始讲解P ...

  4. java类加载器 架构 设计_类加载器(DexClassLoader)与插件化(动态加载)

    类加载器与插件化解析 2.1 类装载器 DexClassLoader 首先,我们需要了解关于java代码本地import的一些知识: import中所引用的类有两个特点: 1.必须存在于本地,当程序运 ...

  5. fusion构建器代码语法_构建器模式:适用于代码,适用于测试

    fusion构建器代码语法 我发现构建器设计模式偶尔在代码中有用,但在测试中经常有用. 本文简要概述了该模式,然后介绍了在测试中使用该模式的一个有效示例. 请参阅github中的代码. 生成器模式的背 ...

  6. 拼装机器人感想_拼装机器人 感受未来科技

    合影 手把手指导 紧张比赛中 提到机器人,你最先想到的是什么?繁琐的拼装.复杂的编程.机械一般的话语?其实并没有那么无趣,机器人比想象中更加有趣一些.这一次我们将带领我们的小记者提前走进未来,感受未来 ...

  7. Android原生视频播放器下载,视频播放器:VideoPlayer下载_视频播放器:VideoPlayer官方下载【手机安卓版】-华军软件园...

    视频播放器:Video Player是最简单.高效的手机视频文件播放器.VideoPlayer可以支持大部分格式的视频及音频多媒体文件,如光盘,设备和网络流媒体.我们确保你的多媒体文件在原分辨率下播放 ...

  8. java基础类加载器_Java基础之类加载器

    1. 什么是类加载器? 加载类的工具. 2. Java虚拟机中可以安装多个类加载器,系统默认三个主要的类加载器,每个类负责加载特定位置的类: BootStrap,ExtClassLoader,AppC ...

  9. java拦截器没有生效_拦截器不生效

    解决思路: 1.SpringMVC springMVC容器中需要添加相关配置,其中的 authenticationInterceptor就是目标拦截器 2.SpringBoot SpringBoot中 ...

最新文章

  1. 淘宝服务端高并发分布式架构演进之路
  2. Struts2源码阅读(一)_Struts2框架流程概述
  3. python跨文件复制sheet_Python办公自动化-工作表复制(可跨文件)
  4. AdaBoost详解
  5. Beetl学习总结(3)——高级功能
  6. Spring Cloud with Turbine
  7. Spring Boot 2.0 Intellij Idea 中图文详解打包成可执行Jar
  8. 算法与数据结构 第3章 高级排序算法中 归并算法改进
  9. 如何使用Firepath工具方法定位元素
  10. 装机电脑用什么软件测试,有什么一键装机的软件比较好用?
  11. 输入法里打出特殊符号
  12. 机器学习之网格搜索(GridSearch)及参数说明,实例演示
  13. Crystal Reports - Add Subreport
  14. 实现原理 扫描枪_条码扫描枪原理
  15. 如何在WordPress中添加免费实时聊天(简便方法)
  16. Centos下安装Pure-ftpd
  17. 51单片机C语言访问外ram,C51中访问外部RAM的方法
  18. 《快学Scala》第二章练习题答案+概述
  19. c语言基础代码(基础代码编程)
  20. 不完美才美—少有人知道的幸福之路

热门文章

  1. springboot 集成logback
  2. angular5 清除定时器
  3. Android面试收集录12 View测量、布局及绘制原理
  4. 【Python算法】哈希存储、哈希表、散列表原理
  5. 如果你是合格的程序员或者你认为自己是计算机科学家
  6. Quill编辑器IOS下无法获取焦点的解决方法
  7. 全球项目多区域数据同步问题解决方案
  8. 解决Spring boot中读取属性配置文件出现中文乱码的问题
  9. 解决苹果APP审核需要的IPv6地址的问题
  10. eclipse导入项目后出现红色叉号的解决方案