博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
functools 之 partial(偏函数)
阅读量:5054 次
发布时间:2019-06-12

本文共 2666 字,大约阅读时间需要 8 分钟。

当函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。当然,decorator(装饰器) 也可以实现,如果,我们嫌麻烦的话。

 

我们借助Python的help帮助函数,简单了解下什么是partial(偏函数):

这里我们主要说下紫色圈的意思:

partial 一共有三个部分:

(1)第一部分也就是第一个参数,是一个函数,这个函数可以是你定义的,也可以是Python内置函数

(2)第二部分是一个可变参数,*args,比如内置函数max的参数就是一个可变参数,max(1,2,3,4,5)=5

 

(3)第三部分是一个关键字参数,比如内置函数int的第二个参数就是命名关键字参数,默认base=10,表示int转换时默认是10进制的:

 

 

所以:

  partial函数的作用就是:将所作用的函数作为 partial() 函数的第一个参数,原函数的各个参数依次作为 partial() 函数的后续参数,原函数有关键字参数的一定要带上关键字,没有的话,按原有参数顺序进行补充。

 

举例说明:

1. 参数一层一层传

from functools import partialdef my_sum(a, b):    print("a=", a)    print("b=", b)    return a + b# 偏函数的第一个参数是 作用函数(my_sum)# 偏函数的第二个参数是 传给作用函数的第一个参数(a)# 偏函数的第三个参数是 传给作用函数的第三个参数(b)new_my_sum = partial(my_sum, 10)        # 相当于: new_my_sum = my_sum(10, b)   位置传参轮到a了, a=10res = new_my_sum(20)                    # 相当于: res = my_sum(10, 20)  位置传参轮到b了, b=20print("res=", res)# 结果:# a= 10# b= 20# res= 30

2. 参数一次性传进去

from functools import partialdef my_sum(a, b):    print("a=", a)    print("b=", b)    return a + b# 偏函数的第一个参数是 作用函数(my_sum)# 偏函数的第二个参数是 传给作用函数的第一个参数(a)# 偏函数的第三个参数是 传给作用函数的第三个参数(b)new_my_sum = partial(my_sum, 10, 20)        # 相当于: new_my_sum = my_sum(10, b)   位置传参轮到a了, a=10; 轮到b了, b=20res = new_my_sum()                    # 相当于: res = my_sum(10, 20)print("res=", res)# 结果:# a= 10# b= 20# res= 30

3. 关键字传参(1)

from functools import partialdef my_sum(a, b):    print("a=", a)    print("b=", b)    return a + b# 偏函数的第一个参数是 作用函数(my_sum)# 偏函数的第二个参数是 传给作用函数的第一个参数(a)# 偏函数的第三个参数是 传给作用函数的第三个参数(b)# 注意: 这里的关键字传参,传给的是后边的b,前边的a未指定关键字,没有报错,正常,因为按照形参a和b的位置来看,关键字参数要在位置参数之后new_my_sum = partial(my_sum, b=10)        # 相当于: new_my_sum = my_sum(a, 10)   关键字传参,传给了b, b=10res = new_my_sum(20)                      # 相当于: res = my_sum(20, 10)         b有了实参,剩下a,所以传给了a, a=20print("res=", res)# 结果:# a= 20# b= 10# res= 30

4. 关键字传参(2)

from functools import partialdef my_sum(a, b):    print("a=", a)    print("b=", b)    return a + b# 偏函数的第一个参数是 作用函数(my_sum)# 偏函数的第二个参数是 传给作用函数的第一个参数(a)# 偏函数的第三个参数是 传给作用函数的第三个参数(b)# 注意: 这里的关键字传参,传给的是前边的a,后边的b未指定关键字,就会报错,因为按照形参a和b的位置来看,关键字参数要在位置参数之后,也就是说,a指定了,b也必须指定就可以了new_my_sum = partial(my_sum, a=10)        # 相当于: new_my_sum = my_sum(10, b)   关键字传参,传给了a, a=10res = new_my_sum(20)                      # 相当于: res = my_sum(10, 20)         a有了实参,剩下b,所以想要传给b, b=20,但是违反了关键字参数在位置参数之后原则,所以报错print("res=", res)# 结果:# TypeError: my_sum() got multiple values for argument 'a'

 

 

 

本文参考:

  https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143184474383175eeea92a8b0439fab7b392a8a32f8fa000  (偏函数和装饰器的对比)

  https://blog.csdn.net/appleyk/article/details/77609114  (偏函数)

 

转载于:https://www.cnblogs.com/yuanyongqiang/p/10453911.html

你可能感兴趣的文章
蓝桥杯-分小组-java
查看>>
Java基础--面向对象编程1(类与对象)
查看>>
Android Toast
查看>>
iOS开发UI篇—Quartz2D使用(绘制基本图形)
查看>>
docker固定IP地址重启不变
查看>>
桌面图标修复||桌面图标不正常
查看>>
JavaScript基础(四)关于对象及JSON
查看>>
关于js sort排序方法
查看>>
JAVA面试常见问题之Redis篇
查看>>
javascript:二叉搜索树 实现
查看>>
网络爬虫Heritrix源码分析(一) 包介绍
查看>>
__int128的实现
查看>>
Problem - 1118B - Codeforces(Tanya and Candies)
查看>>
jdk1.8 api 下载
查看>>
svn 图标不显示
查看>>
getElement的几中属性介绍
查看>>
iOS 使用Quartz 2D画虚线 【转】
查看>>
平面最接近点对
查看>>
HTML列表,表格与媒体元素
查看>>
PHP、Java、Python、C、C++ 这几种编程语言都各有什么特点或优点?
查看>>