为了账号安全,请及时绑定邮箱和手机立即绑定
慕课网数字资源数据库体验端
python进阶_学习笔记_慕课网
为了账号安全,请及时绑定邮箱和手机立即绑定

python进阶

廖雪峰 移动开发工程师
难度中级
时长 3小时33分
  • filter()函数是 Python 内置的另一个有用的高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。

    注意: s.strip(rm) 删除 s 字符串中开头、结尾处的 rm 序列的字符。

    当rm为空时,默认删除空白符(包括'\n', '\r', '\t', ' '),如下:

    a = '     123'
    a.strip()

    结果: '123'


    查看全部
  • reduce()函数也是Python内置的一个高阶函数。reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。reduce()还可以接收第3个可选参数,作为计算的初始值。如果把初始值设为100

    查看全部
  • map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。

    map()函数不改变原有的 list,而是返回一个新的 list。

    利用map()函数,可以把一个 list 转换为另一个 list,只需要传入转换函数。


    查看全部
  • 包目录下必须要有__init__.py文件。
    查看全部
  • 如果要把一个类的实例变成 str,就需要实现特殊方法__str__():

    class Person(object):
        def __init__(self, name, gender):
            self.name = name
            self.gender = gender
        def __str__(self):
            return '(Person: %s, %s)' % (self.name, self.gender)

    现在,在交互式命令行下用 print 试试:

    >>> p = Person('Bob', 'male')
    >>> print p
    (Person: Bob, male)

    但是,如果直接敲变量 p

    >>> p
    <main.Person object at 0x10c941890>

    似乎__str__() 不会被调用。

    因为 Python 定义了__str__()__repr__()两种方法,__str__()用于显示给用户,而__repr__()用于显示给开发人员。

    有一个偷懒的定义__repr__的方法:

    class Person(object):
        def __init__(self, name, gender):
            self.name = name
            self.gender = gender
        def __str__(self):
            return '(Person: %s, %s)' % (self.name, self.gender)
        __repr__ = __str__


    查看全部
  • def calc_pord(lst):
        def lazy_pord():
            def (x,y):
                return x*y
            rerurn reduce(f,lst,1)
        return lazy_pord()
    print calc_pord([1,2,3,4])
    
    这样写也可以,直接在返回函数时就调用,print时
    就不用再调用了


    查看全部
  • 如何去掉`__xxx__`这类的特殊属性,只保留我们自己定义的属性?回顾一下filter()函数的用法。

    dir()返回的属性是字符串列表,如果已知一个属性名称,要获取或者设置对象的属性,就需要用 getattr() setattr( )函数了:

    >>> getattr(s, 'name')  # 获取name属性'Bob'
    
    >>> setattr(s, 'name', 'Adam')  # 设置新的name属性>>> s.name
    'Adam'
    
    >>> getattr(s, 'age')  # 获取age属性,但是属性不存在,报错:Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'Student' object has no attribute 'age'
    
    >>> getattr(s, 'age', 20)  # 获取age属性,如果属性不存在,就返回默认值20:20

    filter()是过滤掉不符合要求的

    查看全部
  • lambda表示匿名函数,匿名函数只能有一个表达式,不能return。
    查看全部
  • 除了从一个父类继承外,Python允许从多个父类继承,称为多重继承。

    多重继承的继承链就不是一棵树了,它像这样:

    class A(object):
        def __init__(self, a):
            print 'init A...'
            self.a = a
    
    class B(A):
        def __init__(self, a):
            super(B, self).__init__(a)
            print 'init B...'
    
    class C(A):
        def __init__(self, a):
            super(C, self).__init__(a)
            print 'init C...'
    
    class D(B, C):
        def __init__(self, a):
            super(D, self).__init__(a)
            print 'init D...'

    看下图:

    54daf037000142d207580552.jpg

    像这样,同时继承自 BC,也就是 D 拥有了 A、B、C 的全部功能。多重继承通过 super()调用__init__()方法时,A 虽然被继承了两次,但__init__()只调用一次

    多重继承的目的是从两种继承树中分别选择并继承出子类,以便组合功能使用。

    查看全部
  • r 为前缀表示:(非转义)原始字符串,忽略\等特殊字符的效果

    以u或U开头的字符串表示unicode字符串

    类具有继承关系,并且子类类型可以向上转型看做父类类型,如果我们从 Person 派生出 StudentTeacher ,并都写了一个 whoAmI() 方法:

    class Person(object):
        def __init__(self, name, gender):
            self.name = name
            self.gender = gender
        def whoAmI(self):
            return 'I am a Person, my name is %s' % self.name
    
    class Student(Person):
        def __init__(self, name, gender, score):
            super(Student, self).__init__(name, gender)
            self.score = score
        def whoAmI(self):
            return 'I am a Student, my name is %s' % self.name
    
    class Teacher(Person):
        def __init__(self, name, gender, course):
            super(Teacher, self).__init__(name, gender)
            self.course = course
        def whoAmI(self):
            return 'I am a Teacher, my name is %s' % self.name

    在一个函数中,如果我们接收一个变量 x,则无论该 x Person、Student还是 Teacher,都可以正确打印出结果:

    def who_am_i(x):
        print x.whoAmI()
    
    p = Person('Tim', 'Male')
    s = Student('Bob', 'Male', 88)
    t = Teacher('Alice', 'Female', 'English')
    
    who_am_i(p)
    who_am_i(s)
    who_am_i(t)

    运行结果:

    I am a Person, my name is Tim
    I am a Student, my name is Bob
    I am a Teacher, my name is Alice

    这种行为称为多态。也就是说,方法调用将作用在 x 的实际类型上。sStudent类型,它实际上拥有自己的 whoAmI()方法以及从 Person继承的 whoAmI方法,但调用 s.whoAmI()总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止。

    由于Python是动态语言,所以,传递给函数 who_am_i(x)的参数 x 不一定是 Person 或 Person 的子类型。任何数据类型的实例都可以,只要它有一个whoAmI()的方法即可:

    class Book(object):
        def whoAmI(self):
            return 'I am a book'

    这是动态语言和静态语言(例如Java)最大的差别之一。动态语言调用实例方法,不检查类型,只要方法存在,参数正确,就可以调用。

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

    2018-11-09

  • 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

    p = Person('Tim', 'Male')
    s = Student('Bob', 'Male', 88)
    t = Teacher('Alice', 'Female', 'English')

    >>> isinstance(p, Person)
    True    # p是Person类型
    >>> isinstance(p, Student)
    False   # p不是Student类型
    >>> isinstance(p, Teacher)
    False   # p不是Teacher类型

    这说明在继承链上,一个父类的实例不能是子类类型,因为子类比父类多了一些属性和方法。

    >>> isinstance(s, Person)
    True    # s是Person类型
    >>> isinstance(s, Student)
    True    # s是Student类型
    >>> isinstance(s, Teacher)
    False   # s不是Teacher类型

    s 是Student类型,不是Teacher类型,这很容易理解。但是,s 也是Person类型,因为Student继承自Person,虽然它比Person多了一些属性和方法,但是,把 s 看成Person的实例也是可以的。

    这说明在一条继承链上,一个实例可以看成它本身的类型,也可以看成它父类的类型。

    子类继承了父类的一些东西,子类包含更大,所以只要是子类的 ,就一定也是父类的,,s是子类student,由于student包含person的属性,所以s也是person

    用isinstance(s,Student)

    isinstance(s,Person)  √

    查看全部
  • class Person(object):

          def __init__(self,name,gender):

                  self.name=name

                 self.gender=gender

    class  Student(Person):

            def  __init__(self,name,gender,score,school):

                   super(Student,self).__init__(name,gender)

                   self.score=score

                   self.school=school


    查看全部
  • 一定要用 super(Student, self).__init__(name, gender) 去初始化父类,否则,继承自 PersonStudent 将没有 namegender

    查看全部
  • 和属性类似,方法也分实例方法和类方法

    通过标记一个 @classmethod,该方法将绑定到 Person 类上,而非类的实例。类方法的第一个参数将传入类本身,通常将参数名命名为 cls,上面的 cls.count 实际上相当于 Person.count

    因为是在类上调用,而非实例上调用,因此类方法无法获得任何实例变量,只能获得类的引用。

    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()

    查看全部
  • 因为方法也是一个属性,所以,它也可以动态地添加到实例上,只是需要用 types.MethodType() 把一个函数变为一个方法

    p1.get_grade = types.MethodType(fn_get_grade, p1, Person)

    函数调用不需要传入实例self,方法调用需要传入self

    查看全部

举报

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

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