Python基础:函数式编程-偏函数

偏函数

偏函数是将所要承载的函数作为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)作为后一个键值参数,进行计算。

你可能感兴趣的:(Python基础:函数式编程-偏函数)