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

生成器

"""
    可迭代对象(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”,然后挂起。
"""


你可能感兴趣的:(python进阶,python进阶,生成器)