解析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使用redis pool的一种单例实现方式
Apr 16 Python
python编程实现随机生成多个椭圆实例代码
Jan 03 Python
Python pyinotify日志监控系统处理日志的方法
Mar 08 Python
浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)
Apr 10 Python
解决Python2.7中IDLE启动没有反应的问题
Nov 30 Python
在python下读取并展示raw格式的图片实例
Jan 24 Python
python matplotlib实现双Y轴的实例
Feb 12 Python
Python实现定时执行任务的三种方式简单示例
Mar 30 Python
Django的models中on_delete参数详解
Jul 16 Python
在python中用print()输出多个格式化参数的方法
Jul 16 Python
pytorch 可视化feature map的示例代码
Aug 20 Python
OpenCV-Python使用cv2实现傅里叶变换
Jun 09 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上传图片类(随机名,缩略图,加水印)
2010/06/30 PHP
sql注入与转义的php函数代码
2013/06/17 PHP
MacOS 安装 PHP的图片裁剪扩展Tclip
2015/03/25 PHP
php结合curl实现多线程抓取
2015/07/09 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
2015/12/18 PHP
php简单实现单态设计模式的方法分析
2017/07/28 PHP
Laravel5框架添加自定义辅助函数的方法
2018/08/01 PHP
Yii框架应用组件用法实例分析
2020/05/15 PHP
html的DOM中document对象images集合用法实例
2015/01/21 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
使用js实现的简单拖拽效果
2015/03/18 Javascript
极易被忽视的javascript面试题七问七答
2016/02/15 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
2016/06/20 Javascript
关于angular js_$watch监控属性和对象详解
2017/04/24 Javascript
vue不通过路由直接获取url中参数的方法示例
2017/08/24 Javascript
总结js中的一些兼容性易错的问题
2017/12/18 Javascript
详解JSON Web Token 入门教程
2018/07/30 Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
2018/10/25 Javascript
Vue函数式组件-你值得拥有
2019/05/09 Javascript
Node.js 路由的实现方法
2019/06/05 Javascript
JS出现404错误原理及解决方案
2020/07/01 Javascript
原生JavaScript实现拖动校验功能
2020/09/29 Javascript
[52:39]完美世界DOTA2联赛PWL S3 CPG vs Forest 第一场 12.16
2020/12/17 DOTA
Python素数检测的方法
2015/05/11 Python
Python中用max()方法求最大值的介绍
2015/05/15 Python
Python对list列表结构中的值进行去重的方法总结
2016/05/07 Python
python实现分页效果
2017/10/25 Python
python opencv实现信用卡的数字识别
2020/01/12 Python
解决reload(sys)后print失效的问题
2020/04/25 Python
如何使用Python处理HDF格式数据及可视化问题
2020/06/24 Python
真正的英国宝藏:Mappin & Webb
2019/05/05 全球购物
财务管理个人自荐书范文
2013/11/24 职场文书
法人委托书
2014/07/31 职场文书
三分钟自我介绍演讲稿
2014/08/21 职场文书
幼儿园感恩节活动方案2014
2014/10/11 职场文书
AndroidStudio图片压缩工具ImgCompressPlugin使用实例
2022/08/05 Java/Android