解析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判断windows隐藏文件的方法
Mar 21 Python
Python获取脚本所在目录的正确方法
Apr 15 Python
Python使用cx_Oracle模块操作Oracle数据库详解
May 07 Python
详解Python 数据库的Connection、Cursor两大对象
Jun 25 Python
Python之列表的插入&替换修改方法
Jun 28 Python
手把手教你如何安装Pycharm(详细图文教程)
Nov 28 Python
python3.6根据m3u8下载mp4视频
Jun 17 Python
wxPython窗体拆分布局基础组件
Nov 19 Python
tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例
Jan 21 Python
python 的topk算法实例
Apr 02 Python
python 获取域名到期时间的方法步骤
Feb 10 Python
Python xlwings插入Excel图片的实现方法
Feb 26 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 QRCODE生成彩色二维码的方法
2016/05/19 PHP
PHP输出Excel PHPExcel的方法
2018/07/26 PHP
使用laravel根据用户类型来显示或隐藏字段
2019/10/17 PHP
显示、隐藏密码
2006/07/01 Javascript
javascript 事件查询综合 推荐收藏
2010/03/10 Javascript
jQuery对象与DOM对象之间的转换方法
2010/04/15 Javascript
动态标签 悬停效果 延迟加载示例代码
2013/11/21 Javascript
什么是Node.js?Node.js详细介绍
2014/06/01 Javascript
jQuery实现图片向左向右切换效果的简单实例
2016/05/18 Javascript
jQuery表单插件ajaxForm实例详解
2017/01/17 Javascript
基于jQuery实现弹幕APP
2017/02/10 Javascript
判断颜色是否合法的正则表达式(详解)
2017/05/03 Javascript
详解nodejs中express搭建权限管理系统
2017/09/15 NodeJs
vue打包相关细节整理(小结)
2018/09/28 Javascript
详解从react转职到vue开发的项目准备
2019/01/14 Javascript
在Vue中使用this.$store或者是$route一直报错的解决
2019/11/08 Javascript
JavaScript实现好看的跟随彩色气泡效果
2020/02/06 Javascript
基于JavaScript实现简单抽奖功能代码实例
2020/10/20 Javascript
详解React路由传参方法汇总记录
2020/11/29 Javascript
JavaScript实现跟随鼠标移动的盒子
2021/01/28 Javascript
[07:27]DOTA2卡尔工作室 英雄介绍水晶室女篇
2013/06/21 DOTA
Python模块学习 filecmp 文件比较
2012/08/27 Python
Django中Middleware中的函数详解
2019/07/18 Python
Python中zip()函数的解释和可视化(实例详解)
2020/02/16 Python
open_basedir restriction in effect. 原因与解决方法
2021/03/14 PHP
中国茶叶、茶具一站式网上购物商城:醉品茶城
2018/07/03 全球购物
意大利时尚奢侈品店:D’Aniello Boutique
2021/01/19 全球购物
简述安装Slackware Linux系统的过程
2012/01/12 面试题
体育教师工作总结的自我评价
2013/10/10 职场文书
集体婚礼策划方案
2014/02/22 职场文书
彩色的翅膀教学反思
2014/04/25 职场文书
科技节口号
2014/06/19 职场文书
大学生入党群众意见书
2015/06/02 职场文书
2015年党务工作者个人工作总结
2015/10/22 职场文书
windows server2008 开启端口的实现方法
2022/06/25 Servers
了解MySQL查询语句执行过程(5大组件)
2022/08/14 MySQL