详细介绍Python中的偏函数


Posted in Python onApril 27, 2015

Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial function)。要注意,这里的偏函数和数学意义上的偏函数不一样。

在介绍函数参数的时候,我们讲到,通过设定参数的默认值,可以降低函数调用的难度。而偏函数也可以做到这一点。举例如下:

int()函数可以把字符串转换为整数,当仅传入字符串时,int()函数默认按十进制转换:

>>> int('12345')
12345

但int()函数还提供额外的base参数,默认值为10。如果传入base参数,就可以做N进制的转换:

>>> int('12345', base=8)
5349
>>> int('12345', 16)
74565

假设要转换大量的二进制字符串,每次都传入int(x, base=2)非常麻烦,于是,我们想到,可以定义一个int2()的函数,默认把base=2传进去:

def int2(x, base=2):
  return int(x, base)

这样,我们转换二进制就非常方便了:

>>> int2('1000000')
64
>>> int2('1010101')
85

functools.partial就是帮助我们创建一个偏函数的,不需要我们自己定义int2(),可以直接使用下面的代码创建一个新的函数int2:

>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85

所以,简单总结functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。

注意到上面的新的int2函数,仅仅是把base参数重新设定默认值为2,但也可以在函数调用时传入其他值:

>>> int2('1000000', base=10)
1000000

最后,创建偏函数时,实际上可以接收函数对象、*args和**kw这3个参数,当传入:

int2 = functools.partial(int, base=2)

实际上固定了int()函数的关键字参数base,也就是:

int2('10010')

相当于:

kw = { base: 2 }
int('10010', **kw)

当传入:

max2 = functools.partial(max, 10)

实际上会把10作为*args的一部分自动加到左边,也就是:

max2(5, 6, 7)

相当于:

args = (10, 5, 6, 7)
max(*args)

结果为10。
小结

当函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。

Python 相关文章推荐
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
Sep 26 Python
python高阶爬虫实战分析
Jul 29 Python
python+numpy+matplotalib实现梯度下降法
Aug 31 Python
python3.6使用urllib完成下载的实例
Dec 19 Python
Python基于Logistic回归建模计算某银行在降低贷款拖欠率的数据示例
Jan 23 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
Feb 22 Python
Django为窗体加上防机器人的验证码功能过程解析
Aug 14 Python
基于python3监控服务器状态进行邮件报警
Oct 19 Python
Python帮你识破双11的套路
Nov 11 Python
Python 如何创建一个线程池
Jul 28 Python
Scrapy爬虫文件批量运行的实现
Sep 30 Python
python ansible自动化运维工具执行流程
Jun 24 Python
举例讲解Python中装饰器的用法
Apr 27 #Python
Python中的匿名函数使用简介
Apr 27 #Python
Python中用函数作为返回值和实现闭包的教程
Apr 27 #Python
Python中利用sorted()函数排序的简单教程
Apr 27 #Python
Python中的filter()函数的用法
Apr 27 #Python
Python中的map()函数和reduce()函数的用法
Apr 27 #Python
PyMongo安装使用笔记
Apr 27 #Python
You might like
PHP禁止页面缓存的代码
2011/10/23 PHP
jquery提示 "object expected"的解决方法
2009/12/13 Javascript
defer属性导致引用JQuery的页面报“浏览器无法打开网站xxx,操作被中止”错误的解决方法
2010/04/27 Javascript
JavaScript 笔记二 Array和Date对象方法
2010/05/22 Javascript
最短的IE判断代码
2011/03/13 Javascript
用js获取电脑信息(是使用与IE浏览器)
2013/01/15 Javascript
12种不宜使用的Javascript语法整理
2013/11/04 Javascript
js setTimeout()函数介绍及应用以倒计时为例
2013/12/12 Javascript
javascript伸缩菜单栏实现代码分享
2015/11/12 Javascript
学习JavaScript设计模式之代理模式
2016/01/12 Javascript
JavaScript每天必学之数组和对象部分
2016/09/17 Javascript
AngularJS  双向数据绑定详解简单实例
2016/10/20 Javascript
AngularJS学习笔记(三)数据双向绑定的简单实例
2016/11/08 Javascript
jQuery is not defined 错误原因与解决方法小结
2017/03/19 Javascript
jQuery制作input提示内容(兼容IE8以上)
2017/07/05 jQuery
解决vue.js在编写过程中出现空格不规范报错的问题
2017/09/20 Javascript
Node.js使用MySQL连接池的方法实例
2018/02/11 Javascript
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
2019/03/02 NodeJs
vue+egg+jwt实现登录验证的示例代码
2019/05/18 Javascript
ajax跨域访问遇到的问题及解决方案
2019/05/23 Javascript
VUE UPLOAD 通过ACTION返回上传结果操作
2020/09/07 Javascript
[59:07]海涛为你详解DOTA2新版本“贤哲秘契”
2014/11/22 DOTA
使用70行Python代码实现一个递归下降解析器的教程
2015/04/17 Python
python调用Delphi写的Dll代码示例
2017/12/05 Python
Python应用库大全总结
2018/05/30 Python
对python中的乘法dot和对应分量相乘multiply详解
2018/11/14 Python
python3+selenium自动化测试框架详解
2019/03/17 Python
代码实例讲解python3的编码问题
2019/07/08 Python
IE兼容css3圆角的实现代码
2011/07/21 HTML / CSS
45个非常奇妙的CSS3 特性应用示例
2012/01/01 HTML / CSS
美国环保婴儿用品公司:The Honest Company
2017/11/23 全球购物
意大利时尚精品店:Nugnes 1920
2020/02/10 全球购物
三好学生事迹材料
2014/12/24 职场文书
中学团支部工作总结
2015/08/13 职场文书
Django REST framework 限流功能的使用
2021/06/24 Python
mysql全面解析json/数组
2022/07/07 MySQL