【问题标题】:creating class instances from a text file in python从python中的文本文件创建类实例
【发布时间】:2011-11-28 15:13:14
【问题描述】:

我有一个多项式类:

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

要向此类添加实例,请输入以下内容:

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

现在我正在尝试创建一个从文本文件中读取信息的函数,并从该文本文件中创建一个 Polynomial 类的实例。信息存储在文本文件中,如下所示:

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] 将不起作用。有没有一种方法可以遍历每个索引,无论长度是多少?

【问题讨论】:

    标签: python file instances


    【解决方案1】:

    你只需要

    return Polynomial(*poly)
    

    而不是

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

    Docs here ...阅读以“”“如果语法*表达式出现在函数调用中”“”开头的段落

    奖励:你的函数不使用它的 arg,像疯了一样重用名称 poly,而且不习惯,所以我重写了整个东西:

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

    HTH

    【讨论】:

    • 大声笑,我什至没想过要使用 *poly,另外,感谢您提供使函数看起来更整洁的提示。
    【解决方案2】:

    return 总是在调用时立即退出函数,并且只能返回一项。因此,如果您想要返回多个项目(在某种意义上),您必须将它们打包在一个列表中,然后将其返回。

    代替for循环:

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

    您当然必须将这个新结果作为一个列表来处理。

    【讨论】:

    • 这有帮助,我会试着弄清楚如何处理这个列表。
    【解决方案3】:

    乍一看,这似乎是在创建第一个之后返回,所以你只能得到一个。尝试将return 语句替换为yield 然后:

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

    如果有帮助,the first response here 是对产量的一个很好的总结。同样,这只是快速浏览一下您所写的内容。

        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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-07
      相关资源
      最近更新 更多