偏函数

2018-08-01  本文已影响0人  伟大的洪立

偏函数作用

Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial function)
偏函数的作用:将所作用的函数作为partial()函数的第一个参数,原函数的各个参数依次作为partial()函数的后续参数,原函数有关键字参数的一定要带上关键字,没有的话,按原有参数顺序进行补充。
简单总结functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。

偏函数的使用

偏函数的第二个部分(可变参数), 按原来函数的参数顺序进行补充, 参数将作用于原函数上, 最后偏函数返回一个新函数(类似装饰器, 对于函数进行二次包装, 产生特殊效果; 但又不同于装饰器, 偏函数产生了一个新函数, 而装饰器, 可改变被装饰器的函数入口地址也可以不影响原函数)

装饰器实现

from functools import wraps

def sum_add(*args1):  # 给装饰器带上参数
    def decorator(func):
        @wraps(func)  # 加上这句,原函数func被decorator作用后,函数性质不变
        def my_sum(*args2):
            my_s = 0 
            for n in args1:
                print(n)
                my_s = my_s + n # 这个是我们新加的求和结果
            return func(*args2) + my_s # 在原求和函数的结果上在加S,并返回这个值
        return my_sum # 返回my_sum函数, 该函数扩展原函数的功能
    return decorator # 返回装饰器

@ sum_add(10, 20) # 使用装饰器
def sum(*args):
    s = 0
    for n in args:
        print("---------")
        print(n)
        print("---------")
        s = s+n
    return s

print(sum(1, 2, 3, 4, 5))
print(sum.__name__)

装饰器只是在原函数上进行了扩展功能, 并不能影响我们的原函数

# 普通函数可变参数执行
def sum(*args):
    s = 0
    for n in args:
        s = s + n 
    return s
print(sum(10, 20)+sum(1, 2, 3, 4, 5))

# 普通函数可变参数加关键字参数组合
def sum(*args, **others):
    s = 0 
    for n in args:
        s = s + n
    s1 = 0
    for k in others:
        s1 = s1 + others[k] # 关键字参数里蕴藏的求和结果, k是dict中的key值
    return s + s1
D = {'value': 10, 'value1': 20}
print(sum(1, 2, 3, 4, 5, **D))

# 偏函数可变参数顺序填充
from functools import partial

def sum(*args):
    s = 0
    for n in args:
        s = s + n
    return s

sum_add_10 = partial(sum, 10) # 10作用在sum第一个参数的位置
sum_add_10_20 = partial(sum, 10, 20)  # 10,20 分别作用在sum第一个和第二个参数位置
print('A__________sum函数的地址入口:')
print(sum)
print("B__________partial函数返回函数的入口:")
print(partial(sum,10))
print(sum_add_10(1, 2, 3, 4, 5)) # 10+1+2+3+4+5
print(sum_add_10_20(1, 2, 3, 4, 5)) # 10+20+1+2+3+4+5

通过几个例子,我们最终发现,还是偏函数比较方便,一行代码就搞定了,而且新定义的函数,可以根据函数名很容易知道,这个函数扩展的原函数是哪个,实现的效果是:

from functools import partial

L = list(range(1, 11))
slice_5_10 = partial(slice, 5, 10)
print(L[slice_5_10])  # [6, 7, 8, 9, 10]

偏函数的第三个部分(关键字参数), 按原有函数的关键字参数进行填补,参数将作用在与原函数上, 参数将作用于原函数上, 最后偏函数返回一个新函数

import functools
def mod(m, *, key=2):
    return m % key == 0
mod_to_2 = functools.partial(mod, key=2)
print(mod(3)) # False
print(mod_to_2(3)) # False
mod_to_5 = functools.partial(mod, key=5)
print(mod(25, key=5)) # True
print(mod_to_5(25))  # True

参考博客:
https://blog.csdn.net/appleyk/article/details/77609114

上一篇下一篇

猜你喜欢

热点阅读