为了账号安全,请及时绑定邮箱和手机立即绑定

python进阶

廖雪峰 移动开发工程师
难度中级
时长 3小时33分
学习人数
综合评分9.20
575人评价 查看评价
9.6 内容实用
9.0 简洁易懂
9.0 逻辑清晰
  • 正常内置的排序函数: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)


    查看全部
    0 采集 收起 来源:python中 __cmp__

    2020-07-24

  • 任务

    请给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)


    查看全部
    0 采集 收起 来源:python中多态

    2020-07-24

  • 任务

    请根据继承链的类型转换,依次思考 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


    查看全部

举报

0/150
提交
取消
课程须知
本课程是Python入门的后续课程 1、掌握Python编程的基础知识 2、掌握Python函数的编写 3、对面向对象编程有所了解更佳
老师告诉你能学到什么?
1、什么是函数式编程 2、Python的函数式编程特点 3、Python的模块 4、Python面向对象编程 5、Python强大的定制类

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!