偏函数
偏函数是将所要承载的函数作为partial()
函数的第一个参数,原函数的各个参数依次作为partial()
函数后续的参数,除非使用键值对参数。
可以理解成绑定了一部分参数的函数,作用是少传参数,更短更简洁。
partial()
源码
def partial(func, *args, **keywords):
def newfunc(*fargs, **fkeywords):
newkeywords = keywords.copy()
newkeywords.update(fkeywords)
return func(*args, *fargs, **newkeywords)
newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc
4-7行newfunc()
结果就是返回一个以新的序列和键值对为参数的func()
函数,第一个参数是*args, *fargs
,其实这是一个参数,因为*args
本身就是任意多个无名参数;第二个参数是一个新的键值对**newkeywords
,它是keywords
的浅拷贝对象更新了fkeywords
之后的键值对。
8-10行声明了newfunc
的三个属性,用于新函数查询原引用函数的名字和参数信息。
int()
函数按N进制转换
int()
函数可以将字符串转换成整数,当仅传入字符串时,int()
函数默认按十进制转换,这里相当于是1*10^2+2*10^1+3*10^0
。当更改键值对的值10为其他数时,也相应按照N进制转换,也就是我们可以先把它看为两个参数。
>>> import functools
>>> int2 = functools.partial(int, base = 2)
>>> int2('1000000')
64
也可以在调用时传入其他值:
>>> int2('1000000', base = 10)
1000000
当传入:
max2 = functools.partial(max, 10)
max2(5,6,7)
相当于:
args = (10, 5, 6, 7)
max(*args)
结果为10
。
更好地理解
import functools
def add(*args, **kwargs):
print(*args)
print('-' * 20)
for key, value in kwargs.items():
print('%s : %s' % (key, value))
add_partial = functools.partial(add, 10, k1 = 10, k2 = 20)
add_partial(1, 2, 3, k1 = 40, k3 = 30)
以上输出结果为:
10 1 2 3
--------------------
k1 : 40
k2 : 20
k3 : 30
通过以上就很好理解了,函数经过func_partial = functools.partial(func,*args, **kwargs)
固定参数后,func_partial(*fargs, **fkwargs)
实际上将*args
加到了*fargs
之前,形成了一个新的tuple,再将kwargs.update(fkwargs)
作为后一个键值参数,进行计算。