在Python中从文本文件创建类实例

1 投票
3 回答
8136 浏览
提问于 2025-04-17 07:12

我有一个多项式类:

class Polynomial:
    def __init__(self, *termpairs):
        self.termdict = dict(termpairs)

要向这个类添加一个实例,你需要输入以下内容:

P = Polynomial((3,2), (4,5), (9,8))

现在我想创建一个函数,从一个文本文件中读取信息,并根据这些信息创建一个多项式类的实例。文本文件中的信息是这样存储的:

4 6
2 3
9 8
3 5
0 42

到目前为止,这个函数看起来是这样的:

def read_file(polyfilename):
    polyfilename = open("polyfilename.txt", "r")
    poly1 = polyfilename.read()
    polyfilename.close()
    poly1 = [line.split() for line in poly1.split("\n")]
    poly1 = [[int(y) for y in x] for x in poly1]
    for item in poly1:
        return Polynomial(item)

它只为文本文件中的第一个配对创建了一个多项式实例,我该如何为文本文件中的所有配对都创建多项式实例呢?

编辑: 现在我的函数是这样的:

def read_file(polyfilename):
    polyfilename = open("polyfilename.txt", "r")
    poly = polyfilename.read()
    polyfilename.close()
    poly = [line.split() for line in poly.split("\n")]
    poly = [[int(y) for y in x] for x in poly]
    return Polynomial(poly[0], poly[1], poly[2], poly[3], poly[4])

它给了我想要的结果,但是这些文本文件的长度可能会不同,所以直接写poly[1],poly[2]就不行了。有没有办法让我可以遍历每个索引,不管长度是多少?

3 个回答

0

乍一看,这段代码似乎在创建第一个东西后就返回了,所以你只会得到一个结果。试着把 return 语句换成 yield

for p in read_file('somefile'):
  # p is a polynomial object, do what you will with it

如果有帮助的话,这里的第一条回复对 yield 进行了很好的总结。再次强调,这只是我对你写的内容的快速观察。

    def read_file(polyfilename):
        polyfilename = open(polyfilename, "r")
        poly1 = polyfilename.read()
        polyfilename.close()
        poly1 = [line.split() for line in poly1.split("\n")]
        poly1 = [[int(y) for y in x] for x in poly1]
        for item in poly1:
            yield Polynomial(item)

    for p in read_file('sample.txt'):
        print p

产生的结果是

<__main__.Polynomial instance at 0x39f3f0>
<__main__.Polynomial instance at 0x39f418>
<__main__.Polynomial instance at 0x39f3f0>
<__main__.Polynomial instance at 0x39f418>
<__main__.Polynomial instance at 0x39f3f0>
1

在调用时,return会立即结束函数,并且只能返回一个东西。所以如果你想返回多个东西(从某种意义上来说),你必须把它们放在一个列表里,然后再返回这个列表。

在for循环的地方:

polys = []
for item in poly1:
    polys.append(Polynomial(item))
return polys

当然,你需要把这个新的结果当作一个列表来处理。

1

你只需要这个:

return Polynomial(*poly)

而不是这个:

return Polynomial(poly[0], poly[1], poly[2], poly[3], poly[4])

文档可以在 这里 找到……阅读从"""如果语法 *expression 出现在函数调用中"""开始的段落。

附加说明:你的函数没有使用它的参数,疯狂地重复使用了名称 poly,而且写法不太规范,所以我把整个东西重写了一遍:

def read_file(polyfilename):
    with open(polyfilename) as f:
        return Polynomial(*[[int(x) for x in line.split()] for line in f])

希望这对你有帮助。

撰写回答