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
行为,因此可以直接转发它。