• 24-高级特性之内建方法(5)


    functools

    functools 是python2.5被引入的,一些工具函数放在此包

    import functools
    print(dir(functools))
    

    偏函数 partiial

    function:把原函数的某些参数设为默认参数,返回一个新函数名,以简化函数调用的形式

    • 实例1:

      1.原始 {把数字串按照合适的进制转化成整数}

      x1 = int('123456')
      x2 = int('123456',10)
      print(x1==x2) #int(,base默认为10)

      2.若现在大量数据要进行int(...,base=2)为了简化int(,base=2)

      def int2(x, base=2): #新函数设置了默认参数为base=2,以后调用就直接写x即可
      return int(x,base) #内核还是int
      x3 = int2('100000')
      x4 = int2('111111')
      x5 = int2('101010')

      3.再次用functool.partial简化int的形式,无需自己定义int2

      import functools
      int2 = functools.partial(int, base=2)
      x3 = int2('1000000')
      x4 = int2('101010')
      x5 = int2('1011001')

      当然,int2依旧可以传其他的base

      x6 = int2('10001011',base=10) #由于在int2的定义中base是命名关键字参数,必须写base=...

      实际上,完整的定义可以是:functools.partial(fname, *args, **kw)

      所以上文的functools.partial(int,base=2)等价于int(x,**kw),kw={'base':'2'}

      而*args的例子,如下

      max2 = functools.partial(max, 10) #默认传入了args为10,即默认最大值为10
      r1 = max2(5,6,7)
      r2 = max(10,5,6,7)
      print(r1==r2) #两者等价,但max2更加简洁

    • 实例2:

      import functools
      def showarg(*args, **kwargs):
      print(args) #先打印可变参数
      print(kwargs)# 再打印关键字参数
      p1=functools.partial(showarg, 1,2,3)
      p1()
      p1(4,5,6)
      p1(a='python', b='bjsxt')

      p2=functools.partial(showarg, a=3,b='linux')
      p2()
      p2(1,2)
      p2(a='python', b='bjsxt')

    Wraps函数:

    引入背景:

    • 使用装饰器时,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变)
    • wraps的装饰器可以消除这样的副作用
    import functools
    
    #定义装饰器
    def note_1(func):
        def wrapper():
            print('note befor')
            ret  = func()       #执行func()
            print('note after')
            return ret
        return wrapper
    
    def note_2(func):
        @functools.wraps(func)  #消除装饰器的副作用
        def wrapper():
            print('note befor')
            ret  = func() 
            print('note after')
            return ret
        return wrapper
    
    #对函数进行装饰,并调用函数   
    @note_1
    def test_1():
        print('I am test')
    test_1()
    print(test_1,'
    ') #变成了 test_1.wrapper,就是note_1()的内层函数wrapper
    
    @note_2
    def test_2():
        print('I am test')
    test_2()
    print(test_2)      #还是原来的test_2()
  • 相关阅读:
    判断回文字符串
    汉诺塔递归问提
    课程作业02.2
    编写一个程序,此程序从命令行接收多个数字,求和之后输出结果。
    《大道至简》第一章java伪代码分析
    《大道至简》读后感
    用户体验
    大二上学期软件工程概论学习进度表(第十五周)
    12-24个人博客
    大二上学期软件工程概论学习进度表(第十四周)
  • 原文地址:https://www.cnblogs.com/LS1314/p/8504488.html
Copyright © 2020-2023  润新知