解析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使用MySQLdb访问mysql数据库的方法
Aug 03 Python
python变量不能以数字打头详解
Jul 06 Python
python机器学习实战之K均值聚类
Dec 20 Python
Django实现组合搜索的方法示例
Jan 23 Python
python3+mysql查询数据并通过邮件群发excel附件
Feb 24 Python
Python实现的企业粉丝抽奖功能示例
Jul 26 Python
Django框架视图函数设计示例
Jul 29 Python
Python实现PyPDF2处理PDF文件的方法示例
Sep 25 Python
python 实现检验33品种数据是否是正态分布
Dec 09 Python
Python 模拟生成动态产生验证码图片的方法
Feb 01 Python
python 星号(*)的多种用途
Sep 21 Python
Python系统公网私网流量监控实现流程
Nov 23 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
php设计模式 Factory(工厂模式)
2011/06/26 PHP
prototype Element学习笔记(Element篇三)
2008/10/26 Javascript
javascript 解析url的search方法
2010/02/09 Javascript
事件模型在各浏览器中存在差异
2010/10/20 Javascript
nodejs win7下安装方法
2012/05/24 NodeJs
JS实现Enter键跳转及控件获得焦点
2013/08/12 Javascript
js中数组排序sort方法的原理分析
2014/11/20 Javascript
究竟什么是Node.js?Node.js有什么好处?
2015/05/29 Javascript
jQuery实现自动切换播放的经典滑动门效果
2015/09/12 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
2015/09/24 Javascript
Node.js刷新session过期时间的实现方法推荐
2016/05/18 Javascript
BOM系列第一篇之定时器setTimeout和setInterval
2016/08/17 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
微信小程序--onShareAppMessage分享参数用处(页面分享)
2017/04/18 Javascript
vue中阻止click事件冒泡,防止触发另一个事件的方法
2018/02/08 Javascript
vue使用监听实现全选反选功能
2018/07/06 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
2018/09/21 Javascript
微信公众号H5支付接口调用方法
2019/01/10 Javascript
layui原生表单验证的实例
2019/09/09 Javascript
玩转python爬虫之cookie使用方法
2016/02/17 Python
spark: RDD与DataFrame之间的相互转换方法
2018/06/07 Python
tensorflow 中对数组元素的操作方法
2018/07/27 Python
python实现对任意大小图片均匀切割的示例
2018/12/05 Python
python批量修改xml属性的实现方式
2020/03/05 Python
html5嵌入内容_动力节点Java学院整理
2017/07/07 HTML / CSS
html5唤起app的方法
2017/11/30 HTML / CSS
美国嘻哈文化生活方式品牌:GLD
2018/04/15 全球购物
Wojas罗马尼亚网站:波兰皮鞋品牌
2018/11/01 全球购物
WebSphere 应用服务器都支持哪些认证
2013/12/26 面试题
新浪微博实习心得体会
2014/01/27 职场文书
个人剖析材料及整改措施
2014/10/07 职场文书
2014年绩效考核工作总结
2014/12/11 职场文书
小学安全工作总结2015
2015/05/18 职场文书
2015年会计工作总结范文
2015/05/26 职场文书
靠谱准确的求职信
2019/04/02 职场文书
Java Spring Boot 正确读取配置文件中的属性的值
2022/04/20 Java/Android