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学习资料
Feb 08 Python
Python函数中*args和**kwargs来传递变长参数的用法
Jan 26 Python
Python读写及备份oracle数据库操作示例
May 17 Python
对python3标准库httpclient的使用详解
Dec 18 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
Dec 24 Python
对python中Json与object转化的方法详解
Dec 31 Python
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
Aug 13 Python
PYTHON如何读取和写入EXCEL里面的数据
Oct 28 Python
Python3 中作为一等对象的函数解析
Dec 11 Python
Pytorch 神经网络—自定义数据集上实现教程
Jan 07 Python
Python Scrapy图片爬取原理及代码实例
Jun 12 Python
Python+unittest+requests 接口自动化测试框架搭建教程
Oct 09 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
php的hash算法介绍
2014/02/13 PHP
php跨域cookie共享使用方法
2014/02/20 PHP
php按百分比生成缩略图的代码分享
2014/05/10 PHP
PHP 二维数组根据某个字段排序的具体实现
2014/06/03 PHP
php实现的任意进制互转类分享
2015/07/07 PHP
一段好玩的JavaScript代码
2006/12/01 Javascript
JS图片自动轮换效果实现思路附截图
2014/04/30 Javascript
Jquery节点遍历next与nextAll方法使用示例
2014/07/22 Javascript
javascript中mouseover、mouseout使用详解
2015/07/19 Javascript
不得不分享的JavaScript常用方法函数集(下)
2015/12/25 Javascript
jQuery下拉框的简单应用
2016/06/24 Javascript
JavaScript ES5标准中新增的Array方法
2016/06/28 Javascript
jquery dialog获取焦点的方法
2017/02/09 Javascript
JavaScript使用原型和原型链实现对象继承的方法详解
2017/04/05 Javascript
bootstrap时间控件daterangepicker使用方法及各种小bug修复
2017/10/25 Javascript
vue的过滤器filter实例详解
2018/09/17 Javascript
vue上传图片到oss的方法示例(图片带有删除功能)
2018/09/27 Javascript
vue中使用[provide/inject]实现页面reload的方法
2019/09/30 Javascript
JS实现网页烟花动画效果
2020/03/10 Javascript
使用webpack5从0到1搭建一个react项目的实现步骤
2020/12/16 Javascript
[42:20]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
Python字符串处理实现单词反转
2017/06/14 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
2018/04/06 Python
关于Python 的简单栅格图像边界提取方法
2019/07/05 Python
css3 旋转按钮 使用CSS3创建一个旋转可变色按钮
2012/12/31 HTML / CSS
巴西最大的体育用品商城:Netshoes巴西
2016/11/29 全球购物
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
新加坡领先的时尚生活方式零售品牌:CHARLES & KEITH
2018/01/16 全球购物
北欧最好的童装网上商店:Babyshop
2019/09/15 全球购物
面试求职的个人自我评价
2013/11/16 职场文书
企业法人代表授权委托书
2014/10/02 职场文书
律师授权委托书范本
2014/10/07 职场文书
政协会议宣传标语
2014/10/09 职场文书
夫妻忠诚协议书范本
2014/11/17 职场文书
教师求职自荐信范文
2015/03/04 职场文书
检讨书格式
2015/05/07 职场文书