如何制作一台由另一台发电机组成的发电机

时间:2017-03-02 02:32:15

标签: 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()
        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)

我对此代码有两个问题。第一个是返回(产生)的东西不是文件中的一行,它是另一个生成器对象。 第二个是它没有返回文件中的行数,它只返回无限数量的行。我明白这一点,因为每次我在next中拨打Iter2我都会再次打开文件,但后来我不明白如何在不加载的情况下产生每一行将整个文件存入内存。

1 个答案:

答案 0 :(得分:1)

PEP 234 -- Iterators

  

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

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

此外,让__iter__()返回self有点奇怪。通常假设多次调用iter(sequence)将返回多个新迭代器,每个迭代器从序列的开头开始,但是代码不是这种情况。