解析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 相关文章推荐
用python实现的去除win下文本文件头部BOM的代码
Feb 10 Python
图文详解WinPE下安装Python
May 17 Python
Python实现简单的语音识别系统
Dec 13 Python
简述Python2与Python3的不同点
Jan 21 Python
TensorFlow搭建神经网络最佳实践
Mar 09 Python
python使用tensorflow深度学习识别验证码
Apr 03 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
Apr 20 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
Jul 19 Python
Django集成celery发送异步邮件实例
Dec 17 Python
Python3 解决读取中文文件txt编码的问题
Dec 20 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
May 10 Python
如何用python爬取微博热搜数据并保存
Feb 20 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
php5 and xml示例
2006/11/22 PHP
用PHP查询域名状态whois的类
2006/11/25 PHP
Apache+php+mysql在windows下的安装与配置图解(最新版)
2008/11/30 PHP
php Ubb代码编辑器函数代码
2012/07/05 PHP
javascript web页面刷新的方法收集
2009/07/02 Javascript
JS中的substring和substr函数的区别说明
2013/05/07 Javascript
使用js操作cookie的一点小收获分享
2013/09/03 Javascript
jQuery的图片滑块焦点图插件整理推荐
2014/12/07 Javascript
chrome调试javascript详解
2015/10/21 Javascript
jQuery操作属性和样式详解
2016/04/13 Javascript
AngularJS实现路由实例
2017/02/12 Javascript
js仿微博动态栏功能
2017/02/22 Javascript
详解Vue 单文件组件的三种写法
2020/02/19 Javascript
[54:10]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
介绍Python的Django框架中的QuerySets
2015/04/20 Python
Django卸载之后重新安装的方法
2017/03/15 Python
python的变量与赋值详细分析
2017/11/08 Python
python 三元运算符使用解析
2019/09/16 Python
Python中return函数返回值实例用法
2020/11/19 Python
CK美国官网:Calvin Klein
2016/08/26 全球购物
印度尼西亚最大和最全面的网络商城:Blibli.com
2017/10/04 全球购物
德国Discount-Apotheke中文官网:DC德式康线上药房
2020/02/18 全球购物
荷兰DOD药房中文官网:DeOnlineDrogist
2020/12/27 全球购物
到底Java是如何传递参数的?是by value或by reference?
2012/07/13 面试题
南京软件公司的.net程序员笔试题
2014/08/31 面试题
卫校中专生个人自我评价
2013/09/19 职场文书
大学生作弊检讨书
2014/02/19 职场文书
人事专员岗位职责范本
2014/03/04 职场文书
排查整治工作方案
2014/06/09 职场文书
小学班主任经验交流材料
2014/12/16 职场文书
售后服务承诺函格式
2015/01/21 职场文书
2015年音乐教研组工作总结
2015/07/22 职场文书
调研报告的主要写法
2019/04/18 职场文书
2019年教师节:送给所有老师的祝福语
2019/09/05 职场文书
Angular性能优化之第三方组件和懒加载技术
2021/05/10 Javascript
Android自定义scrollview实现回弹效果
2022/04/01 Java/Android