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中优化NumPy包使用性能的教程
Apr 23 Python
windows下Virtualenvwrapper安装教程
Dec 13 Python
python opencv实现运动检测
Jul 10 Python
python:接口间数据传递与调用方法
Dec 17 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
May 03 Python
python开头的coding设置方法
Aug 08 Python
python multiprocessing模块用法及原理介绍
Aug 20 Python
python内置函数sorted()用法深入分析
Oct 08 Python
python二维键值数组生成转json的例子
Dec 06 Python
Python爬虫程序架构和运行流程原理解析
Mar 09 Python
关于python 的legend图例,参数使用说明
Apr 17 Python
class类在python中获取金融数据的实例方法
Dec 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
全国FM电台频率大全 - 16 河南省
2020/03/11 无线电
用PHP实现ODBC数据分页显示一例
2006/10/09 PHP
php读取mysql乱码,用set names XXX解决的原理分享
2011/12/29 PHP
PHP中使用addslashes函数转义的安全性原理分析
2014/11/03 PHP
3种php生成唯一id的方法
2015/11/23 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
在JavaScript中使用inline函数的问题
2007/03/08 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
2013/06/04 Javascript
jquery单行文字向上滚动效果的实现代码
2014/09/05 Javascript
javascript从定义到执行 你不知道的那些事
2016/01/04 Javascript
Svg.js实例教程及使用手册详解(一)
2016/05/16 Javascript
小程序云开发初探(小结)
2018/10/24 Javascript
一起来了解一下JavaScript的预编译(小结)
2021/03/01 Javascript
Python实现的几个常用排序算法实例
2014/06/16 Python
Django实现图片文字同时提交的方法
2015/05/26 Python
Python可变参数用法实例分析
2017/04/02 Python
K-means聚类算法介绍与利用python实现的代码示例
2017/11/13 Python
简单实现python数独游戏
2018/03/30 Python
python实现泊松图像融合
2018/07/26 Python
python调用百度REST API实现语音识别
2018/08/30 Python
Linux上使用Python统计每天的键盘输入次数
2019/04/17 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
2020/02/16 Python
通过代码实例了解Python3编程技巧
2020/10/13 Python
Python爬取某平台短视频的方法
2021/02/08 Python
简单掌握CSS3将文字描边及填充文字颜色的方法
2016/03/07 HTML / CSS
HTML5+CSS3 实现灵动的动画 TAB 切换效果(DEMO)
2017/09/15 HTML / CSS
碧欧泉Biotherm加拿大官方网站:法国高端护肤品牌
2019/10/18 全球购物
EM Cosmetics官网:由彩妆大神Michelle Phan创办的独立品牌
2020/04/27 全球购物
自荐信格式简述
2014/01/25 职场文书
酒店经理职责
2014/01/30 职场文书
秋游活动策划方案
2014/02/16 职场文书
2014年采购员工作总结
2014/11/18 职场文书
2016党员学习《反对自由主义》心得体会
2016/01/22 职场文书
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python
常用的文件对应的MIME类型汇总
2022/04/26 HTML / CSS