Python 如何制造发电机,即';它由另一台发电机组成

Python 如何制造发电机,即';它由另一台发电机组成,python,python-2.7,iterator,generator,Python,Python 2.7,Iterator,Generator,我想做一台发电机。那个发电机应该是可调的。这基本上是为了将生成器插入现有框架 这是我目前掌握的密码 class Iter1(object): def __init__(self, iterable=None): self.iterable = iterable def __iter__(self): if self.iterable is None: self.iterable = Iter2() ret

我想做一台发电机。那个发电机应该是可调的。这基本上是为了将生成器插入现有框架

这是我目前掌握的密码

class Iter1(object):

    def __init__(self, iterable=None):
        self.iterable = iterable

    def __iter__(self):
        if self.iterable is None:
            self.iterable = Iter2()
        return self.iterable

    def next(self):
        for thing in self.iterable:
            yield thing


class Iter2(object):

    DEFAULT_PATH = r"/Users/Documents/stuff.txt"

    def __init__(self, path=None):
        self.path = path or self.DEFAULT_PATH

    def __iter__(self):
        return self

    def next(self):
        with open(self.path, 'r') as f:
            for line in f:
                yield line


if __name__ == "__main__":
    iterable = Iter1()
    for thing in iterable:
        print(thing)
这段代码有两个问题。第一个是返回(屈服)的不是文件中的一行,而是另一个生成器对象。 第二,它不返回文件中的行数,它只返回无限多行。我明白这是因为每次我在
Iter2
中调用
next
时,我都会再次打开文件,但是我不知道如何在不将整个文件加载到内存的情况下生成每一行。

:

iter()的任一形式返回的迭代器对象都有一个next() 方法。此方法返回 迭代,或引发StopIteration(或派生的异常类) 发出迭代结束的信号。任何其他例外情况都应予以纠正 被认为表示错误,应正常传播, 不意味着迭代的结束

您正在从
next()
返回一个迭代器,这就是它不能按预期工作的原因。相反,您应该在每次调用
next()
时返回一个值


另外,让
\uu iter\uu()
返回
self
有点奇怪。通常假设多次调用
iter(sequence)
将返回多个新的迭代器,每个迭代器都从序列的开头开始,但您的代码并非如此。

您所说的有道理,但我不太明白代码中的问题在哪里。
iter2
中的
next
方法应该从文件中生成一行,不是吗?这应该意味着
Iter1
next
方法也会产生一行,no?@GreeTreePython no,在
next()中使用
yield
是不对的。在本例中,迭代器包装器可以执行如下操作:
def next(self):return next(self.iterator)
。Python本身将反复调用
next()
方法,每次返回一个值,或者在没有更多值时抛出
StopException
。由于要包装的迭代器具有相同的
next
行为,因此可以直接转发它。