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是最好的:)