def gradereport(course)"""assumes course is of type grades""report 'for in course getstudents()tot numgrades for in course getgrades( )tot + numgrades + tryaverage tot/numgrades report report '\ 'str( '\' mean grade is str(averageexcept zerodivisionerrorreport report '\ 'str(shas no gradesreturn report ug ug('jane doe' ug ug('john doe' ug ug('david henry' grad('billy buckner' grad('bucky dent'sixhundred grades(sixhundred addstudent(ug sixhundred addstudent(ug sixhundred addstudent( sixhundred addstudent( for in sixhundred getstudents()sixhundred addgrade( sixhundred addgrade( sixhundred addgrade( sixhundred addstudent(ug print gradereport(sixhundredfigure generating grade report when runthe code in the figure prints jane doe' mean grade is john doe' mean grade is david henry has no grades billy buckner' mean grade is bucky dent' mean grade is there are two important concepts at the heart of object-oriented programming the first is the idea of encapsulation by this we mean the bundling together of data attributes and the methods for operating on them for exampleif we write rafael mitperson(we can use dot notation to access attributes such as rafael' age and identification number the second important concept is information hiding this is one of the keys to modularity if those parts of the program that use class ( the clients of the classrely only on the specifications of the methods in the classa programmer implementing the class is free to change the implementation of the class ( to