保存函数状态的迭代
def Fun(N):
for i in range(N):
yield i # 返回i
print("Continue!") # yield迭代器会保存函数执行状态, 下次调用时会从这里继续执行.
for i in Fun(3):
print(i)
print("="*8)
for i in range(3):
print(Fun(i))
Output:
0
Continue!
1
Continue!
2
Continue!
========
<generator object Fun at 0x000002B1795EB7B0>
<generator object Fun at 0x000002B1795EB7B0>
<generator object Fun at 0x000002B1795EB7B0>
for i in xxx中, xxx是可迭代对象, 所以用for循环遍历Fun(3)能够正确得到函数返回值. 但是直接打印Fun(3)又只能得到一个迭代器地址.
既然是迭代器, 那么就支持next()方法.
x = Fun(3)
print(x.__next__())
print(x.__next__())
print(x.__next__())
print(x.__next__())
Output:
0
Continue!
1
Continue!
2
Continue!
StopIteration
可以看出, 在迭代完毕后继续迭代, 则会抛出StopIteration异常.
由于调用迭代器的__next__()方法与直接调用python的next()函数是等效的, 所以以上输出语句可以被下式等效替代.
print(next(x))
print(next(x))
print(next(x))
print(next(x))