Python闭包装饰器使用方法汇总


Posted in Python onJune 29, 2020

闭包内容:

匿名函数:能够完成简单的功能,传递这个函数的引用,只有功能

普通函数:能够完成复杂的功能,传递这个函数的引用,只有功能

闭包:能够完成较为复杂的功能,传递这个闭包中的函数以及数据,因此传递是功能+数据

对象:能够完成最复杂的功能,传递很多数据+很多功能,因此传递的是数据+功能

———————————————————

对全局函数进行修改:在函数当中加global,在闭包中外边中的变量加nonlocal

闭包定义:有两个函数嵌套使用,里面的函数可以使用外面函数所传输的参数,最后可传递的是里面函数的结构与数据(个人理解)。

最后闭包可以在python中引申出装饰器 ———————————————————

def closure():
  # 在函数内部再定义一个函数,
  # 并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包
  def closure_in(x):
    print('---------我是打不死的%s--------' %x)
  return closure_in
​
x = closure()
x('小强')
​
print('*'*20)
# -----加餐---------
def closure_1(a,b,c):
  def closure_on(x):
    print('-----%s加餐-------' %b)
    print(a*x + c)
  return closure_on
​
demo = closure_1(2,'小强',3) #传closure_1函数
demo(4) #传clsure_on函数
​
#注:函数不加括号,调用的是函数本身【function】;函数加括号,调用的是函数的return结果。

装饰器内容:

代码要遵守‘开放封闭'原则;对已经写好的函数遵守封闭,对功能扩展遵守开放;

# 装饰器的作用:为了对原来的代码上进行扩展
def decoration(func):
  def call_func():
    print('-------正在装饰 -------' )
    func()
  return call_func
​
#@decoration   #--->demo_new = decoration(demo)
def demo():
  print('demo----')
​
demo_new = decoration(demo)
demo_new()

使用装饰器来测试一个函数的运行时:

