# -*- coding: utf-8 -*-
"""
迭代器和生成器
迭代器:类型list、tuple、file、dict的对象有__iter__()方法,标志着它们能够迭代
用__iter__()方法生成迭代对象,然后用__next__()方法访问
生成器:是迭代器,__iter__()和next();针对大数据的时候,Python处理列表时,将全部数据都读入到内存,而
迭代器(生成器是迭代器)的优势就在于只将所需要的读入内存里,因此生成器解析式比列表解析式少占内存
一个简单的生成器my_generator = (x*x for x in range(4))
yield:生成器的标志,yield除了作为生成器的标志之外,还有一个功能就是返回值;作为生成器的函数,
由于有了yield,遇到它则程序挂起
yield和return的区别:return返回后,程序后面的语句不执行,yield返回后,程序挂起,再次调用__next__()时,继续执行后面的语句
"""
class MyIter:
'''简单的range迭代器实现'''
def __init__(self,n):
self.i=0
self.n=n
def __iter__(self):
'''__iter__()是类中的核心,它返回了迭代器本身,实现了__iter__()方法的对象,即意味着其可迭代'''
print("调用__iter__()")
return self
def __next__(self):
'''含有next()的对象就是迭代器,并且在这个方法中,在没有元素的时候要发起StopIteration()异常。'''
print("调用__next__()")
if self.i<self.n:
i=self.i
self.i=self.i+1
return i
else:
raise StopIteration()
def gener():
'''函数f()通过yield生成一个简单的迭代器'''
yield 0
yield 1
yield 2
def R_return(n):
'''return返回值测试,return后的语句不执行'''
while(n>0):
print("before return")
return n
n=n-1
print("after return")
def R_yield(n):
'''yield返回值测试,yiled后的语句执行,每次通过__next__()获取函数值'''
while(n>0):
print("before yield")
yield n
n=n-1
print("after yield")
else:
raise StopIteration()
if __name__=="__main__":
'''迭代器测试'''
mi=MyIter(7)
for i in mi:
print(i)
'''生成器测试'''
a=gener() #含有yield关键词的函数是一个生成器类型的对象,这个生成器对象是可迭代的
print(type(a)) #generator
print(a.__next__())
'''return ,yield返回测试'''
R_return(3)
for i in R_yield(3):
print(i)
实验结果:
调用__iter__()
调用__next__()
0
调用__next__()
1
调用__next__()
2
调用__next__()
3
调用__next__()
4
调用__next__()
5
调用__next__()
6
调用__next__()
<class 'generator'>
0
before return
before yield
3
after yield
before yield
2
after yield
before yield
1
after yield
E:/学习/20181023-2.py:83: DeprecationWarning: generator 'R_yield' raised StopIteration
for i in R_yield(3):