如何返回类中列表的迭代

时间:2017-01-13 17:02:37

标签: python python-3.x

我刚开始用Python学习课程,我遇到了问题。

我有以下行的txt文件:

3 37.5 200

6 36.9 200

9 36.6 100

12 36.6 0

当我运行下面的代码时,它只打印第一行。但是,我想检索所有的行。我知道您可以使用print(),但是可以返回吗?

class Meds:

    def __init__(self, file):
        self.file = file

    def meds(self):
        for i in source.readlines():
            data_split = i.strip().split(' ')

            hour = data_split[0]
            temp = data_split[1]
            dose = data_split[2]

            return 'At {0}:00 - he had {1} temp, and took {2} mg of meds'.format(hour, temp, dose)

if __name__ == '__main__':
    source = open('meds.txt', 'r', encoding='utf8')

    a = Meds(source)
    print(a.meds())

    source.close()

我非常感谢您的帮助,如果您能提供良好的,清晰的来源解释Python中的类,我将非常高兴。

3 个答案:

答案 0 :(得分:1)

readlines()返回文件中的所有行。您想要使用readline()

您似乎在迭代source而不是self.file。您从meds()方法返回,也只循环一行。您也可以直接在文件对象上循环。考虑到这一点,您的循环函数可能如下所示:

for line in self.file:
    data_split = i.strip().split(' ')
    hour = data_split[0]
    temp = data_split[1]
    dose = data_split[2]
    yield 'At {0}:00 - he had {1} temp, and took {2} mg of meds'.format(hour, temp, dose)

在调用meds()的代码中,您可以使用以下内容:

for med in a.meds():
    print(med)

如需进一步阅读,请参阅文档here

答案 1 :(得分:1)

您的Meds课程有两种方法,一种是__init__,另一种是meds

所以不是一个类,而是一个伪装的函数。

并非每个编程问题都可以而且应该通过编写类来解决。

def meds(path):
    with open(path) as medsfile:
        data = [tuple(float(k) for k in ln.split())
                for ln in medsfile if len(ln.strip()) > 0]
    return data

在输入数据上运行此命令会返回元组列表:

In [4]: meds('meds.txt')
Out[4]: [(3.0, 37.5, 200.0), (6.0, 36.9, 200.0), (9.0, 36.6, 100.0), (12.0, 36.6, 0.0)]

答案 2 :(得分:0)

你可以在那里重写你的代码:

true

在这种情况下,您将使用生成器generator