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

python进阶

廖雪峰 移动开发工程师
难度中级
时长 3小时33分
学习人数
综合评分9.20
575人评价 查看评价
9.6 内容实用
9.0 简洁易懂
9.0 逻辑清晰
  • 进阶学习内容

    https://img1.sycdn.imooc.com//5d2d7ecc0001d47107960396.jpg

    查看全部
    0 采集 收起 来源:课程介绍

    2019-07-16

  • 这种内层函数引用了外层函数的变量(参数也算变量),然后返回内层函数的情况,称为闭包(Closure)。

    闭包的特点是返回的函数还引用了外层函数的局部变量,所以,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变。举例如下:

    # 希望一次返回3个函数,分别计算1x1,2x2,3x3:def count():
        fs = []
        for i in range(1, 4):
            def f():
                 return i*i
            fs.append(f)
        return fs
    
    f1, f2, f3 = count()

    你可能认为调用f1(),f2()和f3()结果应该是1,4,9,但实际结果全部都是 9(请自己动手验证)。

    原因就是当count()函数返回了3个函数时,这3个函数所引用的变量 i 的值已经变成了3。由于f1、f2、f3并没有被调用,所以,此时他们并未计算 i*i,当 f1 被调用时:

    >>> f1()
    9     # 因为f1现在才计算i*i,但现在i的值已经变为3

    因此,返回函数不要引用任何循环变量,或者后续会发生变化的变量。


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

    2019-07-16

  • 关键字lambda 表示匿名函数,冒号前面的 x 表示函数参数。

    查看全部
    • 传入**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


    查看全部
  • 有点意思呀

    查看全部
  • 中闭包。内部定义的函数和外部定义的函数一样,但是内部函数不能被外部访问。

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

    2019-07-15

  • 继承
    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

    • 一定要用 super(Student, self).__init__(name, gender) 去初始化父类,否则,继承自 Person 的 Student 将没有 name 和 gender。

    • 函数super(Student, self)将返回当前类继承的父类,即 Person ,然后调用__init__()方法
      注意self参数已在super()中传入,在__init__()中将隐式传递,不需要写出(也不能写)。

    查看全部
  • 由于 f 可以被调用,所以,f 被称为可调用对象。

    所有的函数都是可调用对象。

    一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法__call__()

    我们把 Person 类变成一个可调用对象:

    class Person(object):
        def __init__(self, name, gender):
            self.name = name
            self.gender = gender
    
        def __call__(self, friend):
            print 'My name is %s...' % self.name
            print 'My friend is %s...' % friend

    现在可以对 Person 实例直接调用:

    >>> p = Person('Bob', 'male')
    >>> p('Tim')
    My name is Bob...
    My friend is Tim...

    单看 p('Tim') 你无法确定 p 是一个函数还是一个类实例,所以,在Python中,函数也是对象,对象和函数的区别并不显著。

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

    2019-07-15

  • 和属性类似,方法也分实例方法和类方法
    通过标记一个@classmethod, 将方法绑定到类上,类方法的第一个参数将传入类本身,通常将参数名命名为 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()
    
    因为是在类上调用,而非实例上调用,因此类方法无法获得任何实例变量,只能获得类的引用。


    查看全部
  • 现在可以对 Person 实例直接调用:

    >>> p = Person('Bob', 'male')
    >>> p('Tim')
    My name is Bob...
    My friend is Tim...

    单看 p('Tim') 你无法确定 p 是一个函数还是一个类实例,所以,在Python中,函数也是对象,对象和函数的区别并不显著。

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

    2019-07-15

  •  class Person(object):
        __slots__ = ('name', 'gender')
        def __init__(self, name, gender):
            self.name = name
            self.gender = gender

    class Student(Person):
        __slots__ = ('score',)
        def __init__(self, name, gender, score):
            super(Student, self).__init__(name, gender)
            self.score = score

    s = Student('Bob', 'male', 59)
    s.name = 'Tim'
    s.score = 99
    print s.score

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

    2019-07-15

  •  

    从Python3开始,双下划线开始的属性表示私有属性,禁止类外访问,私有属性在Python2里面是没有的。

    你的代码里,没有score这个属性,所以返回self.score会报错,只有__score这个属性,所以设置,返回都要使用__score,

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

    2019-07-15

  • __slots__的目的是限制当前类所能拥有的属性,如果不需要添加任意动态的属性,使用__slots__也能节省内存。

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

    2019-07-15

  • sorted()函数接收一个比较函数来实现自定义排序。比较函数:传入两个待比较元素x,y   如果x排在y面前,返回-1;x 排在 y 的后面,返回 1;如果 x 和 y 相等,返回 0。

    Ex:

    def dxsc(x, y):
        if x > y:
            return -1
        if x < y:
            return 1
        return 0
    L=[36,5,,12,9,21]
    print sorted(L,dxsc)  //输出结果为36,21,12,9,5
    //切记:sorted()函数有两个参数,第一个参数是定义的变量,第二个参数是定义的函数名。
    查看全部
  • filter()函数接收两个参数,一个是函数f一个是list   函数f的功能是:对每个元素判断,返回True或者False  。  filter()函数会根据判断结果自动丢弃掉不符合条件的元素,然后返回由符合条件组成的新list。

    Ex:'

    def qs(x):

        return x%2==1

    L=[1,4,6,7,9]

    print  filter(qs,L)

    .stipr()函数:删除指定位置的元素   左面第一个开始  不匹配的话直接从最后面的位置再开始匹配  

    Ex:

    s='abc456ert'

    print s.strip('abt')   //结果为c456er

    print s.strip('acr')   //结果为bc456ert

    查看全部

举报

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

微信扫码,参与3人拼团

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

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