首页 > 解决方案 > 使用从 for 循环生成的变量从 Python 构造函数打印

问题描述

我编写了一个小程序来输入 3 个名称及其各自的测试结果,然后使用 Python 构造函数将它们输出到一个表中__init__,如下所示:

class StudentMarks:
    def __init__(self,studentName,testMark):
        self.studentName = studentName
        self.testMark = testMark

    def printInputs(self):      # Tried to just get two bits of info input each time
        print(self.studentName + "'s test score was: " + self.testMark)


student1 = input("Student name: ")
test1 = int(input("Test Score: "))
student1 = StudentMarks(student1,test1)
student2 = input("Student name: ")
test2 = int(input("Test Score: "))
student2 = StudentMarks(student2,test2)
student3 = input("Student name: ")
test3 = int(input("Test Score: "))
student3 = StudentMarks(student3,test3)


print()
print("%-10s %-5s" %("NAME","SCORE"))
print("%-10s %-5d" %(student1.studentName,student1.testMark))
print("%-10s %-5d" %(student2.studentName,student2.testMark))
print("%-10s %-5d" %(student3.studentName,student3.testMark))

这不是很优雅,所以我尝试使用 for 循环来获取输入,但是当我尝试打印结果时,我要么得到内存位置(当我将结果附加到列表时),要么变量说它未分配.

谁能帮我找出哪里出错了?提前致谢!

class StudentMarks:
    def __init__(self,studentName,testMark):
        self.studentName = studentName
        self.testMark = testMark


resultsList = []
counter = 0
for count in range(0, 3):
    counter +=1
    nameInput = str(input("Student Name: "))
    testInput = int(input("Test Score: "))
    student = str("student" + str(counter))
    resultsList.append(student)


print(resultsList)    #This shows that the variables I try to usre are in the list correctly

print()
print("%-10s %-5s" %("NAME","SCORE"))
# All these come up as not defined...
print("%-10s %-5d" %(student1.studentName,student1.testMark))
print("%-10s %-5d" %(student2.studentName,student2.testMark))
print("%-10s %-5d" %(student3.studentName,student3.testMark))

print()
# All of these give me AttributeErrors...
print("%-10s %-5s" %("NAME","SCORE"))
print("%-10s %-5d" %(resultsList[0].studentName,resultsList[0].testMark))
print("%-10s %-5d" %(resultsList[1].studentName,resultsList[1].testMark))
print("%-10s %-5d" %(resultsList[2].studentName,resultsList[2].testMark))

标签: pythonconstructor

解决方案


您实际上并没有在循环中初始化学生。student等于一个字符串str("student" + str(counter))

我认为您最初的方法很好,让学生班负责格式化打印。让我们让它更 Pythonic 一点:

class StudentMarks:
    def __init__(self, student_name, test_mark):
        self.student_name = student_name
        self.test_mark = test_mark

    def print_result(self):      # Tried to just get two bits of info input each time
        print(f"{self.student_name}'s test score was: {self.test_mark}")

    def print_result_formatted(self):
        print(f"{self.student_name:10s} {self.test_mark:5d}")

接下来,在 for 循环中实际创建对象:

results_list = []
for count in range(0, 3):
    name_input = str(input("Student Name: "))
    test_input = int(input("Test Score: "))
    results_list.append(
        StudentMarks(name_input, test_input)
    )

然后,results_list会有StudentMarks对象,所以你可以像这样打印它们:

print("%-10s %-5s" %("NAME","SCORE"))
print("%-10s %-5d" %(results_list[0].student_name, results_list[0].test_mark))
print("%-10s %-5d" %(results_list[1].student_name, results_list[1].test_mark))
print("%-10s %-5d" %(results_list[2].student_name, results_list[2].test_mark))

或者像这样:

for result in results_list:
    result.print_result_formatted()

推荐阅读