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升级提示Tkinter模块找不到的解决方法
Aug 22 Python
Python THREADING模块中的JOIN()方法深入理解
Feb 18 Python
Python中read()、readline()和readlines()三者间的区别和用法
Jul 30 Python
Python实现注册登录系统
Aug 08 Python
利用Python循环(包括while&amp;for)各种打印九九乘法表的实例
Nov 06 Python
使用python和Django完成博客数据库的迁移方法
Jan 05 Python
Python中pandas模块DataFrame创建方法示例
Jun 20 Python
如何提高python 中for循环的效率
Apr 15 Python
python连接mysql有哪些方法
Jun 24 Python
如何基于Python爬取隐秘的角落评论
Jul 02 Python
编写python代码实现简单抽奖器
Oct 20 Python
python数字类型和占位符详情
Mar 13 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 和 COM
2006/10/09 PHP
PHP中的CMS的涵义
2007/03/11 PHP
destoon实现底部添加你是第几位访问者的方法
2014/07/15 PHP
Codeigniter的一些优秀特性总结
2015/01/21 PHP
分页栏的web标准实现
2011/11/01 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
2016/06/23 Javascript
真正好用的js验证上传文件大小的简单方法
2016/10/27 Javascript
vue.js指令和组件详细介绍及实例
2017/04/06 Javascript
使用jQuery和ajax代替iframe的方法(详解)
2017/04/12 jQuery
Node.js 8 中的 util.promisify的详解
2017/06/12 Javascript
jQuery序列化后的表单值转换成Json
2017/06/16 jQuery
微信小程序实现的贪吃蛇游戏【附源码下载】
2018/01/03 Javascript
javascript回调函数详解
2018/02/06 Javascript
Bootstrap 实现表格样式、表单布局的实例代码
2018/12/09 Javascript
判断“命令按钮”是否被鼠标单击详解
2019/07/31 Javascript
javascript用defineProperty实现简单的双向绑定方法
2020/04/03 Javascript
JS访问对象两种方式区别解析
2020/08/29 Javascript
Python中变量交换的例子
2014/08/25 Python
python 每天如何定时启动爬虫任务(实现方法分享)
2018/05/21 Python
基于Pandas读取csv文件Error的总结
2018/06/15 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
2019/02/20 Python
pandas的连接函数concat()函数的具体使用方法
2019/07/09 Python
cProfile Python性能分析工具使用详解
2019/07/22 Python
Python2和3字符编码的区别知识点整理
2019/08/08 Python
Pyecharts绘制全球流向图的示例代码
2020/01/08 Python
django API 中接口的互相调用实例
2020/04/01 Python
Python 给下载文件显示进度条和下载时间的实现
2020/04/02 Python
python 常见的排序算法实现汇总
2020/08/21 Python
详解CSS3中Media Queries的相关使用
2015/07/17 HTML / CSS
HTML5-WebSocket实现聊天室示例
2016/12/15 HTML / CSS
阿姆斯特丹城市卡:Amsterdam Pass
2019/12/01 全球购物
奥地利时尚、美容、玩具和家居之家:Kastner & Öhler
2020/04/26 全球购物
.NET概念性的面试题
2012/02/29 面试题
代办委托书怎样写
2014/04/08 职场文书
个人批评与自我批评总结
2014/10/17 职场文书
python 爬取吉首大学网站成绩单
2021/06/02 Python