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

python进阶

廖雪峰 移动开发工程师
难度中级
时长 3小时33分
学习人数
综合评分9.17
572人评价 查看评价
9.6 内容实用
9.0 简洁易懂
8.9 逻辑清晰
  • 要定义关键字参数,使用 **kw

    除了可以直接使用self.name = 'xxx'设置一个属性外,还可以通过 setattr(self, 'name', 'xxx') 设置属性。

    python中的args和kw:
    *args:表示就是将实参中按照位置传值,多余的值都给args,且以
    元组的方式呈现
    **kw:表示就是形参中按照关键字传值,多余的值都给kw,且以
    字典*的方式呈现

  • 使用 get/set 方法来封装对一个属性的访问在许多面向对象编程的语言中都很常见。

    在函数式编程中我们介绍了装饰器函数,可以用装饰器函数把 get/set 方法“装饰”成属性调用:

    class Student(object):
        def __init__(self, name, score):
            self.name = name
            self.__score = score
        @property
        def score(self):
            return self.__score
        @score.setter
        def score(self, score):
            if score < 0 or score > 100:
                raise ValueError('invalid score')
            self.__score = score

    注意: 第一个score(self)是get方法,用@property装饰,第二个score(self, score)是set方法,用@score.setter装饰,@score.setter是前一个@property装饰后的副产品。

    就可以像使用属性一样设置score了:

    >>> s = Student('Bob', 59)
    >>> s.score = 60
    >>> print s.score
    60
    >>> s.score = 1000
    Traceback (most recent call last):
      ...
    ValueError: invalid score

    说明对 score 赋值实际调用的是 set方法。


  • #取公约数方法,传入有理数a/b,递归函数
    def gcd(a, b):
        if b == 0:
            return a
        return gcd(b, a % b)
  • self.p*r.q + self.q*r.p, self.q*r.q) # Rational有理数相加法
    有理数可以看成是分子与分母都是整数的数,所有两个有理数相加,要把分母变成一样的,再相加分子
  • 需要根据num计算出斐波那契数列的前N个元素。

    class Fib(object):
        def __init__(self, num):
            a, b, L = 0, 1, []
            for n in range(num):
                L.append(a)
                a, b = b, a + b
            self.numbers = L
        def __str__(self):
            return str(self.numbers)
        __repr__ = __str__
        def __len__(self):
            return len(self.numbers)
    f = Fib(10)
    print f
    print len(f)
  • print语句会自动调用__str__() 方法
    __repr__是指在没有调用外部函数时,开发人员也能够读取信息

    print打印会调用__str__,而直接输入变量名则调用__repr__

    偷懒定义__repr__的方法:

     __repr__ = __str__
  • 可接受任意关键字参数,并把他们都作为属性赋值给实例

    class Person(object):

        def __init__(self, name, gender, birth, **kw):

            self.name = name

            self.gender = birth

            self.birth = birth

            for k, v in kw.iteritems(): # key, value  

                setattr(self, k, v) # setattr(self, 'name', 'xxx')设置属性


  • isinstance(s, object) 判断它是否是某种类型的实例

    type() 函数获取变量的类型,返回一个 Type 对象

    dir() 函数获取变量的所有属性

    >>> dir(123)   # 整数也有很多属性...['__abs__', '__add__', '__and__', '__class__', '__cmp__', ..

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

    >>> getattr(s, 'name')  # 获取name属性'Bob'
    >>> setattr(s, 'name', 'Adam')  # 设置新的name属性>>> s.name
    'Adam'
    >>> getattr(s, 'age', 20)  # 获取age属性,如果属性不存在,就返回默认值20
    setattr(self, k, v)
  • def ss(s1):    return s1.lower()print sorted(['bob', 'about', 'Zoo', 'Credit'], key=ss)


    查看代码快照
  • filter()按前定义函数去除list中不符合条件的部分。math.sqrt(x)%1==0

    查看代码快照
  • reduce函数,2个值间操作,第三值为默认值。

    查看代码快照
  • 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() 解析。


  • Python的网络服务器有TCPServer、UDPServer、UnixStreamServer、UnixDatagramServer,而服务器运行模式有 多进程ForkingMixin 和 多线程ThreadingMixin两种。

    要创建多进程模式的 TCPServer:

    class MyTCPServer(TCPServer, ForkingMixin)
        pass

    要创建多线程模式的 UDPServer:

    class MyUDPServer(UDPServer, ThreadingMixin):
        pass


  • 当实例属性和类属性重名时,实例属性优先级高。

  • 实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。当类属性改变时,所有实例访问到的类属性都改变了。

举报

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

微信扫码,参与3人拼团

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

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