python - 使用从 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))
解决方案
您实际上并没有在循环中初始化学生。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()
推荐阅读
- three.js - ThreeJS:将场景导出到 3DS
- rust - 大括号表达式对于循环和 while 的行为不同
- javascript - 如何在React中一个一个地循环遍历div标签内的数组元素
- angular - 在Angular中获取“类型'MediaDevices'上不存在属性'getDisplayMedia'”
- c# - HttpClient 返回不完整的响应内容
- python - Bluez 5.23 -> Bluez 5.43 - 蓝牙已连接但没有声音
- python - AWS Lambda 函数如何获取并行函数的结果?
- css - 即使使用 flex-start 或 spece,Flex-box 元素也会拉伸
- mysql - mySQL比较年和周的两个日期
- asp.net-core - .net core SPA Angular中的脚手架管理员CRUD