我正在尝试编写一个从程序读入的文件中生成单词的类。我坚持使用__iter__
和next
方法。我的想法显然是在__init__
中阅读文件,但我对如何迭代它感到困惑,因为我知道itertools
会做类似的事情。有什么建议吗?
目前我有这段代码。
def __init__(self):
self.words = []
self.n = 0
with open('words.txt') as f:
text = f.read()
for x in text.split():
if len(x) > 2 and x[0].islower():
self.words.append(x)
def __iter__(self):
return self
def next(self):
if(self.n == 0):
self.n = self.n + 1
return self.words[0]
else:
self.n = self.n + 1
return self.words[self.n-1]
这就是代码的运行方式。
>>> mw = MerriamWebster()
>>> [w for w in itertools.islice(mw, 5)]
['aal', 'aalii', 'aam', 'aardvark', 'aardwolf']
答案 0 :(得分:0)
在这种情况下,__iter__
方法需要返回一个跟踪它位置的对象。
如果__iter__
返回self
,您可以在实例变量中跟踪此位置,但它混合了两个职责,这意味着您不能在对象上拥有两个(或更多)独立迭代器。但在某些情况下它可能有意义。
看起来你真的只想要一个发电机
def MerriamWebster(fname='words.txt'):
with open(fname) as f:
for x in f:
if len(x) >= 2:
yield x
答案 1 :(得分:0)
如果你希望迭代你的对象只是单词成员,为什么不这样做:
def __iter__(self):
return iter(self.words)
并将索引跟踪委托给列表迭代器。