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()
  • 相关阅读:
    PortalBasic Web 应用开发框架:应用篇(六) —— 公共组件
    如何提高Linq查询的性能
    Distributed SMS Processor
    新书《火球 UML大战需求分析》试读 第一章 大话UML
    UML 软件这是源基地软件大学
    Java多线程编程总结
    [译]扩展JavaScript功能的正确方法
    OEA体验:常用功能3 多对多关系
    MicroOrm.Net
    ASP.NET MVC Model元数据及其定制 [中篇]
  • 原文地址:https://www.cnblogs.com/LS1314/p/8504488.html
Copyright © 2011-2022 走看看