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通过pil将图片转换成黑白效果的方法
Mar 16 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
Aug 02 Python
浅谈Python大神都是这样处理XML文件的
May 31 Python
python 缺失值处理的方法(Imputation)
Jul 02 Python
Django实现发送邮件功能
Jul 18 Python
Python简易版图书管理系统
Aug 12 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
Aug 12 Python
Python统计分析模块statistics用法示例
Sep 06 Python
.dcm格式文件软件读取及python处理详解
Jan 16 Python
python使用html2text库实现从HTML转markdown的方法详解
Feb 21 Python
Python编程快速上手——正则表达式查找功能案例分析
Feb 28 Python
JAVA及PYTHON质数计算代码对比解析
Jun 10 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 处理TXT文件(打开/关闭/检查/读取)
2013/05/13 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
JS 继承实例分析
2008/11/04 Javascript
JQuery,Extjs,YUI,Prototype,Dojo 等JS框架的区别和应用场景简述
2010/04/15 Javascript
jquery Ajax 实现加载数据前动画效果的示例代码
2014/02/07 Javascript
Yii2使用Bootbox插件实现自定义弹窗
2015/04/02 Javascript
深入理解关于javascript中apply()和call()方法的区别
2016/04/12 Javascript
Bootstrapvalidator校验、校验清除重置的实现代码(推荐)
2016/09/28 Javascript
JS实现太极旋转思路分析
2016/12/09 Javascript
浅析JavaScript中的平稳退化(graceful degradation)
2017/07/24 Javascript
浅谈pc端rem字体设置的问题
2017/08/03 Javascript
简单的vuex 的使用案例笔记
2018/04/13 Javascript
vuex state及mapState的基础用法详解
2018/04/19 Javascript
Chart.js 轻量级HTML5图表绘制工具库(知识整理)
2018/05/22 Javascript
微信小程序实现红包功能(后端PHP实现逻辑)
2018/07/11 Javascript
JavaScript常见鼠标事件与用法分析
2019/01/03 Javascript
angular异步验证防抖踩坑实录
2019/12/01 Javascript
vue 调用 RESTful风格接口操作
2020/08/11 Javascript
[00:32]2018DOTA2亚洲邀请赛OpTic出场
2018/04/03 DOTA
[38:27]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第二场 11.26
2020/11/30 DOTA
Python绘制七段数码管实例代码
2017/12/20 Python
把csv文件转化为数组及数组的切片方法
2018/07/04 Python
Python数据结构与算法(几种排序)小结
2019/06/22 Python
详解python解压压缩包的五种方法
2019/07/05 Python
马克华菲官方商城:Mark Fairwhale
2016/09/04 全球购物
全球酒店比价网:HotelsCombined
2017/06/20 全球购物
eHarmony英国:全球领先的认真恋爱约会平台之一
2020/11/16 全球购物
爱情保证书范文
2014/02/01 职场文书
教师敬业奉献模范事迹材料
2014/05/18 职场文书
忠诚教育心得体会
2014/09/03 职场文书
党委书记群众路线对照检查材料思想汇报
2014/10/04 职场文书
单位实习工作证明怎么写
2014/11/02 职场文书
2015年扶贫帮困工作总结
2015/05/20 职场文书
小学毕业感言100字
2015/07/30 职场文书
学会用Python实现滑雪小游戏,再也不用去北海道啦
2021/05/20 Python
vite+vue3.0+ts+element-plus快速搭建项目的实现
2021/06/24 Vue.js