装饰器&生成器&迭代器&…
2019-04-20 08:53:00来源:博客园 阅读 ()
一:普通装饰器
- 概念:在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能,为已存在的对象添加某个功能
- 普通装饰器编写的格式
def 外层函数(参数) def 内层函数(*args,**kwargs) #函数执行之前 data= 参数(*args,**kwags) #函数执行之后 return data return 内层函数
- 用法示例:
def func(arg): def inner(): v = arg() return v return inner # 第一步:执行func函数并将下面的函数当做参数进行传递, 相当于:func(index) # 第二步: 将func返回的值重新赋值给下面的函数名 index = func(index) @func #@装饰器的语法 def index(): print(123) return 666 print(index)
- 应用示例
#示例:计算函数执行时间 import time def base(func): def inner(): start_time = time.time() --->#函数执行之前 v= func() end_tme = time.time() ---->#函数执行之后 print(end_time-start_time) return v return inner @base def func1(): time.sleep(2) # 函数执行延缓2秒 print(123) @base def func2(): time.sleep(1) print(456)
- 关于返回值
def base(func): def inner(*args,**kwargs): data = func(*args,**kwargs) return data return inner @x1 def index(): print(123) return 666 v1 =index() print(v1) #func函数带括号,执行index函数,先打印'123',先将666返回给data,data再返回给v1
- 关于前后
def base(func): def inner(*args,**kwargs) print('函数调用之前') data = func(*args,**kwargs) #执行原函数并获取返回值 print('调用原函数之后') return data return inner @base def index() print(123) index()
二:带参数的装饰器
- 基本格式
def base(counter): def wrapper(func): def inner(*args,**kwargs): data = func(*args,**kwargs) # 执行原函数并获取返回值 return data return inner return wrapper @base(9) def index(): pass #先执行base函数,然后将返回值wrapper返回,变成不带参数的装饰器
- 用法示例
#写一个带参数的函,实现:参数是多少,被装饰的函数就要执行多少次,返回最后一次执行的结果 def base(counter): def wrapper(func): def inner(*args,**kwargs): for i in range(counter): data = func(*args,**kwargs) # 执行原函数并获取返回值 return data return inner return wrapper @base(5) def index(): return 好难啊 v = index() print(v)
三:生成器 (函数的变异)
- 概念:函数中如果存在yield,那么该函数就是一个生成器函数,调用生成器函数,会返回一个生成器,生成器只有被for循环时,生成器内部代码才会执行,每次循环都会获取yield返回的值
- 生成器函数 : 内部是否包含yield
def func(): print('F1') yield 1 print('F2') yield 2 print('F3') #函数内部代码不会执行,返回一个生成器对象 v1 = func() #生成器可以被for 循环,一旦开始循环函数内部代码就开始执行 for item in v1: print(item) # F1 1 F2 2 F3
- 特殊的迭代对象
def func(): yield 1 v = func() result = v.__iter__() print(result)
四:迭代器
- 概念:
-
-
v1 = iter([1,2,3,4])
-
v2 = [1,2,3,4].
__iter__
()
-
-
v1 = "alex" v2 = iter(v1) while True: try: val = v2.__next__() print(val) except Exception as e: break
- 直到报错:stoplteration错误,表示迭代已经完毕
- for 循环
v1 = [11,22,33,44] # 1.内部会将v1转换成迭代器 # 2.内部反复执行 迭代器.__next__() # 3.取完不报错 for item in v1: print(item)
- 可迭代对象
-
-
可以被for 循环
-
五;推导式
-
-
基本格式
v1 = [i for i in 可迭代对象] v2 = [i for i in 可迭代对象 if 条件] #条件为true才进行append
-
#示例 v1 = [99 if i>5 else 66 for i in range(10)] v2 = [lambda : 100 for i in range(10)] result = v5[9]() # 100 v3 = [lambda :i for i in range(10)] result = v7[5]() # 9 v4 = [lambda x:x*i for i in range(10)] # 1.请问 v4 是什么? 函数地址 # 2.请问 v4[0](2) 的结果是什么? 18 def num(): return [lambda x:i*x for i in range(4)] # num() -> [函数,函数,函数,函数] print([ m(2) for m in num() ]) # [6,6,6,6] #####筛选##### v = [i for i in range(10) if i > 5]
- 集合推导式
v1 = { i for i in 'alex' }
- 字典推导式
v1 = { 'k'+str(i):i for i in range(10) }
原文链接:https://www.cnblogs.com/wenxin1120/p/10738688.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Python 强制停止多线程运行
- Python连载30-多线程之进程&线程&线程使用 2019-08-13
- Python学习日记(十) 生成器和迭代器 2019-08-13
- Python之装饰器笔记 2019-08-13
- Python学习日记(九) 装饰器函数 2019-08-13
- Python连载25-函数tell&write&writeline$&a 2019-07-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash