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中操作MySQL入门实例
Feb 08 Python
python处理图片之PIL模块简单使用方法
May 11 Python
Python实现比较两个文件夹中代码变化的方法
Jul 10 Python
Windows上配置Emacs来开发Python及用Python扩展Emacs
Nov 20 Python
python使用for循环计算0-100的整数的和方法
Feb 01 Python
Python pandas DataFrame操作的实现代码
Jun 21 Python
python自定义时钟类、定时任务类
Feb 22 Python
python实现的自动发送消息功能详解
Aug 15 Python
Django框架HttpResponse对象用法实例分析
Nov 01 Python
在django中查询获取数据,get, filter,all(),values()操作
Aug 09 Python
利用python批量爬取百度任意类别的图片的实现方法
Oct 07 Python
python的数学算法函数及公式用法
Nov 18 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
打造计数器DIY三步曲(中)
2006/10/09 PHP
使用php判断浏览器的类型和语言的函数代码
2013/02/28 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
2014/04/30 PHP
php采用file_get_contents代替使用curl实例
2014/11/07 PHP
PHP中如何使用session实现保存用户登录信息
2015/10/20 PHP
php微信公众号开发之二级菜单
2018/10/20 PHP
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码
2010/12/28 Javascript
Extjs TimeField 显示正常时间格式的代码
2011/06/28 Javascript
用jquery方法操作radio使其默认选项是否
2013/09/10 Javascript
Express.JS使用详解
2014/07/17 Javascript
使用js实现数据格式化
2014/12/03 Javascript
jquery ui dialog替代confirm实例分析
2016/01/25 Javascript
AngularJS整合Springmvc、Spring、Mybatis搭建开发环境
2016/02/25 Javascript
基于jquery实现智能表单验证操作
2016/05/09 Javascript
jQuery实现图片向左向右切换效果的简单实例
2016/05/18 Javascript
浅谈javascript中的constructor
2016/06/08 Javascript
jQuery获取元素父节点的方法
2016/06/21 Javascript
Node.js 中exports 和 module.exports 的区别
2017/03/14 Javascript
原生js实现简单的模态框示例
2017/09/08 Javascript
详解bootstrap导航栏.nav与.navbar区别
2017/11/23 Javascript
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
python局部赋值的规则
2013/03/07 Python
python有证书的加密解密实现方法
2014/11/19 Python
使用python Fabric动态修改远程机器hosts的方法
2018/10/26 Python
Python如何获取Win7,Win10系统缩放大小
2020/01/10 Python
python代码区分大小写吗
2020/06/17 Python
Python __slots__的使用方法
2020/11/15 Python
CSS3实现伪类hover离开时平滑过渡效果示例
2017/08/10 HTML / CSS
荷兰在线啤酒店:Beerwulf
2019/08/26 全球购物
临床医学大学生求职信
2013/09/28 职场文书
经济与贸易专业应届生求职信
2013/11/19 职场文书
领导班子个人对照检查材料(群众路线)
2014/09/26 职场文书
2015年幼儿园元旦游艺活动策划书
2014/12/09 职场文书
2015年财务人员工作总结
2015/04/10 职场文书
Python软件包安装的三种常见方法
2022/07/07 Python
mysql sock 文件解析及作用讲解
2022/07/15 MySQL