#!/usr/bin/env python3 # Copyright 2014 Brett Slatkin, Pearson Education Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Preamble to mimick book environment import logging from pprint import pprint from sys import stdout as STDOUT # Example 1 class SimpleGradebook(object): def __init__(self): self._grades = {} def add_student(self, name): self._grades[name] = [] def report_grade(self, name, score): self._grades[name].append(score) def average_grade(self, name): grades = self._grades[name] return sum(grades) / len(grades) # Example 2 book = SimpleGradebook() book.add_student('Isaac Newton') book.report_grade('Isaac Newton', 90) book.report_grade('Isaac Newton', 95) book.report_grade('Isaac Newton', 85) print(book.average_grade('Isaac Newton')) # Example 3 class BySubjectGradebook(object): def __init__(self): self._grades = {} def add_student(self, name): self._grades[name] = {} # Example 4 def report_grade(self, name, subject, grade): by_subject = self._grades[name] grade_list = by_subject.setdefault(subject, []) grade_list.append(grade) def average_grade(self, name): by_subject = self._grades[name] total, count = 0, 0 for grades in by_subject.values(): total += sum(grades) count += len(grades) return total / count # Example 5 book = BySubjectGradebook() book.add_student('Albert Einstein') book.report_grade('Albert Einstein', 'Math', 75) book.report_grade('Albert Einstein', 'Math', 65) book.report_grade('Albert Einstein', 'Gym', 90) book.report_grade('Albert Einstein', 'Gym', 95) print(book.average_grade('Albert Einstein')) # Example 6 class WeightedGradebook(object): def __init__(self): self._grades = {} def add_student(self, name): self._grades[name] = {} def report_grade(self, name, subject, score, weight): by_subject = self._grades[name] grade_list = by_subject.setdefault(subject, []) grade_list.append((score, weight)) # Example 7 def average_grade(self, name): by_subject = self._grades[name] score_sum, score_count = 0, 0 for subject, scores in by_subject.items(): subject_avg, total_weight = 0, 0 for score, weight in scores: subject_avg += score * weight total_weight += weight score_sum += subject_avg / total_weight score_count += 1 return score_sum / score_count # Example 8 book = WeightedGradebook() book.add_student('Albert Einstein') book.report_grade('Albert Einstein', 'Math', 80, 0.10) book.report_grade('Albert Einstein', 'Math', 80, 0.10) book.report_grade('Albert Einstein', 'Math', 70, 0.80) book.report_grade('Albert Einstein', 'Gym', 100, 0.40) book.report_grade('Albert Einstein', 'Gym', 85, 0.60) print(book.average_grade('Albert Einstein')) # Example 9 grades = [] grades.append((95, 0.45)) grades.append((85, 0.55)) total = sum(score * weight for score, weight in grades) total_weight = sum(weight for _, weight in grades) average_grade = total / total_weight print(average_grade) # Example 10 grades = [] grades.append((95, 0.45, 'Great job')) grades.append((85, 0.55, 'Better next time')) total = sum(score * weight for score, weight, _ in grades) total_weight = sum(weight for _, weight, _ in grades) average_grade = total / total_weight print(average_grade) # Example 11 import collections Grade = collections.namedtuple('Grade', ('score', 'weight')) # Example 12 class Subject(object): def __init__(self): self._grades = [] def report_grade(self, score, weight): self._grades.append(Grade(score, weight)) def average_grade(self): total, total_weight = 0, 0 for grade in self._grades: total += grade.score * grade.weight total_weight += grade.weight return total / total_weight # Example 13 class Student(object): def __init__(self): self._subjects = {} def subject(self, name): if name not in self._subjects: self._subjects[name] = Subject() return self._subjects[name] def average_grade(self): total, count = 0, 0 for subject in self._subjects.values(): total += subject.average_grade() count += 1 return total / count # Example 14 class Gradebook(object): def __init__(self): self._students = {} def student(self, name): if name not in self._students: self._students[name] = Student() return self._students[name] # Example 15 book = Gradebook() albert = book.student('Albert Einstein') math = albert.subject('Math') math.report_grade(80, 0.10) math.report_grade(80, 0.10) math.report_grade(70, 0.80) gym = albert.subject('Gym') gym.report_grade(100, 0.40) gym.report_grade(85, 0.60) print(albert.average_grade())