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()