可迭代类
重载以下两个函数既可以实现类的可迭代功能。
__iter__
__next__
class A:
def __init__(self):
self.data = [1,2,3]
self.idx = 3
def __iter__(self):
return self
def __next__(self):
if self.idx > 0:
self.idx -= 1
return self.data[self.idx]
else:
raise StopIteration
for i in A():
print(i)
yield函数
yield函数只能用在Generator中,yield函数是一个特殊的实现,如下面代码所示,
在第一次调用next后,执行语句
print('before yield')
yield n
下一次执行时会继续执行,如果没有数据的时候,yield会返回StopIteration异常,在for语句中不需要捕获这个异常,会自动停止迭代。
def generator(n):
print('before yield')
yield n
print('after yield')
g = generator(10)
print(next(g))
print(next(g))
#输出结果
before yield
10
after yield
Traceback (most recent call last):
File "tmp.py", line 8, in <module>
print(next(g))
StopIteration
用for语句访问
def generator(n):
print('before yield')
yield n
print('after yield')
for i in generator(10):
print(i)
#输出结果为
before yield
10
after yield
<完>