11 python迭代器和生成器

white Python 2018-05-08 62 次浏览 11 python迭代器和生成器已关闭评论

迭代器定义

1.迭代器协议是指:对象必须提供一个next方法,执行方法要么返回迭代器中的下一项,要么就引起一个StopIteration异常,以终止迭代(只能往后走,不能往前退)

2.可迭代对象:实现了迭代器协议的对象(实现方式:对象内部定义了一个iter()方法)

3.协议是一种约定,可迭代对象实现了迭代器协议,Python的内部工具(如for循环,summinmax函数等)使用迭代器协议访问对象。

迭代器协议的实现

迭代器协议规定了对象必须提供一个next方法和iter方法。

l = [1,2,3,4]
iter_l=l.__iter__()
print(iter_l.__next__())
print(iter_l.__next__())
print(iter_l.__next__())
print(iter_l.__next__())
########print(next(iter_l))
d = {'1':'a','2':'b'}
iter_d=d.__iter__()
print(d.__iter__().__next__())

 

生成器定义

可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己内置的__iter__方法),所以生成器就是可迭代对象

 

生成器分类及在python中的表现形式:(Python有两种不同的方式提供生成器)

1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行

def test():
    yield 1
    yield 2
    yield 3
t=test()
print(t.__next__())
print(next(t))
print(next(t))

2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

三元表达式
name='white'
res = '大神' if name=='white' else '不存在'
print(res)
列表解析
hua_list=[]
for i in range(10):
    hua_list.append('鲜花%s'%i)
print(hua_list)
l = ['鲜花%s'%i for i in range(10)]
print(l)

如何得到生成器

l = ('鲜花%s'%i for i in range(10))
print(l.__next__())

 

 

为何使用生成器之生成器的优点

Python使用生成器对延迟操作提供了支持。所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生结果。这也是生成器的主要好处。

生成器小结:

1.是可迭代对象

2.实现了延迟计算,省内存啊

3.生成器本质和其他的数据类型一样,都是实现了迭代器协议,只不过生成器附加了一个延迟计算省内存的好处,其余的可迭代对象可没有这点好处,记住喽!!!

 

生产者消费者模型

import time
def producer():
    ret=[]
    for i in range(10):
        time.sleep(0.1)
        ret.append('包子%s' %i)
    return ret

def consumer(res):
    for index,baozi in enumerate(res):
        time.sleep(0.1)
        print('第%s个人,吃了%s' %(index,baozi))

a = producer()
consumer(a)

 

import time
def consumer(name):
    print('i am %s,i gonna to eat' %name)
    while True:
        baozi = yield
        time.sleep(1)
        print('%s happy to eat %s' %(name,baozi))


def producer():
    c1=consumer('White')
    c2=consumer('tom')
    c1.__next__()
    c2.__next__()
    for i in range(10):
        time.sleep(1)
        c1.send('tofu %s' %i)
        c2.send('tofu %s' %i)

producer()

 

回顶部