2017-09-21 4 views
0

나는 모든 '생성 된'학생의 평균 출석을 표시하려고 시도한 다음 코드를 가지고 있습니다. 나는 존재하는 모든 학생들을 카운트하고 인쇄하는 studentCount를 가지고 있지만 출석을 위해 이것을 할 논리에 도달하지 못하는 것 같습니다. 내 시도는 다음과 같습니다 : 평균 출석은 분명히 평균해야 작동하지 않습니다 무엇Python에서 클래스를 사용하여 평균 출석을 표시하는 방법

=Name: Student1 =Form: 9F Special Interest: Guitar Attendance: 10 Merits: 200 
=Name: Student2 =Form: 9R Special Interest: Chess Attendance: 7 Merits: 488 
=Name: Student3 =Form: 9T Special Interest: Dance Attendance: 9 Merits: 770 
=Name: Student3 =Attendance: 9 
Average Attendance: 3.0 
Total Students: 3 

..

코드

class Student: 
    studentCount=0 
    attendanceAverage=0 

    def __init__(self, name, form,special_interest,attendance, merits): #additional variables added here such as special_interest, merits, attendance 
     self.name=name 
     self.form=form 
     self.special_interest=special_interest #additions for the above made here 
     self.attendance=attendance 
     self.merits=merits 

     Student.studentCount+=1 
     Student.attendanceAverage=attendance/Student.studentCount 

    def displayCount(self): 
     print("Total Students:",Student.studentCount) 

    def displayStudent(self): 
     print("=Name:",self.name,"=Form:",self.form,"Special Interest:",self.special_interest,"Attendance:",self.attendance,"Merits:",self.merits) #updating the print method for displayStudent to include additional variables 

    def displayAttendance(self): 
     print("=Name:",self.name,"=Attendance:",self.attendance) 



student1=Student("Student1","9F","Guitar",10,200) 
student2=Student("Student2","9R","Chess",7,488) 
student3=Student("Student3","9T","Dance",9,770) 
student1.displayStudent() 
student2.displayStudent() 
student3.displayStudent() 
student3.displayAttendance() 

print("Average Attendance:",Student.attendanceAverage) 
print("Total Students:",Student.studentCount) #prints a total count of students 

전류 출력 이 경우 10, 7 및 9가됩니다. 나는

Student.attendanceCount=? #sum all the existing values for attendance Average=attendanceCount/Student.studentCount 

이 먼저 다양한 학생들의 출석을 합계를 시도했다 ... 아래 (첫번째 관중의 합 ... 내가 평균을 계산할 수있는 후를 선언하려고)과 같은 여러 가지 시도 , 그리고 나는 그들을 계속 평균화 할 것이다. 나는 첫 번째 일을하기 위해 구문에 도달 할 수 없다 (각 학생의 모든 값을 얻음). 그렇게 할 파이썬 또는 가장 좋은 방법이 있습니까?

대답 대답이 인 경우 누군가 적절한 설명과 설명 및 적절한 경우 더 좋은 방법으로 같은 문제를 해결할 수 있습니까?

답변

1

문제는 당신이 인스턴스화 정적 변수 Student.attendance마다 할당하는 것입니다 : 총 출석을 추적하는 새로운 클래스 수준의 변수를 추가 Student 클래스 평균 참여율은 코드에 따라 9/3 = 3입니다. 코드가 작동하지 않는 이유

`class Student: 
studentCount=0 
attendanceAverage=0 
attendanceSum = 0 

def __init__(self, name, form,special_interest,attendance, merits): #additional variables added here such as special_interest, merits, attendance 
    self.name=name 
    self.form=form 
    self.special_interest=special_interest #additions for the above made here 
    self.attendance=attendance 
    self.merits=merits 

    Student.studentCount+=1 
    Student.attendanceSum += attendance # increment Student's static sum of attendances by this student's attendance 
    Student.attendanceAverage = Student.attendanceSum/Student.studentCount` 
+0

당신의 대답은 위의 데이비드 젠킨스와 거의 동일하지만 다른 변수에 대해서도 똑같은 오류를냅니다. 평균 출석률 : 0.0 ....? – MissComputing

+0

@MissComputing 출력은 다음과 같습니다. –

+0

@MissComputing 평균 출석률 : 8.666666666666666 –

1

TOTAL 출석을 추적하지 않아 작동하지 않습니다. Student 클래스 객체가 생성 될 때마다 누적 된 출석 값이 아닌 새 출석 값을 사용합니다.

Student.attendanceAverage=attendance/Student.studentCount 

테스트되지 않은,하지만 작동합니다 : 문제 라인은

class Student: 
    studentCount=0 
    attendanceAverage=0 
    totalAttendance = 0 

