我想做一个发电机。那个生成器应该是可迭代的。这基本上是我可以将生成器插入现有框架。
这是我到目前为止的代码。
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
我都会再次打开文件,但后来我不明白如何在不加载的情况下产生每一行将整个文件存入内存。
答案 0 :(得分:1)
iter()的任何形式返回的迭代器对象都有一个next() 方法。此方法要么返回下一个值 迭代,或引发StopIteration(或派生的异常类) 发出迭代结束的信号。应该是任何其他例外 被认为是表示错误,应该正常传播, 并不意味着迭代的结束。
您正在从next()
返回一个迭代器,这就是为什么它没有按预期工作的原因。相反,每次调用next()
时都应该返回一个值。
此外,让__iter__()
返回self
有点奇怪。通常假设多次调用iter(sequence)
将返回多个新迭代器,每个迭代器从序列的开头开始,但是代码不是这种情况。