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

python进阶

廖雪峰 移动开发工程师
难度中级
时长 3小时33分
学习人数
综合评分9.20
575人评价 查看评价
9.6 内容实用
9.0 简洁易懂
9.0 逻辑清晰
  • Rational类虽然可以做加法,但无法做减法、乘方和除法,请继续完善Rational类,实现四则运算。

    提示:
    减法运算:__sub__
    乘法运算:__mul__
    除法运算:__div__

    def gcd(a, b):
        if b == 0:
            return a
        return gcd(b, a % b)
    
    class Rational(object):
        def __init__(self, p, q):
            self.p = p
            self.q = q
        def __add__(self, r):
            return Rational(self.p * r.q + self.q * r.p, self.q * r.q)
        def __sub__(self, r):
            return Rational(self.p * r.q - self.q * r.p, self.q * r.q)
        def __mul__(self, r):
            return Rational(self.p * r.p, self.q * r.q)
        def __div__(self, r):
            return Rational(self.p * r.q, self.q * r.p)
        def __str__(self):
            g = gcd(self.p, self.q)
            return '%s/%s' % (self.p / g, self.q / g)
        __repr__ = __str__
    
    r1 = Rational(1, 2)
    r2 = Rational(1, 4)
    print r1 + r2
    print r1 - r2
    print r1 * r2
    print r1 / r2


    查看全部
  • http://img1.sycdn.imooc.com//5ea5180b0001dee306300339.jpg匿名函数有个限制,就是只能有一个表达式,不写return,返回值就是该表达式的结果。


    map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])
    myabs = lambda x: -x if x < 0 else x


    查看全部
  • 如果一个类表现得像一个list,要获取有多少个元素,就得用 len() 函数,要让 len() 函数工作正常,类必须提供一个特殊方法__len__(),它返回元素的个数

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

    2020-04-26

  • 对 int、str 等内置数据类型排序时,Python的 sorted() 按照默认的比较函数 cmp 排序

    对一组类的实例排序时,就必须提供自己的特殊方法 __cmp__(),若list包含不止一个类,则__cmp__可能会报错

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

    2020-04-26

  • 如果要把一个类的实例变成 str,就需要实现特殊方法__str__()

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

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

    __repr__ = __str__

    查看全部
  • 1. 特殊方法

    任何类型的实例都有一个特殊方法: __str__()

    用于print的_str_; 用于len的_len_; 用于cmp的_cmp_ ...

    特殊方法定义在class中

    不需直接调用,python某些函数或操作符会调用对应的特殊方法


    2. 正确实现:

    只需编写用到的特殊方法

    有关联性的特殊方法都要实现

    查看全部
  • 斐波那契数列是由 0, 1, 1, 2, 3, 5, 8...构成。

    请编写一个Fib类,Fib(10)表示数列的前10个元素,print Fib(10) 可以打印出数列的前 10 个元素,len(Fib(10))可以正确返回数列的个数10。

    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)


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

    2020-04-25

  • 对于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


    查看全部
  • 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-04-25

  • 请定义Person类的__init__方法,除了接受 name、gender 和 birth 外,还可接受任意关键字参数,并把他们都作为属性赋值给实例。

    要定义关键字参数,使用 **kw

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

    class Person(object):
        def __init__(self, name, gender, birth, **kw):
            self.name = name
            self.gender = gender
            self.birth = birth
            for k, v in kw.iteritems():
                setattr(self, k, v)
    xiaoming = Person('Xiao Ming', 'Male', '1990-1-1', job='Student')
    print xiaoming.name
    print xiaoming.job


    查看全部
  • 请创建包含两个 Person 类的实例的 list,并给两个实例的 name 赋值,然后按照 name 进行排序。

    class Person(object):
        pass
    
    p1 = Person()
    p1.name = 'Bart'
    
    p2 = Person()
    p2.name = 'Adam'
    
    p3 = Person()
    p3.name = 'Lisa'
    
    L1 = [p1, p2, p3]
    L2 = sorted(L1, key = lambda x: x.name)
    
    print L2[0].name
    print L2[1].name
    print L2[2].name


    查看全部
  • 返回闭包不能引用循环变量,请改写count()函数,让它正确返回能计算1x1、2x2、3x3的函数。

    def count():
        fs = []
        for i in range(1, 4):
            def f(j):
                def g():
                    return j*j
                return g
            r = f(i)
            fs.append(r)
        return fs
    f1, f2, f3 = count()
    print f1(), f2(), f3()


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

    2020-04-25

  • 请编写一个函数calc_prod(lst),它接收一个list,返回一个函数,返回函数可以计算参数的乘积。

    def calc_prod(lst):
        def lazy_prod():
            def f(x, y):
                return x * y
            return reduce(f, lst, 1)
        return lazy_prod
    f = calc_prod([1, 2, 3, 4])
    print f()


    查看全部
  • 首先可以用 type() 函数获取变量的类型,它返回一个 Type 对象

    对于实例变量,dir()返回所有实例属性,包括`__class__`这类有特殊意义的属性

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

    查看全部
  • eg. 

    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...'


    查看全部

举报

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

微信扫码,参与3人拼团

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

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