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使用paramiko实现远程拷贝文件的方法
Apr 18 Python
Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)
Apr 18 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
Jun 14 Python
树莓派使用USB摄像头和motion实现监控
Jun 22 Python
解决python执行不输出系统命令弹框的问题
Jun 24 Python
python3用PIL把图片转换为RGB图片的实例
Jul 04 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
Jul 17 Python
对Django 转发和重定向的实例详解
Aug 06 Python
python连接打印机实现打印文档、图片、pdf文件等功能
Feb 07 Python
关于Python3爬虫利器Appium的安装步骤
Jul 29 Python
python 实现的IP 存活扫描脚本
Dec 10 Python
python爬取代理ip的示例
Dec 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
php 无限级 SelectTree 类
2009/05/19 PHP
php第一次无法获取cookie问题处理
2014/12/15 PHP
php遍历删除整个目录及文件的方法
2015/03/13 PHP
php判断文件夹是否存在不存在则创建
2015/04/09 PHP
php使用array_search函数实现数组查找的方法
2015/06/12 PHP
100多行PHP代码实现socks5代理服务器[2]
2016/05/05 PHP
PHP实现的简单AES加密解密算法实例
2017/05/29 PHP
用javascript获取textarea中的光标位置
2008/05/06 Javascript
[将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客
2014/08/18 Javascript
javascript判断数组内是否重复的方法
2015/04/21 Javascript
基于socket.io+express实现多房间聊天
2016/03/17 Javascript
jquery $.trim()去除字符串空格的实现方法【附图例】
2016/03/30 Javascript
AngularJs Dependency Injection(DI,依赖注入)
2016/09/02 Javascript
浅谈angularJS2中的界面跳转方法
2018/08/31 Javascript
vue实现自定义H5视频播放器的方法步骤
2019/07/01 Javascript
基于js实现数组相邻元素上移下移
2020/05/19 Javascript
[02:45]DOTA2英雄基础教程 伐木机
2013/12/23 DOTA
Python实现统计英文单词个数及字符串分割代码
2015/05/28 Python
centos6.7安装python2.7.11的具体方法
2017/01/16 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
2018/05/09 Python
Python中的Numpy矩阵操作
2018/08/12 Python
python 实现在一张图中绘制一个小的子图方法
2019/07/07 Python
基于MSELoss()与CrossEntropyLoss()的区别详解
2020/01/02 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
2020/02/29 Python
html5 移动端视频video的android兼容(去除播放控件、全屏)
2020/03/26 HTML / CSS
世界上最大的字体市场:MyFonts
2020/01/10 全球购物
库存图片、照片、矢量图、视频和音乐:Shutterstock
2021/02/12 全球购物
大学生职业生涯规划书模版
2013/12/30 职场文书
公益活动邀请函
2014/02/05 职场文书
幼儿园毕业园长感言
2014/02/24 职场文书
校园文明倡议书
2014/05/16 职场文书
环保公益策划方案
2014/08/15 职场文书
行政人事专员岗位职责
2015/04/07 职场文书
2016年元旦致辞
2015/08/01 职场文书
2016年社区服务活动总结
2016/04/06 职场文书
SQL Server中的逻辑函数介绍
2022/05/25 SQL Server