解析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字符串方法的简单使用
Jul 18 Python
python编程实现希尔排序
Apr 13 Python
Django admin实现图书管理系统菜鸟级教程完整实例
Dec 12 Python
python+opencv实现动态物体追踪
Jan 09 Python
详解Pytorch 使用Pytorch拟合多项式(多项式回归)
May 24 Python
解决安装pycharm后不能执行python脚本的问题
Jan 19 Python
python开发准备工作之配置虚拟环境(非常重要)
Feb 11 Python
python实现Excel文件转换为TXT文件
Apr 28 Python
Pycharm 2020年最新激活码(亲测有效)
Sep 18 Python
Python实现钉钉订阅消息功能
Jan 14 Python
matplotlib 三维图表绘制方法简介
Sep 20 Python
Python爬取奶茶店数据分析哪家最好喝以及性价比
Sep 23 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 Coding Tips(php小技巧)[2011/04/02最后更新]
2011/05/02 PHP
php异常:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE  eval()'d code error
2011/05/19 PHP
php smarty截取中文字符乱码问题?gb2312/utf-8
2011/11/07 PHP
php后门URL的防范
2013/11/12 PHP
PHP执行linux命令常用函数汇总
2016/02/02 PHP
PHP attributes()函数讲解
2019/02/03 PHP
JavaScript 学习笔记(六)
2009/12/31 Javascript
JavaScript 滚轮事件使用说明
2010/03/07 Javascript
javascript 单例/单体模式(Singleton)
2011/04/07 Javascript
浅析JS中document对象的一些重要属性
2014/03/06 Javascript
BAT及各大互联网公司2014前端笔试面试题--JavaScript篇
2014/10/29 Javascript
jQuery中width()方法用法实例
2014/12/24 Javascript
jQuery实现在列表的首行添加数据
2015/05/19 Javascript
JavaScript中的substr()方法使用详解
2015/06/06 Javascript
javascript自动切换焦点控制效果完整实例
2016/02/02 Javascript
Javascript中的几种继承方式对比分析
2016/03/22 Javascript
酷! 不同风格页面布局幻灯片特效js实现
2021/02/19 Javascript
AngularJS 视图详解及示例代码
2016/08/17 Javascript
js多个物体运动功能实例分析
2016/12/20 Javascript
Ajax 加载数据 练习代码
2017/01/05 Javascript
JS 组件系列之 bootstrap treegrid 组件封装过程
2017/04/28 Javascript
vue2.0 自定义日期时间过滤器
2017/06/07 Javascript
element form 校验数组每一项实例代码
2019/10/10 Javascript
VUEX采坑之路之获取不到$store的解决方法
2019/11/08 Javascript
用Python输出一个杨辉三角的例子
2014/06/13 Python
Python实现连接postgresql数据库的方法分析
2017/12/27 Python
Python 3.6 读取并操作文件内容的实例
2018/04/23 Python
Python Matplotlib库安装与基本作图示例
2019/01/09 Python
深入解析神经网络从原理到实现
2019/07/26 Python
使用Python完成15位18位身份证的互转功能
2019/11/06 Python
Python爬虫简单运用爬取代理IP的实现
2020/12/01 Python
HTML5表格_动力节点Java学院整理
2017/07/11 HTML / CSS
基于html5绘制圆形多角图案
2016/04/21 HTML / CSS
经济信息系毕业生自荐信范文
2014/03/15 职场文书
在校证明模板
2015/06/17 职场文书
python 中的jieba分词库
2021/11/23 Python