"""
可迭代对象(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 =data
self.__count= 0
def __iter__(self):
return self
def __next__(self):
if self.__count < len(self.__data):
val = self.__data[self.__count]
self.__count +=1
return val
else:
raise StopIteration
a = 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 =data
def __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 i
for item in generator_function():
print(item)
#生成器最佳应用场景是:你不想同一时间将所有计算出来的大量结果集分配到内存当中,特别是结果集里还包含循环。
def fibon(n):
a=b=1
for i in range(n):
yield a
a,b=b,a+b
for 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+=2
odd_num = odd()
count = 0
for o in odd_num:
if count >=5: break
print(o)
count +=1
print("生成器的send()")
def gen():
value = 0
while True:
receive = yield value
if receive == 'e':
break
value = 'got : %s' % receive
g=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”,然后挂起。
"""