python how do I add a score on the same object 3 times in a row?

Question:

I have a problem adding scores to an object with a for loop.

what I’m trying to achieve is this:

enter test num: 1

enter test score: 58

enter test num: 2

etc…

and then print out the three test numbers and the average, but I can’t seem to get it to set the test num nor the score.

this is the error I get after tring to add test 1 and test 1 score:

Traceback (most recent call last):
  File "d:pyprojLecture 5Main.py", line 27, in <module>
    studentArray()
  File "d:pyprojLecture 5Main.py", line 25, in studentArray    s = student.setTestScore(test,score)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: student.setTestScore() missing 1 required positional argument: 'result'

Main.py

from student import student
def studentArray():
    classSize = int(input("how big is the class? "))
    classList = []
    
    num=0
    while not(num == classSize):
        firstName = input("nWhat's the students first name? ");
        lastName = input("nWhat's the students last name? ");
        homeAddress = input("nWhat's the students home address? ");
        schoolAddress = input("nWhat's the students school address? ");
        courseName = input("nWhat course is the students taking? ");
        courseCode = input("nWhat's the course code? ");
        
        classList.append(student(firstName,lastName,homeAddress,schoolAddress,courseName,courseCode));
        num+=1
    
    
    for s in classList:
        for i in range(len(classList)):
            test = int(input("enter test number: "))
            score = int(input("enter test score: "))
            s.setTestScore(test,score)
        print("n",s)
studentArray()

studentclass.py:

from Course import Course

class student:
    def __init__(self,first, last, home, school,courseName,courseCode):
        self.firstName = first
        self.lastName = last
        self.homeAddress = home
        self.schoolAddress = school
        self.courseName = courseName
        self.courseCode = courseCode
        Course(courseName,courseCode)
        self.testResults = []
    
    def setTestScore(self,test,result):
        if test < 1 | result < 0 | test > 100:
            print("Error: Wrong test results.")
        else:
            self.testResults.append(result)

    def average(self):
        average = 0;
        total = 0;

        for result in self.testResults:
            total += result
        

        average = total / 3.0;

        return average;

    def __str__(self):
        testAString = ""
        for testResult in self.testResults:
            testAString += str(testResult) + " "
        

        result = "Student name:n"+self.firstName + " " + self.lastName+"n";
        result += "Course name:n"+self.courseName+"n";
        result += "Course Code: "+ self.courseCode+"n";
        result += "Test results:n"+testAString+"n";
        result += "Average:n", str(self.average()), "n";
        result += "Home Address:n"+self.homeAddress+"n";
        result += "School Address:n"+ self.schoolAddress;
        
        return result;  

Courseclass.py:

class Course:
    def __init__(self,course,code):
        self.course = course
        self.code = code
        
    def setCourseName(self,name):
        self.course = name
        
    def setCourseCode(self, code):
        self.course = code
Asked By: Snickers

||

Answers:

There are several issues with your code, most of them involve try to concatenate strings and non string types, as well as a few type errors along the way. You are also using the bitwise | instead of or which are not the same thing.

Starting with your student class:

  1. use the actual or keyword instead of using bitwise |, it may be providing accurate results for some answers but it is not operating in the way you think it is.

  2. in your __str__ method there are a few instances where you are trying to contatenate a string and an int.

  3. in your setTestScores function you want to append the result to the testResults list.

Here is an example fix for those problems:

class student:
    testResults = []
    def __init__(self,first, last, home, school,courseName,courseCode):
        self.firstName = first
        self.lastName = last
        self.homeAddress = home
        self.schoolAddress = school
        self.courseName = courseName
        self.courseCode = courseCode
        Course(courseName,courseCode) 


    def setTestScore(self,test,result):
        if test < 1 or result < 0 or test > 100:
            print("Error: Wrong test results.")
        else:
            self.testResults.append(result)

    def average(self):
        average = 0
        total = 0
        for result in self.testResults:
            total += result
        average = total / 3.0
        return average

    def __str__(self):
        testAString = ""
        for testResult in self.testResults:
            testAString += str(testResult) + " "
        result = "Student name:n"+self.firstName + " " + self.lastName+"n"
        result += "Course name:n"+self.courseName+"n"
        result += "Course Code: "+ self.courseCode+"n"
        result += "Test results:n"+testAString+"n"
        result += "Average:n" + str(self.average()) +"n"
        result += "Home Address:n"+self.homeAddress+"n"
        result += "School Address:n"+ self.schoolAddress
        return result

Next you have the studentArray function.

  1. you don’t need to specify the size of the classList since lists can be dynamically appended to.

  2. you need to convert your instance to a string before concatenating it with the new line character.

