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 相关文章推荐
python查找第k小元素代码分享
Dec 18 Python
Python OS模块常用函数说明
May 23 Python
python实现给数组按片赋值的方法
Jul 28 Python
Python制作简单的网页爬虫
Nov 22 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
Jun 22 Python
python numpy元素的区间查找方法
Nov 14 Python
python获取地震信息 微信实时推送
Jun 18 Python
python从zip中删除指定后缀文件(推荐)
Dec 05 Python
基于Python数据结构之递归与回溯搜索
Feb 26 Python
Python爬取YY评级分数并保存数据实现过程解析
Jun 01 Python
OpenCV+python实现实时目标检测功能
Jun 24 Python
如何在Python中创建二叉树
Mar 30 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
老照片 - 几十年前的收音机与人
2021/03/02 无线电
解决文件名解压后乱码的问题 将文件名进行转码的代码
2012/01/10 PHP
php中inlcude()性能对比详解
2012/09/16 PHP
thinkPHP的Html模板标签使用方法
2012/11/13 PHP
如何使用PHP计算上一个月的今天
2013/05/23 PHP
PHP以mysqli方式连接类完整代码实例
2014/07/15 PHP
PHP中让curl支持sock5的代码实例
2015/01/21 PHP
Linux下从零开始安装配置Nginx服务器+PHP开发环境
2015/12/21 PHP
PHP根据session与cookie用户登录状态操作类的代码
2016/05/13 PHP
详解PHP 7.4 中数组延展操作符语法知识点
2019/07/19 PHP
Swoole源码中如何查询Websocket的连接问题详解
2020/08/30 PHP
javascript 动态样式添加的简单实现
2016/10/11 Javascript
ES6数组的扩展详解
2017/04/25 Javascript
荐书|您有一份JavaScript书单待签收
2017/07/21 Javascript
JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】
2017/09/04 Javascript
详解JavaScript的数据类型以及数据类型的转换
2019/04/20 Javascript
小程序click-scroll组件设计
2019/06/18 Javascript
微信小程序登陆注册功能的实现代码
2019/12/10 Javascript
[01:51]开启你的城市传奇 完美世界城市挑战赛开始报名
2018/10/09 DOTA
Python获取SQLite查询结果表列名的方法
2017/06/21 Python
python中的随机函数random的用法示例
2018/01/27 Python
使用python判断jpeg图片的完整性实例
2019/06/10 Python
Django-xadmin后台导入json数据及后台显示信息图标和主题更改方式
2020/03/11 Python
MxNet预训练模型到Pytorch模型的转换方式
2020/05/25 Python
Python爬虫实例——scrapy框架爬取拉勾网招聘信息
2020/07/14 Python
Python 中 sorted 如何自定义比较逻辑
2021/02/02 Python
python中使用asyncio实现异步IO实例分析
2021/02/26 Python
HTML5中meta属性的使用方法
2016/02/29 HTML / CSS
Lululemon英国官网:加拿大瑜伽服装品牌
2019/01/14 全球购物
求职自荐信怎么写
2014/03/06 职场文书
暖通工程师岗位职责
2014/06/12 职场文书
卖车协议书范例
2014/09/16 职场文书
优秀少先队员事迹材料
2014/12/24 职场文书
趣味运动会赞词
2015/07/22 职场文书
PHP中->和=>的意思
2021/03/31 PHP
React更新渲染原理深入分析
2022/12/24 Javascript