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中datetime常用时间处理方法
Jun 15 Python
Python用户推荐系统曼哈顿算法实现完整代码
Dec 01 Python
pandas带有重复索引操作方法
Jun 08 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
Oct 29 Python
Python函数装饰器常见使用方法实例详解
Mar 30 Python
ubuntu上安装python的实例方法
Sep 30 Python
Python模块_PyLibTiff读取tif文件的实例
Jan 13 Python
TensorFlow的环境配置与安装教程详解(win10+GeForce GTX1060+CUDA 9.0+cuDNN7.3+tensorflow-gpu 1.12.0+python3.5.5)
Jun 22 Python
CentOS 7如何实现定时执行python脚本
Jun 24 Python
python中执行smtplib失败的处理方法
Jul 01 Python
sklearn中的交叉验证的实现(Cross-Validation)
Feb 22 Python
Python中三种花式打印的示例详解
Mar 19 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 接口类与抽象类的实际作用
2009/11/26 PHP
深入PHP nl2br()格式化输出的详解
2013/06/05 PHP
如何在php中正确的使用json
2013/08/06 PHP
php setcookie函数的参数说明及其用法
2014/04/20 PHP
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析
2016/05/18 PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
2016/12/14 PHP
基于jquery实现的文字淡入淡出效果
2013/11/14 Javascript
sogou地图API用法实例教程
2014/09/11 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
JS实现FLASH幻灯片图片切换效果的方法
2015/03/04 Javascript
javascript实现模拟时钟的方法
2015/05/13 Javascript
浅谈Javascript数据属性与访问器属性
2016/07/26 Javascript
微信端开发--登录小程序步骤
2017/01/11 Javascript
原生js实现打字动画游戏
2017/02/04 Javascript
微信小程序page的生命周期和音频播放及监听实例详解
2017/04/07 Javascript
记录vue项目中遇到的一点小问题
2019/05/14 Javascript
vue使用websocket的方法实例分析
2019/06/22 Javascript
微信小程序在其他页面监听globalData中值的变化
2019/07/15 Javascript
Vue.js如何使用Socket.IO的示例代码
2019/09/05 Javascript
webpack 处理CSS资源的实现
2019/09/27 Javascript
如何实现js拖拽效果及原理解析
2020/05/08 Javascript
vue-cli3 热更新配置操作
2020/09/18 Javascript
[03:27]最受玩家喜爱奖提名:PZH_Element 致玩家寄语
2016/12/20 DOTA
[00:59]DOTA2荣耀之路1:Doom is back!weapon X!
2018/05/22 DOTA
详解如何在python中读写和存储matlab的数据文件(*.mat)
2018/02/24 Python
pyshp创建shp点文件的方法
2018/12/31 Python
python循环定时中断执行某一段程序的实例
2019/06/29 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
2019/09/07 Python
使用tensorflow进行音乐类型的分类
2020/08/14 Python
css3 border旋转时的动画应用
2016/01/22 HTML / CSS
详解window.open被浏览器拦截的解决方案
2019/07/18 HTML / CSS
英国高档百货连锁店:John Lewis
2017/11/20 全球购物
爱尔兰领先的在线体育用品零售商:theGAAstore
2018/04/16 全球购物
梅花魂教学反思
2014/04/25 职场文书
庆六一活动总结
2014/08/29 职场文书
改造DE1103三步曲
2022/04/07 无线电