难道不能像简单的迭代器OBJECTS那样实现所有生成器吗?为什么已经为一般问题引入了特定的解决方案(YIELD)?
class Generator:
def __init__(self):
self.i = 0
def __next__(self):
self.i += 1
return self.i
谢谢
答案 0 :(得分:3)
通常,只要特殊想法(在意义上不那么通用)清晰易懂,易于编写,那么它的使用比更一般的想法,它导致更密集和更易理解的代码。 (这也是语法的全部内容。想想1 + 2
与plus(1, 2)
或1.plus(2)
的可读性有多大。有时称为语法糖,但是在使代码更容易理解时非常重要。)
还要考虑你提到的迭代器。它们非常易于使用,尤其是在您不需要编写它们的情况下。否则,即使在编写迭代器时也会出错。发电机也很特别,因为它们很简单。这样,带有yield 的函数可能比实现迭代器的通用类更优化。
比较以下(示例)生成所需数量的文件名的解决方案:
class Fnames:
def __init__(self, prefix, cnt):
self.prefix = prefix
self.i = 0
self.cnt = cnt
def __next__(self):
if self.i >= self.cnt:
raise StopIteration
fname = '{}{:04}'.format(self.prefix, self.i)
self.i += 1
return fname
def __iter__(self):
return self
for fname in Fnames('file', 5):
print(fname)
print('--------------------------------------------------- the same')
def fnames(prefix, cnt):
for i in range(cnt):
yield '{}{:04}'.format(prefix, i)
for fname in fnames('file', 5):
print(fname)
(它产生......)
file0000
file0001
file0002
file0003
file0004
--------------------------------------------------- the same
file0000
file0001
file0002
file0003
file0004
请注意,生成器解决方案需要大约3行代码,而迭代器类大约需要5倍。你必须至少研究类代码一段时间才能认识到它是一个迭代器及其作用。