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 切片和range()用法说明
Mar 24 Python
python实现将文本转换成语音的方法
May 28 Python
使用Python写CUDA程序的方法
Mar 27 Python
Python爬虫中urllib库的进阶学习
Jan 05 Python
Python解决走迷宫问题算法示例
Jul 27 Python
Python Unittest根据不同测试环境跳过用例的方法
Dec 16 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
Mar 27 Python
python 控制Asterisk AMI接口外呼电话的例子
Aug 08 Python
python连接PostgreSQL数据库的过程详解
Sep 18 Python
Pytorch中的VGG实现修改最后一层FC
Jan 15 Python
Python版中国省市经纬度
Feb 11 Python
Python使用tkinter制作在线翻译软件
Feb 22 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 设置MySQL连接字符集的方法
2011/01/02 PHP
php使用ZipArchive函数实现文件的压缩与解压缩
2015/10/27 PHP
PHP生成短网址方法汇总
2016/07/12 PHP
图片连续滚动代码[兼容IE/firefox]
2009/06/11 Javascript
修改file按钮的默认样式实现代码
2013/04/23 Javascript
JS获取农历日期具体实例
2013/11/14 Javascript
JQuery中$.ajax()方法参数详解及应用
2013/12/12 Javascript
关闭页面时window.location事件未执行的原因分析及解决方案
2014/09/01 Javascript
一个简单的动态加载js和css的jquery代码
2014/09/01 Javascript
nodejs中的fiber(纤程)库详解
2015/03/24 NodeJs
jQuery ui实现动感的圆角渐变网站导航菜单效果代码
2015/08/26 Javascript
原生javascript实现图片无缝滚动效果
2016/02/12 Javascript
jQuery EasyUI基础教程之EasyUI常用组件(推荐)
2016/07/15 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
Vue.js实现移动端短信验证码功能
2017/03/29 Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
2017/06/29 jQuery
Vue表单demo v-model双向绑定问题
2018/06/29 Javascript
开发用到的js封装方法(20种)
2018/10/12 Javascript
js回到页面指定位置的三种方式
2020/12/17 Javascript
Python切片用法实例教程
2014/09/08 Python
python3实现暴力穷举博客园密码
2016/06/19 Python
Python中read()、readline()和readlines()三者间的区别和用法
2017/07/30 Python
Python设计模式之代理模式简单示例
2018/01/09 Python
TensorFlow实现iris数据集线性回归
2018/09/07 Python
Python File(文件) 方法整理
2019/02/18 Python
python实现大文本文件分割
2019/07/22 Python
django一对多模型以及如何在前端实现详解
2019/07/24 Python
Python利用WMI实现ping命令的例子
2019/08/14 Python
使用python求解二次规划的问题
2020/02/29 Python
python中pdb模块实例用法
2021/01/15 Python
西班牙灯具网上商店:Lampara.es
2018/06/05 全球购物
俄罗斯护发和专业化妆品购物网站:Hihair
2019/09/28 全球购物
调解协议书
2014/04/16 职场文书
大明湖导游词
2015/02/03 职场文书
写作技巧:如何撰写一份优秀的营销策划书
2019/08/13 职场文书
宪法宣传标语100条
2019/10/15 职场文书