1. 迭代器
一个实现了__iter__方法的对象是可迭代的,一个实现了__next__方法的对象则是迭代器。 --《Python基础教程 第2版·修订版》 P152
举一个简单的例子,定义一个类,该类按照迭代器定义实现了__iter__方法和__next__方法,每一次迭代__next__方法都会对属性a做+1操作,直到属性a的值大于10抛出异常:
class A():
def __init__(self):
self.a = 0
def __next__(self):
self.a += 1
if self.a > 10:
raise StopIteration
return self.a
def __iter__(self):
return self
现在实例化类A,并循环打印:
a = A()
for i in a:
rint(i)
查看打印结果,发现是符合预期的:
现在验证下定义,如果不实现__iter__会有什么现象,注释掉__iter__函数:
class A():
def __init__(self):
self.a = 0
def __next__(self):
self.a += 1
if self.a > 10:
raise StopIteration
return self.a
# def __iter__(self):
# return self
再次运行发现报错了: TypeError: 'A' object is not iterable
再验证下不实现__next__方法,会有什么现象,注释掉__next__函数:
class A():
def __init__(self):
self.a = 0
# def __next__(self):
# self.a += 1
# if self.a > 10:
# raise StopIteration
# return self.a
def __iter__(self):
return self
再次运行报错:TypeError: iter() returned non-iterator of type 'A'
从上面的现象可以看出,\_\_iter__是用来声明该类是可迭代的,而_\_next__是用来返回每次迭代的返回值的
,缺一不可。
2. 生成器
生成器是一种用普通函数语法定义的迭代器
。
任何包含yield
语句的函数称为生成器,它不像return那样返回值,而是每次产生多个值。
每次产生一个值,函数就会被冻结:即函数停在那点等待被重新唤醒。函数被重新唤醒后就从停止的那点开始执行。
一个简单例子,生成器函数为遍历0-10,并打印:
def simple_generator():
for i in range(10):
yield i
for i in simple_generator():
print(i, end='\t')
打印结果