如何确定我的Python代码需要无限时间运行的原因

时间:2018-06-13 19:49:38

标签: python oop file-io

我学到了一点OOP和文件I / O.我尝试通过制作自己的代码将它们应用到现实生活中。然而不幸的是,它并没有运行。 Python从未说过有错误。它只是整天执行命令,并说请等待结果。

这是我的代码:

class CoursesTaken():

    def __init__(self):
        self._courses = []

    def read_file(self, file):
        line = file.readline().strip()
        while line != 0:
            course = tuple(line.split())
            self._courses.append(course)

    def add_course(self, season, code, gpa):
        self._course = (season, code, gpa)
        self._courses.append(self._course)

    def total_courses(self):
        return self._courses

    def name_of_total_courses(self):
        result = []
        for i in self._courses:
            name = i[1]
            result.append(name)
        return result


if __name__ == '__main__':
    file = open('courses.txt')
    courses = CoursesTaken()
    courses.read_file(file)
    print(courses.name_of_total_courses)
    file.close()

txt文件采用以下格式:

2018S CSC111 A

2018S MAT101 B +

我不知道如何改进我的代码。

3 个答案:

答案 0 :(得分:3)

您的问题出在此代码段中:

line = file.readline().strip()
while line != 0:

line永远不会是== 0,因为它是一个字符串,而0是一个整数。它们永远不会在python中比较相等,所以你的循环永远重复。此外,您不会在循环内部执行任何操作来更改line变量的值。它将永远保持在循环开始之前分配的第一个值,条件永远不会改变。

答案 1 :(得分:1)

虽然可以使用while循环和显式调用readline来迭代文件内容,但没有理由这样做。

def read_file(self, file):
    for line in file:
        line = line.strip()
        course = tuple(line.split())
        self._courses.append(course)

可以进一步浓缩:

def read_file(self, file):
    self._courses.extend(tuple(line.strip().split()) for line in file)

如果您选择使用while循环,则负责每次迭代调用readline一次,以获取换行符,直到它返回空字符串。

def read_file(self, file):
    line = file.readline().strip()
    while line != "":
        self._courses.append(tuple(line.split()))
        line = file.readline().strip()

答案 2 :(得分:0)

这是编写无限循环的经典示例。

创建while循环的三个必要组件是

  1. 进行比较
  2. 代码正文
  3. 更新比较变量
  4. 你有前两部分。但是,行:

    line = file.readline().strip()
    

    在你的while循环之外。除了您指定的第一行之外,行永远不会是任何东西。解决这个问题的最简单方法是添加另一个

    line = file.readline().strip()
    while line != 0:
        course = tuple(line.split())
        self._courses.append(course)
        line = file.readline().strip()
    

    正如@nosklo所说:做while循环的正确方法是不要比较为零。我通常喜欢

    while line:
        # code