python generator/yield 实施示例

Example python implementation of generator/yield

让我们用下面的python代码来生成一个无限计数器:

def infinite_sequence():
    num = 0
    while True:
        yield num
        num += 1

然后我可以将其称为:

for i in infinite_sequence():
    print (i)

并在我想退出时执行 KeyboardInterruptyield/generator 内容在 C/Cpython 中实现。在 python 中实施类似 "generator functionality" 的示例是什么?也就是说,如果我可以调用 function/method 代替 yield num 行,并获得相同的功能,那么 python 中的示例实现是什么?

您必须自己实现迭代器协议。

class InfiniteSequence:
    def __init__(self):
        self.x = 0

    def __iter__(self):
        return self

    def __next__(self):
        x = self.x
        self.x = x + 1
        return x


for i in InfiniteSequence():
    print(i)

__iter__ 方法必须 return 实现 __next__ 的东西。 __next__ 方法必须 return 序列中的下一个值。实例属性在 __next__.

调用之间保持状态

相同的 class 不必实现这两种方法。您可能需要一个单独的迭代器 class,以便您可以在可迭代序列上拥有多个独立的迭代器。

class InfiniteSequence:
    def __init__(self, start):
        self.start = start

    def __iter__(self):
        return InfSeqIterator(self.start)


class InfSeqIterator:
    def __init__(self, x):
        self.x = x

    def __iter__(self):
        return self

    def __next__(self):
        x = self.x
        self.x += 1
        return x


nats = InfiniteSequence()

i1 = iter(nats)
i2 = iter(nats)

assert next(i1) == 0
assert next(i2) == 0  # not 1

generator 只是实现此协议的 class 的一个示例;您使用生成器表达式 ((x for x in [1,2,3])) 或生成器函数(即使用 yield 的函数)创建 generator 的实例。