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

python进阶

廖雪峰 移动开发工程师
难度中级
时长 3小时33分
学习人数
综合评分9.17
572人评价 查看评价
9.6 内容实用
9.0 简洁易懂
8.9 逻辑清晰
  • def calc_sum(lst):
        def lazy_sum():
            return sum(lst)
        return lazy_sum

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

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


  • 斐波那契数列是由 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):        fiblist = [0, 1]        count = 2        new = 0        while count < num:            new = fiblist[count - 2] + fiblist[count - 1]             fiblist.append(new)             count +=1        self.fiblist = fiblist    def __str__(self):        return str(self.fiblist)            __repr__ = __str__        def __len__(self):        return len(self.fiblist)        f = Fib(10)print fprint len(f)



  • g = gcd(self.p, self.q)

    求公约数

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

  • for k, v in kw.iteritems():

                setattr(self, k, v)


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

            self.name=name

            self.gender=gender

            for k, v in kw.iteritems():

                setattr(self, k, v)

    传入**kw 即可传入任意数量的参数,并通过 setattr() 绑定属性。

  • json.load(s)默认会调用read()方法,但是需要参数s是文件类型。在students类中加入read()方法后,students类型的变量也可以调用read()方法

  • 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


  • 每个函数在遇到第一个return之后就结束调用了,所以这里的if后面不用else

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

  • **kw表示dict字典,k,v是键值对。

    **args表示元组

  • 要让 @log 自适应任何参数定义的函数,可以利用Python的 *args 和 **kw,保证任意个数的参数总是能正常调用:

  • 任务

    请定义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


  • >>> getattr(s, 'name')  # 获取name属性'Bob'
    
    >>> setattr(s, 'name', 'Adam')  # 设置新的name属性
    >>> getattr(s, 'age')  # 获取age属性,但是属性不存在,报错
    >>> getattr(s, 'age', 20)  # 获取age属性,如果属性不存在,就返回默认值20


    • kw是字典,iteritems()用于遍历字典kw,而setattr(self, k, v)就等价于self.k = v


       

    • setattr(self,k,v) 是相当于self.k = v

    • 官方文档内容:
      setattr(object, name, value)

  • functools.partial就是帮助我们创建一个偏函数的,不需要我们自己定义int2(),可以直接使用下面的代码创建一个新的函数int2:

    >>> import functools
    >>> int2 = functools.partial(int, base=2)
    >>> int2('1000000')
    64
    >>> int2('1010101')
    85

    所以,functools.partial可以把一个参数多的函数变成一个参数少的新函数,少的参数需要在创建时指定默认值,这样,新函数调用的难度就降低了。

    任务

    在第7节中,我们在sorted这个高阶函数中传入自定义排序函数就可以实现忽略大小写排序。请用functools.partial把这个复杂调用变成一个简单的函数:

    sorted_ignore_case(iterable)

    参考代码:

    import functools
    sorted_ignore_case = functools.partial(sorted, cmp=lambda s1, s2: cmp(s1.upper(), s2.upper()))
    print sorted_ignore_case(['bob', 'about', 'Zoo', 'Credit'])


  • 请思考带参数的@decorator,@functools.wraps应该放置在哪:

    def performance(unit):
        def perf_decorator(f):
            def wrapper(*args, **kw):
                ???
            return wrapper
        return perf_decorator

    参考代码:

    import time, functools
    def performance(unit):
        def perf_decorator(f):
            @functools.wraps(f)
            def wrapper(*args, **kw):
                t1 = time.time()
                r = f(*args, **kw)
                t2 = time.time()
                t = (t2 - t1) * 1000 if unit=='ms' else (t2 - t1)
                print 'call %s() in %f %s' % (f.__name__, t, unit)
                return r
            return wrapper
        return perf_decorator
    
    @performance('ms')
    def factorial(n):
        return reduce(lambda x,y: x*y, range(1, n+1))
    print factorial.__name__


  • sorted(L, f):高阶函数,接受函数f对L进行排序,函数f的返回值为-1,1,0;

  • 这里map作用的s其实是list中的各个元素,而非list本身,所以这里s[0]已经是指首字母了

首页上一页1234567下一页尾页

举报

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

微信扫码,参与3人拼团

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

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