Python: yield迭代器

160 阅读1分钟

保存函数状态的迭代

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))