Python装饰器用法与知识点小结

作者:WFaceBoss 时间:2023-11-16 00:45:02 

本文实例讲述了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程序设计有所帮助。

来源:https://www.cnblogs.com/wfaceboss/p/9425128.html

标签:Python,装饰器
0
投稿

猜你喜欢

  • JavaScript使用indexOf()实现数组去重的方法分析

    2024-04-28 09:39:03
  • 如何获取机器的网络配置属性?

    2009-11-23 20:44:00
  • PHP读取txt文本文件并分页显示的方法

    2023-09-06 21:13:25
  • python音频处理的示例详解

    2022-03-24 02:18:06
  • python贪吃蛇游戏代码

    2023-07-22 04:19:17
  • mysql正确安全清空在线慢查询日志slow log的流程分享

    2024-01-24 12:25:48
  • 一文秒懂python读写csv xml json文件各种骚操作

    2023-08-03 23:50:42
  • matplotlib图形整合之多个子图绘制的实例代码

    2023-10-23 23:17:47
  • 详解vue过度效果与动画transition使用示例

    2023-07-02 16:45:03
  • 测试框架JUnit VS TestNG对比分析

    2023-02-11 02:44:02
  • python根据list重命名文件夹里的所有文件实例

    2022-02-12 15:54:30
  • pyqt和pyside开发图形化界面

    2022-05-06 18:10:08
  • Python3.x爬虫下载网页图片的实例讲解

    2022-11-25 23:24:07
  • mySQL中in查询与exists查询的区别小结

    2024-01-20 22:26:00
  • Python深度学习albumentations数据增强库

    2023-02-14 20:00:18
  • Python从list类型、range()序列简单认识类(class)【可迭代】

    2022-09-09 14:07:20
  • python 实现围棋游戏(纯tkinter gui)

    2023-11-23 16:13:04
  • Python3实现的回文数判断及罗马数字转整数算法示例

    2023-07-07 05:10:06
  • Javascript 小游戏,“是男人坚持 100 次”

    2009-01-22 14:25:00
  • 关于字体的一些思考

    2008-03-03 12:53:00
  • asp之家 网络编程 m.aspxhome.com