zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    Building a flexiable renderer
    Indirect Illumination in mental ray
    我的心情
    Cellular Automata
    Subsurface Scattering in mental ray
    Shader Types in mental ray
    BSP Traversal
    我的渲染器终于达到了MR的速度
    How to handle displacement and motion blur
    说明
  • 原文地址:https://www.cnblogs.com/LS1314/p/8504488.html
Copyright © 2011-2022 走看看