-
正常内置的排序函数: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
查看全部
举报