import time
def set_func(func):
  def call_func():
    start_time = time.time()
    func()
    stop_func = time.time()
    print(‘alltimes is %f' %(stop_func-start_fun))
  return call_func
@set_func
def test1():
  print(‘——-test1———')
test1()
​
#等价于:
@set_func==test1 = set_func(test1)

1. 没有参数,没有返回值的函数进行装饰:

def set_func(func):
  def call_func():
    print(‘———test2——-')
    print(‘———-test3——')
    func()
  return call_func

@set_func
def test1():
  print(‘——test1——-  ')

2. 对有参数无返回值的函数进行装饰:

def set_func(func):
  def call_func(a): #变
    print(‘———test2——-')
    print(‘———-test3——')
    func(a) #变
  return call_func

@set_func
def test1(num):
  print(‘——test1——- %d  ' %num)
​
test1(100) —->call_func(100)
test1(200)——>call_func(200)

复现装饰器原理:

————————————————————————-

只要遇到@函数 装饰器(这句话),在程序中就已经执行了!!

3. 不定长参数的函数装饰:

def set_func(func):
  def call_func(*args,**kwargs): #变
    print(‘———test2——-')
    print(‘———-test3——')
    func(*args,**kwargs) #(拆包)将元祖拆开,每个进行传输;
    #func(args,kwargs)—>不行,相当于传递了两个参数:一个元祖,一个字典。
  return call_func
@set_func
def test1(num,*args,**kwargs):
  print(‘——test1——- %d  ' %num)
  print(‘——test1——-  ' , args)
  print(‘——test1——- ' ,kwargs )
test1(100)
test1(100,200)
test1(100,200,300,mm=100)

注意:*args保存不定长参数,以元祖保存,**kwargs保存字典形式(mm=...)

4.对应的返回值参数进行装饰、通用装饰器:

#通用装饰器
def set_func(func):
  print(“开始进行装饰———-”)
  def call_func(*args,**kwargs): #变
    print(‘———test2——-')
    print(‘———-test3——')
    return func(*args,**kwargs) #(拆包)将元祖拆开,每个进行传输;如果没有return ret返回none。
    #func(args,kwargs)—>不行,相当于传递了两个参数:一个元祖,一个字典。
  return call_func

@set_func
def test1(num,*args,**kwargs):
  print(‘——test1——- %d  ' %num)
  print(‘——test1——-  ' , args)
  print(‘——test1——- ' ,kwargs )
  return ‘ok'  #—-返回给上面的func(),然后return func—ret
ret = test1(100)

5. 多个装饰器对同一个函数进行装饰:

def add_qx(func):
  print(“——开始进行装饰权限1———-”)
  def call_func(*args,**kwargs): #变
    print(‘这是权限验证1')
    return func(*args,**kwargs)
  return call_func

​
def add_xx(func):
  print(“——开始进行装饰xx功能———-”)
  def call_func(*args,**kwargs): #变
    print(‘这是xx权限验证')
    return func(*args,**kwargs)
  return call_func
@add_qx
@add_xx
def test1():
  print(‘——test1——-')
test1()

首先执行第一个,但是第一个装饰器下面不是函数(装饰器原则:下面必须是函数,否则不执行),所以第一个函数先等待,等第二个装饰器执行后形成函数在交给第一个装饰器;所以运行结果是:

开始进行装饰xx的功能,

开始进行装饰权限1,

这是权限验证1,

这是xx权限验证,

——-test1——-,

——————装饰器练习—————- 输出格式:<td><h1>haha</h1></td>

def set_func_1(func):
  def call_func():
    return ‘<h1>' + func() + '</h1>'
  return call_func

​
def set_func_2(func):
  def call_func():
    return ‘<td>' + func() + '</td>'
  return call_func

@set_func_1()
@set_func_2()
def get_str():
  return ‘haha'

print(get_str())
最后执行的效果: <h1><td>haha</td></h1>

6. 用类对函数进行装饰(了解):

class Test(object):
  def __init__(self,func):
    self.func = fun

  def __call__(self):
    print(‘这里是装饰器的功能。。。。')
    return self.func()

@Test
def get_str():
  return ‘haha'

print(get_str())

以上就是装饰器与闭包的全部内容

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python学习必备知识汇总
Sep 08 Python
Python实现绘制双柱状图并显示数值功能示例
Jun 23 Python
Django model反向关联名称的方法
Dec 15 Python
Python设计模式之命令模式原理与用法实例分析
Jan 11 Python
Django JWT Token RestfulAPI用户认证详解
Jan 23 Python
python挖矿算力测试程序详解
Jul 03 Python
Python K最近邻从原理到实现的方法
Aug 15 Python
解决python明明pip安装成功却找不到包的问题
Aug 28 Python
通过实例解析Python文件操作实现步骤
Sep 21 Python
利用Python实现学生信息管理系统的完整实例
Dec 30 Python
ASP.NET Core中的配置详解
Feb 05 Python
一篇文章带你搞懂Python类的相关知识
May 20 Python
使用已经得到的keras模型识别自己手写的数字方式
Jun 29 #Python
Python接口测试环境搭建过程详解
Jun 29 #Python
python字典的值可以修改吗
Jun 29 #Python
python怎么自定义捕获错误
Jun 29 #Python
python打开文件的方式有哪些
Jun 29 #Python
解决tensorflow/keras时出现数组维度不匹配问题
Jun 29 #Python
python中如何写类
Jun 29 #Python
You might like
日本十大科幻动漫 宇宙骑士垫底,第一已成经典
2020/03/04 日漫
php权重计算方法代码分享
2014/01/09 PHP
php分页代码学习示例分享
2014/02/20 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
2016/04/21 PHP
thinkphp框架下404页面设置 仅三步
2016/05/14 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
PHP number_format函数原理及实例解析
2020/07/14 PHP
setTimeout和setInterval的区别你真的了解吗?
2011/03/31 Javascript
jQuery源码中的chunker 正则过滤符分析
2012/07/31 Javascript
javaScript中定义类或对象的五种方式总结
2016/12/04 Javascript
Angular6 正则表达式允许输入部分中文字符
2018/09/10 Javascript
vue 实现根据data中的属性值来设置不同的样式
2020/08/04 Javascript
原生JavaScript实现留言板
2021/01/10 Javascript
[01:03:54]Liquid vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python中删除文件的程序代码
2011/03/13 Python
python3访问sina首页中文的处理方法
2014/02/24 Python
Python正则简单实例分析
2017/03/21 Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
2017/09/26 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
2018/02/11 Python
使用Python爬取最好大学网大学排名
2018/02/24 Python
利用Python在一个文件的头部插入数据的实例
2018/05/02 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
2019/06/21 Python
Python pickle模块实现对象序列化
2019/11/22 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
关于python中的xpath解析定位
2020/03/06 Python
Selenium向iframe富文本框输入内容过程图解
2020/04/10 Python
使用python创建Excel工作簿及工作表过程图解
2020/05/27 Python
使用keras时input_shape的维度表示问题说明
2020/06/29 Python
用Python自动清理系统垃圾的实现
2021/01/18 Python
css3背景图片透明叠加属性cross-fade简介及用法实例
2013/01/08 HTML / CSS
Canvas globalCompositeOperation
2018/12/18 HTML / CSS
记一次高分屏下canvas模糊问题
2020/02/17 HTML / CSS
上海微创软件面试题
2012/06/14 面试题
采购内勤岗位职责
2013/12/10 职场文书
小学校园活动策划
2014/01/30 职场文书
地陪导游欢迎词
2015/01/26 职场文书