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

python进阶

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

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

    def performance(unit):
        def perf_decorator(f):
            def wrapper(*args, **kw):
                ???
            return wrapper
        return perf_decorator
    • ?不会了怎么办

    • 注意@functools.wraps应该作用在返回的新函数上。

      参考代码:

      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__


    查看全部
  • 导入模块math后为何引用sqrt时还要加math: math是包含各种函数或方法的模块,若前面是import math, 引用模块中的函数就要用格式math.sqrt()。 若想省略前面的模块名,在前面导入时用from math import *


    记得调用数学函数时应该加入:import math

    然后平方根的三种表达方法别忘记。。。

    第一种调用math函数库    math.sqrt

    第二种调用内置函数库      pow(x,0.5)

    第三种直接利用**            x**0.5


    查看全部
  • 任务

    上一节的@performance只能打印秒,请给 @performace 增加一个参数,允许传入's'或'ms':

    @performance('ms')
    def factorial(n):
        return reduce(lambda x,y: x*y, range(1, n+1))
    • ?不会了怎么办

    • 要实现带参数的@performance,就需要实现:

      my_func = performance('ms')(my_func)

      需要3层嵌套的decorator来实现。

      参考代码:

      import time
      def performance(unit):
          def perf_decorator(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(10)


    查看全部
  • 任务

    请编写一个@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)


    查看全部
  • 任务

    利用匿名函数简化以下代码:

    def is_not_empty(s):
        return s and len(s.strip()) > 0
    filter(is_not_empty, ['test', None, '', 'str', '  ', 'END'])
    • ?不会了怎么办

    • 定义匿名函数时,没有return关键字,且表达式的值就是函数返回值。

      参考代码:

      print filter(lambda s: s and len(s.strip())>0, ['test', None, '', 'str', '  ', 'END'])


    查看全部
  • # 希望一次返回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中闭包

    2020-07-14

  • reduce()函数

    可以定义一个函数,该函数为一组规则,然后通过reduce()函数来调用这个规则,去处理list

    参数:reduce可以接收三个参数,第一个为处理函数
    处理函数接受两个参数
    第二个参数为待处理的数据,是一个list,可以是
    任意数据类型的list
    第三个参数是可选的,是一个初始值
    def f(x,y) :
       return 规则
     print(reduce(规则函数名,list,[初始值]))
    查看全部
  • 这里的S[0].upper,意思不是把S这个列表里的第一个值大写吗?就是把['adam', 'LISA', 'barT']中的adam全部大写  --------------------------------------------  不是的,map函数中接受的函数是作用在list中的每一个元素上,所以map函数中接受的f的自变量是list中的每一个元素,因此def时候的format_name(s)的s指代的是list中的每一个元素,也就是字符串,而不是整个list。s[0]就是s字符串的第一个字母。

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

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


    查看全部
  • 实例赋值:xiaoming.name = '';实例的属性可以像普通变量一样进行操作。

    查看全部
  • 类关键字:class,类名以大写字母开头紧接着(object)表示该类是从哪个类继承下来的;创建实例用类名+()

    eg:

    class  Person(object):

        pass

    查看全部
  • 类(class)用于定义抽象类型,实例根据类的定义被创建出来

    查看全部
  • 试用某一新特性通过导入__future__模块的某些功能来实现。

    新版本与旧版本不兼容在旧版本中添加到_future_中便于旧代码在旧版本中测试

    查看全部
  • 导入动态模块:

    try:

        from cStringIO  import  StringIO

    except  ImportError:

        from StringIO import StringIO

    try的作用是捕获错误,并在捕获到指定错误时执行except语句。

    import...as...可以动态导入不同名称的模块

    查看全部
  • 导入模块:import  

    导入模块中的某几个函数: form math import pow,sin

    导入函数防止冲突 给函数重命名: from math import log as logger  此时log函数变成logger

    查看全部

举报

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

微信扫码,参与3人拼团

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

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