解析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 re模块findall()函数实例解析
Jan 19 Python
Python各类图像库的图片读写方式总结(推荐)
Feb 23 Python
python实现在遍历列表时,直接对dict元素增加字段的方法
Jan 15 Python
python树莓派红外反射传感器
Jan 21 Python
pycharm配置当鼠标悬停时快速提示方法参数
Jul 31 Python
Python (Win)readline和tab补全的安装方法
Aug 27 Python
python 实现目录复制的三种小结
Dec 04 Python
Python如何使用bokeh包和geojson数据绘制地图
Mar 21 Python
python 使用csv模块读写csv格式文件的示例
Dec 02 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
Dec 22 Python
PyCharm 解决找不到新打开项目的窗口问题
Jan 15 Python
使paramiko库执行命令时在给定的时间强制退出功能的实现
Mar 03 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模板Smarty的初级使用方法以及心得分享
2013/06/21 PHP
php获取数组长度的方法(有实例)
2013/10/27 PHP
php foreach如何跳出两层循环(详解)
2016/11/05 PHP
php结合redis高并发下发帖、发微博的实现方法
2016/12/15 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
2018/06/19 PHP
thinkPHP和onethink微信支付插件分享
2019/08/11 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
Aster vs KG BO3 第一场2.19
2021/03/10 DOTA
Javascript 刷新全集常用代码
2009/11/22 Javascript
为jQuery增加join方法的实现代码
2010/11/28 Javascript
juqery 学习之六 CSS--css、位置、宽高
2011/02/11 Javascript
再论Javascript的类继承
2011/03/05 Javascript
js实现倒计时时钟的示例代码
2013/12/17 Javascript
javascript 自定义回调函数示例代码
2014/09/26 Javascript
Google Maps API地图应用示例分享
2014/10/23 Javascript
NodeJS实现阿里大鱼短信通知发送
2016/01/17 NodeJs
详解javascript实现瀑布流绝对式布局
2016/01/29 Javascript
JS实现点击登录弹出窗口同时背景色渐变动画效果
2016/03/25 Javascript
angularjs实现搜索的关键字在正文中高亮出来
2017/06/13 Javascript
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
微信小程序中添加客服按钮contact-button功能
2018/04/27 Javascript
Js中使用正则表达式验证输入是否有特殊字符
2018/09/07 Javascript
element-ui表格合并span-method的实现方法
2019/05/21 Javascript
微信小程序开发搜索功能实现(前端+后端+数据库)
2020/03/04 Javascript
python实现图片变亮或者变暗的方法
2015/06/01 Python
Python中time模块和datetime模块的用法示例
2016/02/28 Python
python并发编程之线程实例解析
2017/12/27 Python
Python数据结构之图的应用示例
2018/05/11 Python
python模块hashlib(加密服务)知识点讲解
2019/11/25 Python
Python timeit模块的使用实践
2020/01/13 Python
Python中itertools的用法详解
2020/02/07 Python
加拿大时装零售商:Influence U
2018/12/22 全球购物
保险专业大专生求职信
2013/10/26 职场文书
优秀毕业生主要事迹材料
2015/11/04 职场文书
Python入门之基础语法详解
2021/05/11 Python
python turtle绘图
2022/05/04 Python