偏函数
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