Here is an example fix for that.

def studentArray():
    classSize = int(input("how big is the class? "))
    classList = []
    num=0
    while not(num == classSize):
        firstName = input("nWhat's the students first name? ")
        lastName = input("nWhat's the students last name? ")
        homeAddress = input("nWhat's the students home address? ")
        schoolAddress = input("nWhat's the students school address? ")
        courseName = input("nWhat course is the students taking? ")
        courseCode = input("nWhat's the course code? ")
        s = student(firstName,lastName,homeAddress,schoolAddress,courseName,courseCode)
        classList.append(s)
        num+=1
    for s in classList:
        for i in range(len(classList)):
            test = int(input("enter test number: "))
            score = int(input("enter test score: "))
            s.setTestScore(test,score)
        print("n"+str(s))

Making these adjustments this was the output of your code.

how big is the class? 1

What's the students first name? a

What's the students last name? b

What's the students home address? 10

What's the students school address? 12

What course is the students taking? art

What's the course code? 1
enter test number: 1
enter test score: 88

Student name:
a b
Course name:
art
Course Code: 1
Test results:
88
Average:
29.333333333333332
Home Address:
10
School Address:
12

finally if you want to add more test scores you need add another question that asks how many tests were taken in the class and then iterate based on the response.

num_tests = int(input('how many tests'))
for s in classList:
    for i in range(num_tests):
        test = int(input("enter test number: "))
        score = int(input("enter test score: "))
        s.setTestScore(test,score)       
    
Answered By: Alexander

Issue is you are trying to run setTestScore function without instantiating the class. Either make it a staticmethod or call it from an object

    for s in classList:
        for i in range(len(classList)):
            test = int(input("enter test number: "))
            score = int(input("enter test score: "))
            s.setTestScore(test,score)
        print("n"+s)

PS: Line

classList = [classSize]

creates a new list and adds classSize to the list as the first element. I assume you want to create a list with size of classSize. You do not need to specify length when creating lists in python.

Also,

    testResults = []

this initalization is outside of init, which makes testResults a class variable, means it will be shared within all classes. I would advise you to move it inside init function

Editing upon your edit, you are trying to concat string with a tuple

result += "Average:n", str(self.average()), "n";

What you should do is:

result += "Average:n" + str(self.average()) + "n";
Answered By: drx

In python you don’t need to end lines with ;

also you need to create an instance of the class and on that instance you can use the class methods

look in the code I added comments on every change

Main.py

from student import student


def studentArray():
    classSize = int(input("how big is the class? "))
    classList = []

    num = 0
    while num != classSize:
        firstName = input("nWhat's the students first name? ")
        lastName = input("nWhat's the students last name? ")
        homeAddress = input("nWhat's the students home address? ")
        schoolAddress = input("nWhat's the students school address? ")
        courseName = input("nWhat course is the students taking? ")
        courseCode = input("nWhat's the course code? ")
        new_student = student(firstName, lastName, homeAddress, schoolAddress, courseName, courseCode)
        classList.append(new_student)
        number_of_test = int(input("nHow many tests did the student had? "))
        for i in range(number_of_test):
            test = int(input("enter test number: "))
            score = int(input("enter test score: "))
            new_student.setTestScore(test, score)
        num += 1
    for s in classList:
        print("n" + str(s))


studentArray()

studentclass.py

from Course import Course


class student:
    def __init__(self, first, last, home, school, courseName, courseCode):
        self.firstName = first
        self.lastName = last
        self.homeAddress = home
        self.schoolAddress = school
        self.courseName = courseName
        self.courseCode = courseCode
        self.testResults = []
        Course(courseName, courseCode)

    def setTestScore(self, test, result):
        if test < 0 or result < 0 or result > 100:
            print("Error: Wrong test results.")
        else:
            self.testResults.append(result)  # append to the list

    def average(self):
        average = 0
        total = 0

        for result in self.testResults:
            total += result

        average = total / 3.0

        return str(average)  # str the average

    def __str__(self):
        testAString = ""
        for testResult in self.testResults:
            testAString += str(testResult) + " "   # str the testResult

        result = "Student name:n" + self.firstName + " " + self.lastName + "n"
        result += "Course name:n" + self.courseName + "n"
        result += "Course Code: " + self.courseCode + "n"
        result += "Test results:n" + testAString + "n"
        result += "Average:n" + self.average() + "n"
        result += "Home Address:n" + self.homeAddress + "n"
        result += "School Address:n" + self.schoolAddress

        return result
Answered By: Omer Dagry
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.