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 logging模块学习笔记
May 24 Python
利用selenium 3.7和python3添加cookie模拟登陆的实现
Nov 20 Python
Python实现生成随机日期字符串的方法示例
Dec 25 Python
python基础教程项目四之新闻聚合
Apr 02 Python
Python中安装easy_install的方法
Nov 18 Python
pytorch 转换矩阵的维数位置方法
Dec 08 Python
Python3 列表,数组,矩阵的相互转换的方法示例
Aug 05 Python
python装饰器原理与用法深入详解
Dec 19 Python
python实现简单飞行棋
Feb 06 Python
Python astype(np.float)函数使用方法解析
Jun 08 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
Nov 06 Python
Python eval函数原理及用法解析
Nov 14 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
有道搜索和IP138的IP的API接口(PHP应用)
2012/11/29 PHP
PHP实现设计模式中的抽象工厂模式详解
2014/10/11 PHP
php常用数学函数汇总
2014/11/21 PHP
php pdo oracle中文乱码的快速解决方法
2016/05/16 PHP
js调试工具 Javascript Debug Toolkit 2.0.0版本发布
2008/12/02 Javascript
js loading加载效果实现代码
2009/11/24 Javascript
Javascript操作cookie的函数代码
2012/10/03 Javascript
jQuery创建自定义的选择器用以选择高度大于100的超链接实例
2015/03/18 Javascript
JS根据key值获取URL中的参数值及把URL的参数转换成json对象
2015/08/26 Javascript
基于JQuery实现分隔条的功能
2016/06/17 Javascript
angular ng-repeat数组中的数组实例
2017/02/18 Javascript
JavaScript实现的反序列化json字符串操作示例
2018/07/18 Javascript
Element input树型下拉框的实现代码
2018/12/21 Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
2020/03/31 Javascript
AngularJs的$http发送POST请求,php无法接收Post的数据问题及解决方案
2020/08/13 Javascript
python双向链表实现实例代码
2013/11/21 Python
简单介绍Python中的readline()方法的使用
2015/05/24 Python
python3序列化与反序列化用法实例
2015/05/26 Python
Python爬虫DOTA排行榜爬取实例(分享)
2017/06/13 Python
Python中使用haystack实现django全文检索搜索引擎功能
2017/08/26 Python
彻彻底底地理解Python中的编码问题
2018/10/15 Python
python实现画五角星和螺旋线的示例
2019/01/20 Python
Python中字符串与编码示例代码
2019/05/20 Python
如何分离django中的媒体、静态文件和网页
2019/11/12 Python
在python中创建指定大小的多维数组方式
2019/11/28 Python
Python 安装 virturalenv 虚拟环境的教程详解
2020/02/21 Python
解决pycharm不能自动保存在远程linux中的问题
2021/02/06 Python
瑞士最大的图书贸易公司:Orell Füssli
2019/12/28 全球购物
Belvilla法国:休闲度假房屋出租
2020/10/03 全球购物
求职自荐信
2013/12/14 职场文书
2014年清明节网上祭英烈寄语
2014/04/09 职场文书
连带责任保证书
2014/04/29 职场文书
吧主申请感言怎么写
2015/08/03 职场文书
2016年世界艾滋病日宣传活动总结
2016/04/01 职场文书
假期读书倡议书3篇
2019/08/19 职场文书
假如给我三天光明:舟逆水而行,人遇挫而达 
2019/10/29 职场文书