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

python进阶

廖雪峰 移动开发工程师
难度中级
时长 3小时33分
  • def cmp_ignore_case(s1, s2):
        s1 = s1.lower()
        s2 = s2.lower()
        if s1 == s2:
            return 0
        elif s1 > s2:
            return 1
        else:
            return -1
    
    
    print sorted(['bob', 'about', 'Zoo', 'Credit'], cmp=cmp_ignore_case)


    查看全部
  • 任务

    请编写一个@performance,它可以打印出函数调用的时间。

    • ?不会了怎么办

    • 计算函数调用的时间可以记录调用前后的当前时间戳,然后计算两个时间戳的差。

      参考代码:

      import time
      def performance(f):
          def fn(*args, **kw):
              t1 = time.time()
              r = f(*args, **kw)
              t2 = time.time()
              print 'call %s() in %fs' % (f.__name__, (t2 - t1))
              return r
          return fn
      
      @performance
      def factorial(n):
          return reduce(lambda x,y: x*y, range(1, n+1))
      print factorial(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.num = L

        def __str__(self):
            return str(self.num )
        __repr__=__str__
       
        def __len__(self):
            return len(self.num)

    f = Fib(10)
    print f
    print len(f)


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

    2019-01-07

  • import mathdef is_sqr(x):    result = int(math.sqrt(x))    if result * result == x:        return TrueL = [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]print filter(is_sqr, L)


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

    def who_am_i(x):
        print x.whoAmI()

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

    2019-01-07

  • python中编写无参数decorator

    Python的 decorator 本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数。

    使用 decorator 用Python提供的 @ 语法,这样可以避免手动编写f = decorate(f) 这样的代码。

    考察一个@log的定义:

    def log(f):     def fn(x):         print 'call ' + f.__name__ + '()...'         return f(x)     return fn

    对于阶乘函数,@log工作得很好:

    @log def factorial(n):     return reduce(lambda x,y: x*y, range(1, n+1)) print factorial(10)

    结果:

    call factorial()... 3628800

    但是,对于参数不是一个的函数,调用将报错:

    @log def add(x, y):     return x + y print add(1, 2)

    结果:

    Traceback (most recent call last):   File "test.py", line 15, in <module>     print add(1,2) TypeError: fn() takes exactly 1 argument (2 given)

    因为 add() 函数需要传入两个参数,但是 @log 写死了只含一个参数的返回函数。

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

    def log(f):     def fn(*args, **kw):         print 'call ' + f.__name__ + '()...'         return f(*args, **kw)     return fn

    现在,对于任意函数,@log 都能正常工作。


    查看全部
  • 装饰器:使用@语法

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

    查看全部
  • class Student(Person):
        def __init__(self, name, gender, score):        super(Student, self).__init__(name, gender)
            self.score = score

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

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


    查看全部
  • python中匿名函数

    高阶函数可以接收函数做参数,有些时候,我们不需要显式地定义函数,直接传入匿名函数更方便。

    在Python中,对匿名函数提供了有限支持。还是以map()函数为例,计算 f(x)=x时,除了定义一个f(x)的函数外,还可以直接传入匿名函数:

    >>> map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]) [1, 4, 9, 16, 25, 36, 49, 64, 81]

    通过对比可以看出,匿名函数 lambda x: x * x 实际上就是:

    def f(x):     return x * x

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

    匿名函数有个限制,就是只能有一个表达式,不写return,返回值就是该表达式的结果。

    使用匿名函数,可以不必定义函数名,直接创建一个函数对象,很多时候可以简化代码:

    >>> sorted([1, 3, 9, 5, 0], lambda x,y: -cmp(x,y)) [9, 5, 3, 1, 0]

    返回函数的时候,也可以返回匿名函数:

    >>> myabs = lambda x: -x if x < 0 else x  >>> myabs(-1) 1 >>> myabs(1) 1


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


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

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

    # 希望一次返回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

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

    任务

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

    • ?不会了怎么办

    • 考察下面的函数 f:

      def f(j):
          def g():
              return j*j
          return g

      它可以正确地返回一个闭包g,g所引用的变量j不是循环变量,因此将正常执行。

      在count函数的循环内部,如果借助f函数,就可以避免引用循环变量i。

      参考代码:

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


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

    2019-01-07

  • class Person(object):

        __count = 0
       
        @classmethod
        def how_many(cls):
            return cls.__count
       
        def __init__(self,name):
            Person.__count+=1
            self.name=name

    外部无法直接访问Person.__count, 但是可以通过类方法how_many()来获取到__count的值。


    查看全部
  • 这章先码着

    查看全部
  • python中闭包

    在函数内部定义的函数和外部定义的函数是一样的,只是他们无法被外部访问:

    def g():     print 'g()...' def f():     print 'f()...'     return g

    将 g 的定义移入函数 f 内部,防止其他代码调用 g:

    def f():     print 'f()...'     def g():         print 'g()...'     return g

    但是,考察上一小节定义的 calc_sum 函数:

    def calc_sum(lst):     def lazy_sum():         return sum(lst)     return lazy_sum

    注意: 发现没法把 lazy_sum 移到 calc_sum 的外部,因为它引用了 calc_sum 的参数 lst。

    像这种内层函数引用了外层函数的变量(参数也算变量),然后返回内层函数的情况,称为闭包(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-01-07

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

    它将屏蔽掉对类属性的访问。

    查看全部

举报

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

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