Python概念之装饰器、迭代器、生成器
装饰器、迭代器、生成器均属于函数知识范畴
1.装饰器
理解装饰器,首先要了解闭包函数。
闭包函数:1、定义在函数内部的函数;
2、该函数的函数体代码包含对外部作用域(而不是全局作用域)名字的引用;
3、通常将闭包函数用return返回,然后可以任意调用。
eg:以下代码中inner()即闭包函数
def outer():
x=1
def inner():
print(x)
return inner
f=outer()
装饰器:即是一种闭包函数的应用。
什么是装饰器?:装饰它人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。
装饰器的原则:1、不修改被装饰对象的源代码 2、不修改被装饰对象的调用方式
装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能
import time def timmer(func): def inner(): start=time.time() res=func() stop=time.time() print('run time is %s' %(stop-start)) return res return inner @timmer #index=timmer(index) def index(): time.sleep(1) print('welecome to index') return 1111 res=index() print(res)
2.迭代器
迭代器:迭代器即迭代的工具。
什么是迭代?:指的是一个重复的过程,每一次重复称为一次迭代,并且每一次重复的结果是下一次重复的初始值
为什么要有迭代器?:对于序列类型:str,list,tuple,可以依赖索引来迭代取值,但是对于dict,set,文件,python必须为我们提供一种不依赖于索引的迭代取值的方式-》迭代器
什么是可迭代对象?:可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__,如下
'hello'.__iter__
(1,2,3).__iter__
[1,2,3].__iter__
{'a':1}.__iter__
{'a','b'}.__iter__
open('a.txt').__iter__
什么是迭代器对象?:可迭代对象执行obj.__iter__()得到的结果就是迭代器对象,而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象
文件类型是迭代器对象:
open('a.txt').__iter__()
open('a.txt').__next__()
注意:迭代器对象一定是可迭代对象,可迭代对象不一定是迭代器对象。
eg:
d={'name':'lili','age':'18','sex':'male'} d_iter=iter(d) # d_iter=iter(d) while True: try: print(next(d_iter)) except StopIteration: break
优点:
提供一种统一的、不依赖于索引的取值方式
迭代器同一时间在内存只有一个值,更节省内存
缺点:
只能往后取,并且是一次性的
不能统计值的个数,即长度
3.生成器
什么是生成器?:只要在函数体内出现yield关键字,那么再执行函数就不会执行函数代码,会得到一个结果,该结果就是生成器
生成器就是迭代器
def func(): print('=====>1') yield 1 print('=====>2') yield 2 print('=====>3') yield 3 g=func()# g.__iter__ res1=next(g) print(res1) res2=next(g) print(res2) res3=next(g) print(res3)
yield的功能:
1、yield为我们提供了一种自定义迭代器对象的方法
2、yield与return的区别1:yield可以返回多次值 #2:函数暂停与再继续的状态是由yield帮我们保存的