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()
原文地址:https://www.cnblogs.com/LS1314/p/8504488.html