Python装饰器用法与知识点小结


Posted in Python onMarch 09, 2020

本文实例讲述了Python装饰器用法与知识点。分享给大家供大家参考,具体如下:

(1)装饰器含参数,被装饰函数不含(含)参数

实例代码如下:

import time
# 装饰器函数
def wrapper(func):
  def done(*args,**kwargs):
    start_time = time.time()
    func(*args,**kwargs)
    stop_time = time.time()
    print('the func run time is %s' % (stop_time - start_time))
  return done
# 被装饰函数1
@wrapper
def test1():
  time.sleep(1)
  print("in the test1")
# 被装饰函数2
@wrapper
def test2(name):  #1.test2===>wrapper(test2)  2.test2(name)==dome(name)
  time.sleep(2)
  print("in the test2,the arg is %s"%name)
# 调用
test1()
test2("Hello World")

(2)装饰器含有参数,被装饰函数含(不含)参数

import time
user,passwd = 'admin','admin'
def auth(auth_type):
  print("auth func:",auth_type)
  def outer_wrapper(func):
    def wrapper(*args, **kwargs):
      print("wrapper func args:", *args, **kwargs)
      if auth_type == "local":
        username = input("Username:").strip()
        password = input("Password:").strip()
        if user == username and passwd == password:
          print("\033[32;1mUser has passed authentication\033[0m")
          res = func(*args, **kwargs) # from home
          print("---after authenticaion ")
          return res
        else:
          exit("\033[31;1mInvalid username or password\033[0m")
      elif auth_type == "ldap":
        print("ldap链接")
    return wrapper
  return outer_wrapper
@auth(auth_type="local") # home = wrapper()
def home():
  print("welcome to home page")
  return "from home"
@auth(auth_type="ldap")
def bbs():
  print("welcome to bbs page"
print(home()) #wrapper()
bbs()

总结:

(1)装饰器实质为函数内嵌,返回函数地址。

(2)装饰器带参数与不带参数相比装饰器带参数的多了一层函数定义用于接收装饰器中传递的参数,其余基本相同。

(3)先验证装饰器中的参数,在验证普通函数的参数

小知识:

列表生产式:[i for i in range(5)]---->[0,1,2,3,4,5]

生成器与迭代器:

第一种方式通过括号的方式生成

生成器:()---(i for i in range(5))  ==>generator

这种一边循环一边计算的机制,称为生成器:generator。

生成器只有在调用时才会生成相应的数据,只记录当前位置。

只有一个__next__()方法

第二种方式通过yield生成

在函数中使用yield即可将一个函数变为一个生成器

迭代器:

直接作用于for循环的数据类型:

一类是集合数据类型,如list、tuple、dict、set、str等;

一类是generator,包括生成器和带yield的generator function。

直接作用于for循环的对象统称为可迭代对象:Iterable。

可以使用isinstance()判断一个对象是否是Iterable对象

from collections import Iterable
 isinstance([], Iterable)=========true

*可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

可以使用isinstance()判断一个对象是否是Iterator对象:

>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
======>True

生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。

把list、dict、str等Iterable变成Iterator可以使用iter()函数:

例如:iter([])<====迭代器

Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

小结:

凡是可作用于for循环的对象都是Iterable类型;

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
在Docker上开始部署Python应用的教程
Apr 17 Python
python实现一个简单的ping工具方法
Jan 31 Python
selenium+python环境配置教程详解
May 28 Python
利用python numpy+matplotlib绘制股票k线图的方法
Jun 26 Python
TensorFlow内存管理bfc算法实例
Feb 03 Python
使用Python实现牛顿法求极值
Feb 10 Python
使用遗传算法求二元函数的最小值
Feb 11 Python
python实现一个猜拳游戏
Apr 05 Python
python代数式括号有效性检验示例代码
Oct 04 Python
用python写PDF转换器的实现
Oct 29 Python
Python 实现进度条的六种方式
Jan 06 Python
Python多线程实用方法以及共享变量资源竞争问题
Apr 12 Python
Django中的session用法详解
Mar 09 #Python
python实现引用其他路径包里面的模块
Mar 09 #Python
python+opencv边缘提取与各函数参数解析
Mar 09 #Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
Mar 09 #Python
Pycharm+Python工程,引用子模块的实现
Mar 09 #Python
python的sys.path模块路径添加方式
Mar 09 #Python
python游戏开发的五个案例分享
Mar 09 #Python
You might like
DSP接收机前端设想
2021/03/02 无线电
?算你??的 PHP 程式大小
2006/12/06 PHP
一步一步学习PHP(2)――PHP类型
2010/02/15 PHP
关于js与php互相传值的介绍
2013/06/25 PHP
php检测文件编码的方法示例
2014/04/25 PHP
不用MOUSEMOVE也能滑动啊
2007/05/23 Javascript
让innerText在firefox火狐和IE浏览器都能用的写法
2011/05/14 Javascript
js实现正则匹配中文标点符号的方法
2015/12/23 Javascript
Vue的MVVM实现方法
2017/08/16 Javascript
使用vue点击li,获取当前点击li父辈元素的属性值方法
2018/09/12 Javascript
原生js添加一个或多个类名的方法分析
2019/07/30 Javascript
在Vue里如何把网页的数据导出到Excel的方法
2020/09/30 Javascript
vue3为什么要用proxy替代defineProperty
2020/10/19 Javascript
[03:02]辉夜杯主赛事第二日 每日之星
2015/12/27 DOTA
[01:36:19]Secret vs NB 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
Python写入CSV文件的方法
2015/07/08 Python
Python 闭包的使用方法
2017/09/07 Python
python3+PyQt5重新实现QT事件处理程序
2018/04/19 Python
html5 Canvas实现图片旋转的示例
2018/01/15 HTML / CSS
如何启动时不需输入用户名与密码
2014/05/09 面试题
Java如何格式化日期
2012/08/07 面试题
介绍一下MYSQL常用的优化技巧
2012/10/25 面试题
光电信息专业应届生求职信
2013/10/07 职场文书
质检的岗位职责
2013/11/17 职场文书
工程管理专业个人求职信范文
2013/12/07 职场文书
综合实践活动总结
2014/05/05 职场文书
学校安全责任书范本
2014/07/23 职场文书
孝敬父母的活动方案
2014/08/31 职场文书
护士求职简历自我评价
2015/03/10 职场文书
汽车4S店前台接待岗位职责
2015/04/03 职场文书
教师节主题班会方案
2015/08/17 职场文书
解读MySQL的客户端和服务端协议
2021/05/10 MySQL
浅谈react useEffect闭包的坑
2021/06/08 Javascript
Python提取PDF指定内容并生成新文件
2021/06/09 Python
Java 中的 Unsafe 魔法类的作用大全
2021/06/26 Java/Android