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)
,但这不是我的问题。
是的,我已经读过那个所谓的副本。它确实无法回答我的问题。