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实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
Jun 04 Python
python基础教程之自定义函数介绍
Aug 29 Python
Python使用百度API上传文件到百度网盘代码分享
Nov 08 Python
简单介绍Python中的JSON模块
Apr 08 Python
Python中的进程分支fork和exec详解
Apr 11 Python
深入探究Django中的Session与Cookie
Jul 30 Python
详解python运行三种方式
May 13 Python
python 解决cv2绘制中文乱码问题
Dec 23 Python
Python configparser模块配置文件过程解析
Mar 03 Python
关于Python Tkinter Button控件command传参问题的解决方式
Mar 04 Python
Django media static外部访问Django中的图片设置教程
Apr 07 Python
Python configparser模块操作代码实例
Jun 08 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
CI框架中zip类应用示例
2014/06/17 PHP
php数组操作之键名比较与差集、交集赋值的方法
2014/11/10 PHP
phpwind放自动注册方法
2006/12/02 Javascript
jquery $.ajax相关用法分享
2012/03/16 Javascript
仿新浪微博返回顶部的jquery实现代码
2012/10/01 Javascript
jQuery 仿百度输入标签插件附效果图
2014/07/04 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
深入浅析NodeJs并发异步的回调处理
2015/12/21 NodeJs
jQuery+CSS3文字跑马灯特效的简单实现
2016/06/25 Javascript
详解springmvc 接收json对象的两种方式
2016/12/06 Javascript
Material(包括Material Icon)在Angular2中的使用详解
2018/02/11 Javascript
分享5个顶级的JavaScript Ajax组件库
2018/09/16 Javascript
nodejs基础之多进程实例详解
2018/12/27 NodeJs
Vue组件内部实现一个双向数据绑定的实例代码
2019/04/04 Javascript
VScode格式化ESlint方法(最全最好用方法)
2019/09/10 Javascript
Vue中常用rules校验规则(实例代码)
2019/11/14 Javascript
JS实现网页端猜数字小游戏
2020/03/06 Javascript
Node Express用法详解【安装、使用、路由、中间件、模板引擎等】
2020/05/13 Javascript
Python守护进程(daemon)代码实例
2015/03/06 Python
进一步了解Python中的XML 工具
2015/04/13 Python
Python实现命令行通讯录实例教程
2016/08/18 Python
老生常谈Python之装饰器、迭代器和生成器
2017/07/26 Python
Python3 翻转二叉树的实现
2019/09/30 Python
python tkinter控件布局项目实例
2019/11/04 Python
Python logging自定义字段输出及打印颜色
2020/11/30 Python
HTML5移动端开发遇见的东西
2019/10/11 HTML / CSS
html5声频audio和视频video等新特性详细说明
2012/12/26 HTML / CSS
Bluebella法国官网:英国性感内衣品牌
2019/05/03 全球购物
eBay奥地利站:eBay.at
2019/07/24 全球购物
长安大学毕业生自我鉴定
2014/01/17 职场文书
单位提档介绍信
2014/01/17 职场文书
社区食品安全实施方案
2014/03/28 职场文书
员工入职担保书范文
2014/04/01 职场文书
作风整顿剖析材料
2014/09/30 职场文书
教学副校长工作总结
2015/08/13 职场文书