解析Python 偏函数用法全方位实现


Posted in Python onJune 26, 2020

Python的functools模块中有一种函数叫“偏函数”,自从接触它以来,发现确实是一个很有用且简单的函数,相信你看完这篇文章,你也有相见恨晚的感觉。

我们都知道,函数入参可以设置默认值来简化函数调用,而偏函数的作用就是将入参进行默认填充,降低函数使用的难度。

如int()函数,可以将字符型转换为整型,且默认的都是以十进制形式来转换,那为什么一定是十进制呢?如果想用以二进制的形式转换呢?其实我们可以看一下int函数它本身的定义偏函数,一个让你相见恨晚的实用函数

解析Python 偏函数用法全方位实现

可以看到int有两种用法,可以传一个位置参数,还可以多传一个关键字参数base,也就是基于什么格式转换,默认不传base参数是以十进制转换。所以,用二进制形式转换的话只要base=2即可(见下方代码)

value = int('10000')
print(value)  # 10000
 
value = int('10000', base=2)
print(value)  # 16

如果每次转换的字符串的时候都要输入base参数,显得很麻烦,因此偏函数的作用就体现出来了,可以使用functools.partial()函数来重新定义

from functools import partial

int2 = partial(int, base=2)
res = int2('10000')
print(res)   # 16

到这里,你应该已经感觉到了偏函数的一点点魅力吧,那我们再从多个角度进一步看透它。

自定义函数的使用

def add(a, b, c):
  print('a=',a,'b=',b,'c=',c)
  return a + b + c

add10 = partial(add, 10)
res = add10(1, 2)   # a= 10 b= 1 c= 2

如上代码中,partial(add, 10)入参并没有指定哪个关键字参数,函数却默认的将这个值传给了第一个参数a,那就说明,当没有指定默认参数时,默认赋值给第一个参数,余下参数按位置参数赋值。

当入参为可变参数时

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

sum10 = partial(sum, 10)
print(sum10(1))  # 11
print(sum10())   # 10

按上述理解,没有指定默认参数时,默认赋给第一个参数,那么第一个参数永远是10,后面再传入参的话就从第二个参数开始计算,因此会实现10 + 1 = 11 的结果。同样,如果不继续传参的话,只有默认的10,所以结果就是10

当入参为可变关键字参数时

D = {'value1':10, 'value2':20}
V = {'Default':100}
def show(**kw):
  for k in kw:
    print(k, kw.get(k))

showDef = partial(show, **V)
showDef(**D)
# Default 100
# value1 10
# value2 20

同理,此时入参由于是可变参数,因此默认是第一个传入,先打印Default关键字,这里关注一下函数的写法,可变关键字参数要写成(**V)

当入参为限制的关键字参数时

def student(name, * , age, city):
  print('name:',name, 'age:',age, 'city:',city)

studentAge = partial(student, age=20)
studentAge('Tom','Beijing')
# TypeError: student() takes 1 positional argument but 2 positional arguments (and 1 keyword-only argument) were given

我们知道,当用*号分隔开,表示后面的关键字参数是必传的,因此对于默认参数也是同样适用,即当参数为必传时,偏函数也需要对每个关键字参数设置默认值。因此修改后为

studentAge = partial(student, age=20, city='Beijing')
studentAge('Tom') # name: Tom age: 20 city: Beijing

综上,偏函数可以将目标函数的部分参数固化后,重新定义为新的函数,降低了编码的复杂度,尤其是当参数很多的时候,或者只用到其中某些参数的场景下时,效果更为显著。

到这里,你是否有了相见恨晚的感觉呢?简单函数小技巧,非常实用的偏函数用法就介绍完了,更多相关Python 偏函数内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Linux环境下MySQL-python安装过程分享
Feb 02 Python
完美解决python遍历删除字典里值为空的元素报错问题
Sep 11 Python
Python 获取当前所在目录的方法详解
Aug 02 Python
Sanic框架配置操作分析
Jul 17 Python
Python和Go语言的区别总结
Feb 20 Python
django celery redis使用具体实践
Apr 08 Python
用Python爬取QQ音乐评论并制成词云图的实例
Aug 24 Python
pytorch:model.train和model.eval用法及区别详解
Feb 20 Python
Python IDLE或shell中切换路径的操作
Mar 09 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
Apr 21 Python
pyspark 随机森林的实现
Apr 24 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
May 22 Python
Python如何优雅删除字符列表空字符及None元素
Jun 25 #Python
使用pytorch实现论文中的unet网络
Jun 24 #Python
python连接mysql有哪些方法
Jun 24 #Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
Jun 24 #Python
Python Tornado核心及相关原理详解
Jun 24 #Python
如何使用Python处理HDF格式数据及可视化问题
Jun 24 #Python
pytorch SENet实现案例
Jun 24 #Python
You might like
收音机频率指针指示不准确和灵敏度低问题
2021/03/02 无线电
php设计模式 Facade(外观模式)
2011/06/26 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
2016/03/01 PHP
Thinkphp框架开发移动端接口(1)
2016/08/18 PHP
php插件Xajax使用方法详解
2017/08/31 PHP
PHP实现的mysql读写分离操作示例
2018/05/22 PHP
php7函数,声明,返回值等新特性介绍
2018/05/25 PHP
js函数调用常用方法详解
2012/12/03 Javascript
JQuery each()函数如何优化循环DOM结构的性能
2012/12/10 Javascript
jquery入门—选择器实现隔行变色实例代码
2013/01/04 Javascript
使用indexOf等在JavaScript的数组中进行元素查找和替换
2013/09/18 Javascript
Redis基本知识、安装、部署、配置笔记
2015/03/05 Javascript
jQuery实现仿Alipay支付宝首页全屏焦点图切换特效
2015/05/04 Javascript
js实现二级菜单渐隐显示
2015/11/03 Javascript
理解javascript模块化
2016/03/28 Javascript
浅谈jQuery中hide和fadeOut的区别 show和fadeIn的区别
2016/08/18 Javascript
js返回顶部实例分享
2016/12/21 Javascript
Bootstrap标签页(Tab)插件使用方法
2017/03/21 Javascript
通过js修改input、select默认字体颜色
2017/04/19 Javascript
关于js陀螺仪的理解分析
2019/04/11 Javascript
python动态性强类型用法实例
2015/05/09 Python
Python实现邮件的批量发送的示例代码
2018/01/23 Python
python matlibplot绘制多条曲线图
2021/02/19 Python
Python实现随机漫步功能
2018/07/09 Python
Pytorch模型转onnx模型实例
2020/01/15 Python
Python eval函数原理及用法解析
2020/11/14 Python
Becextech新西兰:数码单反相机和手机在线商店
2018/04/27 全球购物
Deichmann英国:德国鞋类零售商
2021/01/30 全球购物
应届生会计电算化求职信
2013/10/03 职场文书
服装电子商务创业计划书
2014/01/30 职场文书
创先争优一句话承诺
2014/05/29 职场文书
邮政竞聘演讲稿
2014/09/03 职场文书
公安局班子个人对照检查材料思想汇报
2014/10/09 职场文书
Python道路车道线检测的实现
2021/06/27 Python
一文搞懂Golang 时间和日期相关函数
2021/12/06 Golang
opencv深入浅出了解机器学习和深度学习
2022/03/17 Python