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帮我们保存的

猜你喜欢

转载自www.cnblogs.com/iqinyu/p/9478972.html