为什么在__next __()内部使用yield会返回生成器?

时间:2018-07-31 19:01:22

标签: python iterator generator yield iterable

python文档指出:

  

iterator .__ next __()

     

从容器中返回下一个项目。如果没有其他项目,请引发StopIteration异常。

因此,据此,如果我有一个要使其可迭代的类,则应在该类的给定已经可迭代的字段上进行迭代,因此我应该能够在循环中使用<base>表示该字段,并在循环后返回yield

StopIteration

但是,这使我陷入了无限循环的发电机:

class C:
    def __init__(self):
        self.__l = list(range(10))

    def __iter__(self):
        return self
    def __next__(self):
        for x in self.__l:
            yield x # return next item from container
        raise StopIteration # if there are no further items, raise the StopIteration exception.

输出:

c = C()
for x in c:
    print(x)

那是为什么?我在哪里误解文档?

我本来可以做

<generator object C.__next__ at 0x10fa6afc0>
<generator object C.__next__ at 0x10fa6a678>
<generator object C.__next__ at 0x10fa6afc0>
<generator object C.__next__ at 0x10fa6a678>
<generator object C.__next__ at 0x10fa6afc0>
<generator object C.__next__ at 0x10fa6a678>
<generator object C.__next__ at 0x10fa6afc0>
<generator object C.__next__ at 0x10fa6a678>
...

而不执行def __iter__(self): return iter(self.__l) ,但这不是我的问题。

编辑:

是的,我已经读过那个所谓的副本。它确实无法回答我的问题。

0 个答案:

没有答案