def __init__(self, name, form,special_interest,attendance, merits): 
    self.name=name 
    self.form=form 
    self.special_interest=special_interest 
    self.attendance=attendance 
    self.merits=merits 
    Student.totalAttendance += attendance 

    Student.studentCount+=1 
    Student.attendanceAverage=Student.totalAttendance/Student.studentCount 
+0

솔루션 출력 결과 : 평균 출석률 : 0.0. 이견있는 사람? – MissComputing

+0

완벽하게 나를 찾을 수 –

1

다른 답변을 지적,하지만 당신은 이것에 대한 클래스가 필요 특별한 이유가있다 :

이 같은 합 변수가 들어갈 수? Pandas와 같은 라이브러리를 사용하여 데이터 조작을 수행하는 것이 더 유용 할 수 있습니다.

import pandas as pd 

students = pd.DataFrame([['Student1','9F','Guitar',10,200], 
         ['Student2','9R','Chess ',7,488], 
         ['Student3','9T','Dance ',9,770]], 
         columns=["name", 
           "form", 
           "special_interest", 
           "attendance", 
           "merits"]) 

print("All students") 
print(students) 
print("") 
print("Student3 Attendance: ", students[students['name'] == "Student3"]['attendance'].values[0]) 
print("Average attendance", students['attendance'].mean()) 
print("Total Students", len(students)) 

출력 : 클래스를 사용하여 작업에 대한

All students 
     name form special_interest attendance merits 
0 Student1 9F   Guitar   10  200 
1 Student2 9R   Chess   7  488 
2 Student3 9T   Dance   9  770 

Student3 Attendance: 9 
Average attendance 8.666666666666666 
Total Students 3 
+0

교수/학습 목적을위한 수업 - 감사합니다. 그러나 해결책/대답은 기존 구조와 코드 (수업)를 활용해야합니다. – MissComputing

+0

아무 문제 없습니다 - 다른 답변이 도움이 될 것입니다. –

1

하나! 나는 이것이 처음에는 이해하기 어려울 수 있음을 안다.

문제는 클래스 내에서 변수가 전역 적으로 (즉 코드의 모든 부분에서) 변경된다고 가정 할 때 문제가되는 것입니다. 에 studentCount을 입력하면 주소가 변경 될 때마다 변경됩니다.마지막 학생의 출석은 9 명이므로 StudentCount이 9로 설정됩니다 (초기 값 0에 9를 더함).

내 솔루션은 목록에있는 물건/학생을 추적하고 수업 외 개별 출석자를 언급하거나 개별 수업에 배정하는 것입니다.

class Student: 

    def __init__(self, name, form,special_interest,attendance, merits): 
     self.name=name 
     self.form=form 
     self.special_interest=special_interest 
     self.attendance=attendance 
     self.merits=merits 

students = [] # create an empty list that will contain all your students as objects of your class 
student1=Student("Student1","9F","Guitar",10,200) 
students.append(student1) # add your instances/objects to the list 
student2=Student("Student2","9R","Chess",7,488) 
students.append(student2) 
student3=Student("Student3","9T","Dance",9,770) 
students.append(student3) 

avg = float(sum(student.attendance for student in students))/len(students) # sum up the attendance of all students and divide it by their number 

편집 : 내가 파이썬 2.7에서 작동하기 때문에 나는 떠 sum(student.attendance for student in students)을 변환합니다. 정수 값을 유지하면 정수 나누기가 수행됩니다. 파이썬 3.x에서 코딩하면 dtype 변환을 할 수 있습니다.

+0

그냥 대답을 분석 ..... 당신은 솔루션 (클래스 내부)이 간단합니다 (물론 그것은 오류가 발생) SUGGEST 것 처음 2 답변에 대한 의견을 말할 수있다. 내가 묘사 한 방식으로 불가능하다고 말하고 대답 1과 2는 – MissComputing

+0

을 가리키는 것처럼 보입니다 답변으로, 나는 David @ Jenkins가 쓴 것을 언급합니다 : "총 출석을 추적하지 않기 때문에 작동하지 않습니다. Student 클래스 객체가 생성 될 때마다 누적 된 출석 값이 아닌 새로운 출석 값을 사용합니다. " 나는 불가능하다고 말하지 않겠지 만, 귀를 긁을 때 발을 사용하는 느낌이들 것입니다. 변수를 앞뒤로 전달하는 것은 의미가 없습니다. – offeltoffel

+0

이것은 유용합니다 - 감사합니다. 변수를 앞뒤로 전달하지 않고 클래스를 사용할 때 어떤 일이 발생합니까? 감사합니다 – MissComputing