Python 将itertools与生成器类一起使用
我试图编写一个类,从程序读取的文件中生成单词。我一直在使用Python 将itertools与生成器类一起使用,python,Python,我试图编写一个类,从程序读取的文件中生成单词。我一直在使用\uu iter\uu和next方法。我的想法显然是读入\uuu init\uuu中的文件,但我不知道如何迭代它,因为我知道itertools将做类似的事情。有什么建议吗 目前我有这个代码 def __init__(self): self.words = [] self.n = 0 with open('words.txt') as f: text = f.read() for x in t
\uu iter\uu
和next
方法。我的想法显然是读入\uuu init\uuu
中的文件,但我不知道如何迭代它,因为我知道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']
本例中的
\uuuu iter\uuu
方法需要返回一个跟踪其位置的对象
如果\uuuu iter\uuuu
返回self
,您可以在实例变量中跟踪此位置,但它混合了两个职责,这意味着您的对象上不能有两个(或更多)独立的迭代器。但在某些情况下,这是有道理的
看起来你真的只是想要一台发电机
def MerriamWebster(fname='words.txt'):
with open(fname) as f:
for x in f:
if len(x) >= 2:
yield x
如果您希望对象上的迭代仅限于单词member,为什么不:
def __iter__(self):
return iter(self.words)
并将索引跟踪委托给列表迭代器。
next
不接受参数。您的类必须跟踪当前文件位置/单词索引本身。因此,我添加了一个n来跟踪位置,并认为这就是答案。但现在它只是不断返回相同的单词?将整个文件作为字符串(text=f.read()
)读取,然后在text.split()中用对x进行迭代,将字符串拆分为以空格分隔的单词,可能会更容易。有一点标点符号之类的问题,但是让单词
包含附近的单词是进步。你应该在下一步
中增加n
,而不是\iter\uuu
来解决它!Python是最好的:)