解析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编程中实现迭代器的一些技巧小结
Jun 21 Python
Django内容增加富文本功能的实例
Oct 17 Python
python3+PyQt5实现自定义分数滑块部件
Apr 24 Python
Python基于property实现类的特性操作示例
Jun 15 Python
基于Python List的赋值方法
Jun 23 Python
python中partial()基础用法说明
Dec 30 Python
在Python中构建增广矩阵的实现方法
Jul 01 Python
Python 的AES加密与解密实现
Jul 09 Python
python烟花效果的代码实例
Feb 25 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
May 09 Python
python数据类型强制转换实例详解
Jun 22 Python
python连接mysql数据库并读取数据的实现
Sep 25 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
基于mysql的论坛(7)
2006/10/09 PHP
php入门之连接mysql数据库的一个类
2012/04/21 PHP
php预定义变量使用帮助(带实例)
2013/10/30 PHP
php伪静态之APACHE篇
2014/06/02 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
2016/11/14 PHP
laravel5.2实现区分前后台用户登录的方法
2017/01/11 PHP
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
2018/12/25 PHP
laravel框架添加数据,显示数据,返回成功值的方法
2019/10/11 PHP
在javascript中如何得到中英文混合字符串的长度
2014/01/17 Javascript
Javascript实现多彩雪花从天降散落效果的方法
2015/02/02 Javascript
javascript动画算法实例分析
2015/07/31 Javascript
JS+CSS实现仿雅虎另类滑动门切换效果
2015/10/13 Javascript
jQuery简单验证上传文件大小及类型的方法
2016/06/02 Javascript
JavaScript创建对象的四种常用模式实例分析
2019/01/11 Javascript
微信小程序云开发实现数据添加、查询和分页
2019/05/17 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
2019/08/27 Javascript
JS中类的静态方法,静态变量,实例方法,实例变量区别与用法实例分析
2020/03/14 Javascript
如何基于layui的laytpl实现数据绑定的示例代码
2020/04/10 Javascript
Ubuntu下创建虚拟独立的Python环境全过程
2017/02/10 Python
利用Python yagmail三行代码实现发送邮件
2018/05/11 Python
Python Opencv提取图片中某种颜色组成的图形的方法
2019/09/19 Python
浅谈tensorflow中张量的提取值和赋值
2020/01/19 Python
用于ETL的Python数据转换工具详解
2020/07/21 Python
CSS3实现自定义Checkbox特效实例代码
2017/04/24 HTML / CSS
HTML5 video视频字幕的使用和制作方法
2018/05/03 HTML / CSS
html5 canvas实现圆形时钟代码分享
2013/12/25 HTML / CSS
Servlet的生命周期
2013/08/25 面试题
建筑班组长岗位职责
2014/01/02 职场文书
合伙经营协议书
2014/04/18 职场文书
2014法院四风问题对照检查材料思想汇报
2014/10/04 职场文书
采购员岗位职责
2015/02/03 职场文书
音乐教师个人总结
2015/02/06 职场文书
2015年七夕爱情寄语
2015/03/24 职场文书
庆祝教师节主题班会
2015/08/17 职场文书
用基于python的appium爬取b站直播消费记录
2021/04/17 Python
浅谈MySQL 亿级数据分页的优化
2021/06/15 MySQL