Python进阶----生成器@.@

来源:互联网 发布:淘宝怎么修改送货地址 编辑:程序博客网 时间:2024/06/17 19:31

生成器

"""    可迭代对象(Iterable):    Python中任意的对象,只要它定义了可以返回一个迭代器的__iter__方法,或者定义了可以支持下标索引的__getitem__方法,那么它就是一个可迭代对象迭代器(Iterator)任意对象,只要定义了next(Python2) 或者__next__方法,它就是一个迭代器    迭代对象具有两个特殊的成员方法__iter__()和__next__(),这两个方法便是支持迭代器协议所需要实现的方法。其中__iter__()方法返回迭代器对象本身,__next__()方法返回容器的下一个元素,直到结尾抛出StopIteration异常迭代(Iteration)它就是从某个地方(比如一个列表)取出一个元素的过程。当我们使用一个循环来遍历某个东西时,这个过程本身就叫迭代。        生成器(Generator)    生成器也是一种迭代器,但是你只能对其迭代一次。这是因为它们并没有把所有的值存在内存中,而是在运行时生成值。     """#迭代器我们可以自己实现迭代器协议创建迭代器对象,要实现迭代器协议也就是要在类中实现__iter__()和__next__()方法。class ListIterator(object):def __init__(self,data):self.__data =dataself.__count= 0def __iter__(self):return selfdef __next__(self):if self.__count < len(self.__data):val = self.__data[self.__count]self.__count +=1return valelse:raise StopIterationa = ListIterator([1,2,3,4,5])for i in a:print(i)a = ListIterator([1,2,3,4,5])#内部的工作原理应该是这样的while True:try:#print('test')i = a.__next__()print('this is a :',i)print(i,end='-')except StopIteration:break#可迭代对象是实现了__iter__()方法的对象,__iter__()可以返回一个迭代器对象。#迭代器对象是实现了__next__()方法的对象,其中他的__iter__()返回的是迭代器对象本身a = ListIterator([1,2,3,4,5])[i for i in a][i for i in a]print("\n生成器的多次迭代:")class ListIteratorable(object):def __init__(self,data):self.__data =datadef __iter__(self):print("call iterable __iter__()")return ListIterator(self.__data)a = ListIteratorable([1,2,4,5,6])b = a.__iter__()print(a)print(b)def generator_function():for i in range(1,10):yield ifor item in generator_function():print(item)#生成器最佳应用场景是:你不想同一时间将所有计算出来的大量结果集分配到内存当中,特别是结果集里还包含循环。def fibon(n):a=b=1for i in range(n):yield aa,b=b,a+bfor x in fibon(1):print(x)"""my_string = "Yasoob"next(my_string)iter。它将根据一个可迭代对象返回一个迭代器对象。"""my_string = "Yasoob"my_iter = iter(my_string)print(next(my_iter))def odd():    n=1    while True:        yield n        n+=2odd_num = odd()count = 0for o in odd_num:    if count >=5: break    print(o)    count +=1print("生成器的send()")def gen():value = 0while True:receive = yield valueif receive == 'e':breakvalue = 'got : %s' % receiveg=gen()print(next(g))#print(g.send(None))print(g.send('aaa'))"""可以通过generator.send(arg)来传入参数,这是协程模型。通过g.send(None)或者next(g)可以启动生成器函数,并执行到第一个yield语句结束的位置。此时,执行完了yield语句,但是没有给receive赋值。yield value会输出初始值0注意:在启动生成器函数时只能send(None),如果试图输入其它的值都会得到错误提示信息。通过g.send(‘aaa’),会传入aaa,并赋值给receive,然后计算出value的值,并回到while头部,执行yield value语句有停止。此时yield value会输出”got: aaa”,然后挂起。"""


阅读全文
0 0
原创粉丝点击