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类的基础入门知识
Nov 24 Python
Hadoop中的Python框架的使用指南
Apr 22 Python
Django框架下在视图中使用模版的方法
Jul 16 Python
Python黑魔法Descriptor描述符的实例解析
Jun 02 Python
Python+pandas计算数据相关系数的实例
Jul 03 Python
Flask之flask-session的具体使用
Jul 26 Python
java中的控制结构(if,循环)详解
Jun 26 Python
Python Pandas 箱线图的实现
Jul 23 Python
利用PyQt中的QThread类实现多线程
Feb 18 Python
Anaconda+vscode+pytorch环境搭建过程详解
May 25 Python
python操作链表的示例代码
Sep 27 Python
正确的理解和使用Django信号(Signals)
Apr 14 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
php的控制语句
2006/10/09 PHP
Yii中CGridView禁止列排序的设置方法
2016/07/12 PHP
手把手编写PHP框架 深入了解MVC运行流程
2016/09/19 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
2019/06/03 PHP
php中isset与empty函数的困惑与用法分析
2019/07/05 PHP
PHP 面向对象程序设计之类属性与类常量实现方法分析
2020/04/13 PHP
js常用代码段收集
2011/10/28 Javascript
解析prototype,JQuery中跳出each循环的方法
2013/12/12 Javascript
jquery实现鼠标滑过显示提示框的方法
2015/02/05 Javascript
jQuery实现表格与ckeckbox的全选与单选功能
2016/11/24 Javascript
js省市区级联查询(插件版&amp;无插件版)
2017/03/21 Javascript
js和jquery中获取非行间样式
2017/05/05 jQuery
jQuery插件imgAreaSelect基础讲解
2017/05/26 jQuery
JavaScript定义函数_动力节点Java学院整理
2017/06/27 Javascript
代码详解Vuejs响应式原理
2017/12/20 Javascript
js监听html页面的上下滚动事件方法
2018/09/11 Javascript
微信小程序实现时间预约功能
2018/11/27 Javascript
10种JavaScript最常见的错误(小结)
2019/06/21 Javascript
Vue2.0实现简单分页及跳转效果
2019/07/29 Javascript
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
2019/08/08 jQuery
javascript-hashchange事件和历史状态管理实例分析
2020/04/18 Javascript
javascript 数组(list)添加/删除的实现
2020/12/17 Javascript
[50:50]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第一场 12.10
2020/12/13 DOTA
Python时间戳与时间字符串互相转换实例代码
2013/11/28 Python
Python 列表list使用介绍
2014/11/30 Python
Python中使用ElementTree解析XML示例
2015/06/02 Python
python读取excel表格生成erlang数据
2017/08/26 Python
Pycharm 2019 破解激活方法图文详解
2019/10/11 Python
Python使用matplotlib绘制Logistic曲线操作示例
2019/11/28 Python
Parfume Klik丹麦:香水网上商店
2018/07/10 全球购物
戴尔新加坡官网:Dell Singapore
2020/12/13 全球购物
四年级数学教学反思
2014/02/02 职场文书
人事专员工作职责
2014/02/22 职场文书
扬尘污染防治方案
2014/06/15 职场文书
停水通知
2015/04/16 职场文书
让人瞬间清醒的句子,句句经典,字字如金
2019/07/08 职场文书