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中DOM方法的动态性
Apr 11 Python
Python实现建立SSH连接的方法
Jun 03 Python
python的turtle库使用详解
May 10 Python
Django模板导入母版继承和自定义返回Html片段过程解析
Sep 18 Python
Pandas时间序列:重采样及频率转换方式
Dec 26 Python
pytorch 获取tensor维度信息示例
Jan 03 Python
Python 自由定制表格的实现示例
Mar 20 Python
Python 实现打印单词的菱形字符图案
Apr 12 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
May 11 Python
Python基于xlutils修改表格内容过程解析
Jul 28 Python
Python连接Impala实现步骤解析
Aug 04 Python
selenium判断元素是否存在的两种方法小结
Dec 07 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
截获网站title标签之家内容的例子
2006/10/09 PHP
人尽可用的Windows技巧小贴士之下篇
2007/03/22 PHP
php提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法
2012/03/27 PHP
php array的学习笔记
2012/05/10 PHP
php检测用户是否用手机(Mobile)访问网站的类
2014/01/09 PHP
php过滤HTML标签、属性等正则表达式汇总
2014/09/22 PHP
简单实用的PHP防注入类实例
2014/12/05 PHP
php生成验证码函数
2015/10/20 PHP
mac系统下安装多个php并自由切换的方法详解
2017/04/21 PHP
PHP删除数组中指定下标的元素方法
2018/02/03 PHP
用js实现table单元格高宽调整,兼容合并单元格(兼容IE6、7、8、FF)实例
2013/06/25 Javascript
关于删除时的提示处理(确定删除吗)
2013/11/03 Javascript
JavaScript支持的最大递归调用次数分析
2014/06/24 Javascript
jquery获取input type=text中的值的各种方式(总结)
2016/12/02 Javascript
jQuery基于Ajax方式提交表单功能示例
2017/02/10 Javascript
详解微信第三方小程序代开发
2017/06/23 Javascript
input type=file 选择图片并且实现预览效果的实例
2017/10/26 Javascript
vue按需加载组件webpack require.ensure的方法
2017/12/13 Javascript
Vue.js实现表格渲染的方法
2018/09/07 Javascript
npm scripts 使用指南详解
2018/10/08 Javascript
Jquery+javascript实现支付网页数字键盘
2020/12/21 jQuery
python中requests使用代理proxies方法介绍
2017/10/25 Python
Python实现简单生成验证码功能【基于random模块】
2018/02/10 Python
深入理解Python爬虫代理池服务
2018/02/28 Python
Python flask框架实现查询数据库并显示数据
2020/06/04 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
2020/07/05 Python
django序列化时使用外键的真实值操作
2020/07/15 Python
Omio葡萄牙:全欧洲低价大巴、火车和航班搜索和比价
2019/02/09 全球购物
自我评价怎么写正确呢?
2013/12/02 职场文书
办公室前台岗位职责
2014/01/04 职场文书
Golang二维切片初始化的实现
2021/04/08 Golang
golang 实现时间戳和时间的转化
2021/05/07 Golang
写好Python代码的几条重要技巧
2021/05/21 Python
tensorboard 可视化之localhost:6006不显示的解决方案
2021/05/22 Python
Python 数据科学 Matplotlib图库详解
2021/07/07 Python
OpenStack虚拟机快照和增量备份实现方法
2022/04/04 Servers