-
正常內置的排序函數:x<y返回-1
因此,要實現倒序排列的話,得定義一個函數使得:x>y返回-1
查看全部 -
reduce()傳入的函數 f 必須接收兩個參數,reduce()對list的每個元素反復調用函數f
查看全部 -
任務
請修改?Student?的?__cmp__?方法,讓它按照分數從高到底排序,分數相同的按名字排序。
?不會了怎么辦
需要先比較?score,在?score?相等的情況下,再比較?name。
參考代碼:
class?Student(object): ????def?__init__(self,?name,?score): ????????self.name?=?name ????????self.score?=?score ????def?__str__(self): ????????return?'(%s:?%s)'?%?(self.name,?self.score) ????__repr__?=?__str__ ????def?__cmp__(self,?s): ????????if?self.score?==?s.score: ????????????return?cmp(self.name,?s.name) ????????return?-cmp(self.score,?s.score) L?=?[Student('Tim',?99),?Student('Bob',?88),?Student('Alice',?99)] print?sorted(L)
查看全部 -
任務
請給Student?類定義__str__和__repr__方法,使得能打印出<Student: name, gender, score>:
class?Student(Person): ????def?__init__(self,?name,?gender,?score): ????????super(Student,?self).__init__(name,?gender) ????????self.score?=?score
?不會了怎么辦
只要為Students?類加上__str__()和__repr__()方法即可。
參考代碼:
class?Person(object): ????def?__init__(self,?name,?gender): ????????self.name?=?name ????????self.gender?=?gender class?Student(Person): ????def?__init__(self,?name,?gender,?score): ????????super(Student,?self).__init__(name,?gender) ????????self.score?=?score ????def?__str__(self): ????????return?'(Student:?%s,?%s,?%s)'?%?(self.name,?self.gender,?self.score) ????__repr__?=?__str__ s?=?Student('Bob',?'male',?88) print?s
查看全部 -
任務
對于Person類的定義:
class?Person(object): ????def?__init__(self,?name,?gender): ????????self.name?=?name ????????self.gender?=?gender
希望除了 name和gender 外,可以提供任意額外的關鍵字參數,并綁定到實例,請修改 Person 的 __init__()定 義,完成該功能。
?不會了怎么辦
傳入**kw?即可傳入任意數量的參數,并通過?setattr()?綁定屬性。
參考代碼:
class?Person(object): ????def?__init__(self,?name,?gender,?**kw): ????????self.name?=?name ????????self.gender?=?gender ????????for?k,?v?in?kw.iteritems(): ????????????setattr(self,?k,?v) p?=?Person('Bob',?'Male',?age=18,?course='Python') print?p.age print?p.course
查看全部 -
任務
+-Person
? +- Student
? +- Teacher是一類繼承樹;
+- SkillMixin
? ?+- BasketballMixin
? ?+- FootballMixin是一類繼承樹。
通過多重繼承,請定義“會打籃球的學生”和“會踢足球的老師”。
?不會了怎么辦
多重繼承需要從兩個或更多的類派生。
參考代碼:
class?Person(object): ????pass class?Student(Person): ????pass class?Teacher(Person): ????pass class?SkillMixin(object): ????pass class?BasketballMixin(SkillMixin): ????def?skill(self): ????????return?'basketball' class?FootballMixin(SkillMixin): ????def?skill(self): ????????return?'football' class?BStudent(Student,?BasketballMixin): ????pass class?FTeacher(Teacher,?FootballMixin): ????pass s?=?BStudent() print?s.skill() t?=?FTeacher() print?t.skill()
查看全部 -
任務
Python提供了open()函數來打開一個磁盤文件,并返回?File?對象。File對象有一個read()方法可以讀取文件內容:
例如,從文件讀取內容并解析為JSON結果:
import?json f?=?open('/path/to/file.json',?'r') print?json.load(f)
由于Python的動態特性,json.load()并不一定要從一個File對象讀取內容。任何對象,只要有read()方法,就稱為File-like Object,都可以傳給json.load()。
請嘗試編寫一個File-like Object,把一個字符串?r'["Tim", "Bob", "Alice"]'包裝成?File-like Object?并由?json.load()?解析。
?不會了怎么辦
只要為Students類加上?read()方法,就變成了一個File-like Object。
參考代碼:
import?json class?Students(object): ????def?read(self): ????????return?r'["Tim",?"Bob",?"Alice"]' s?=?Students() print?json.load(s)
查看全部 -
任務
請根據繼承鏈的類型轉換,依次思考?t?是否是?Person,Student,Teacher,object?類型,并使用isinstance()判斷來驗證您的答案。
?不會了怎么辦
注意t?是Teacher的實例,繼承鏈是:
object <- Person <- Teacher
參考代碼:
class?Person(object): ????def?__init__(self,?name,?gender): ????????self.name?=?name ????????self.gender?=?gender class?Student(Person): ????def?__init__(self,?name,?gender,?score): ????????super(Student,?self).__init__(name,?gender) ????????self.score?=?score class?Teacher(Person): ????def?__init__(self,?name,?gender,?course): ????????super(Teacher,?self).__init__(name,?gender) ????????self.course?=?course t?=?Teacher('Alice',?'Female',?'English') print?isinstance(t,?Person) print?isinstance(t,?Student) print?isinstance(t,?Teacher) print?isinstance(t,?object)
查看全部 -
任務
請參考?Student?類,編寫一個?Teacher類,也繼承自?Person。
?不會了怎么辦
要正確調用?super()?的__init__方法。
參考代碼:
class?Person(object): ????def?__init__(self,?name,?gender): ????????self.name?=?name ????????self.gender?=?gender class?Teacher(Person): ????def?__init__(self,?name,?gender,?course): ????????super(Teacher,?self).__init__(name,?gender) ????????self.course?=?course t?=?Teacher('Alice',?'Female',?'English') print?t.name print?t.course
查看全部 -
任務
如果將類屬性?count?改為私有屬性__count,則外部無法讀取__score,但可以通過一個類方法獲取,請編寫類方法獲得__count值。
?
?不會了怎么辦
注意類方法需要添加?@classmethod
參考代碼:
class?Person(object): ????__count?=?0????@classmethod ????def?how_many(cls): ????????return?cls.__count ????def?__init__(self,?name): ????????self.name?=?name ????????Person.__count?=?Person.__count?+?1 print?Person.how_many() p1?=?Person('Bob') print?Person.how_many()
查看全部 -
高階函數定義:變量名可以指向函數,因此函數可以通過一個變量傳給另一個函數,因此這個函數就可以看作高階函數。
查看全部 -
任務
由于屬性可以是普通的值對象,如?str,int?等,也可以是方法,還可以是函數,大家看看下面代碼的運行結果,請想一想?p1.get_grade?為什么是函數而不是方法:
class?Person(object): ????def?__init__(self,?name,?score): ????????self.name?=?name ????????self.score?=?score ????????self.get_grade?=?lambda:?'A' p1?=?Person('Bob',?90) print?p1.get_grade print?p1.get_grade()
?不會了怎么辦
直接把?lambda?函數賦值給?self.get_grade?和綁定方法有所不同,函數調用不需要傳入?self,但是方法調用需要傳入?self。
查看全部 -
任務
請給?Person?類增加一個私有屬性?__score,表示分數,再增加一個實例方法?get_grade(),能根據?__score?的值分別返回?A-優秀, B-及格, C-不及格三檔。
?
?不會了怎么辦
注意get_grade()是實例方法,第一個參數為self。
參考代碼:
class?Person(object): ????def?__init__(self,?name,?score): ????????self.__name?=?name ????????self.__score?=?score ????def?get_grade(self): ????????if?self.__score?>=?80: ????????????return?'A' ????????if?self.__score?>=?60: ????????????return?'B' ????????return?'C' p1?=?Person('Bob',?90) p2?=?Person('Alice',?65) p3?=?Person('Tim',?48) print?p1.get_grade() print?p2.get_grade() print?p3.get_grade()
查看全部 -
任務
請把上節的?Person?類屬性?count?改為?__count,再試試能否從實例和類訪問該屬性。
?
?不會了怎么辦
把count改為私有__count,這樣實例變量在外部無法修改__count
參考代碼:
class?Person(object): ????__count?=?0 ????def?__init__(self,?name): ????????Person.__count?=?Person.__count?+?1 ????????self.name?=?name ????????print?Person.__count p1?=?Person('Bob') p2?=?Person('Alice') print?Person.__count
查看全部 -
任務
請給?Person?類添加一個類屬性?count,每創建一個實例,count?屬性就加?1,這樣就可以統計出一共創建了多少個?Person?的實例。
?不會了怎么辦
由于創建實例必定會調用__init__()方法,所以在這里修改類屬性?count?很合適。
參考代碼:
class?Person(object): ????count?=?0 ????def?__init__(self,?name): ????????Person.count?=?Person.count?+?1 ????????self.name?=?name p1?=?Person('Bob') print?Person.count#?=>?1p2?=?Person('Alice') print?Person.count#?=>?2p3?=?Person('Tim') print?Person.count#?=>?3
查看全部
舉報