Python 偏函数用法全方位解析
Python的functools模块中有一种函数叫“偏函数”,自从接触它以来,发现确实是一个很有用且简单的函数,相信你看完这篇文章,你也有相见恨晚的感觉。
我们都知道,函数入参可以设置默认值来简化函数调用,而偏函数的作用就是将入参进行默认填充,降低函数使用的难度。
如int()函数,可以将字符型转换为整型,且默认的都是以十进制形式来转换,那为什么一定是十进制呢?如果想用以二进制的形式转换呢?其实我们可以看一下int函数它本身的定义
可以看到int有两种用法,可以传一个位置参数,还可以多传一个关键字参数base,也就是基于什么格式转换,默认不传base参数是以十进制转换。所以,用二进制形式转换的话只要base=2即可(见下方代码)
value = int('')
print(value) #
value = int('', base=2)
print(value) #
如果每次转换的字符串的时候都要输入base参数,显得很麻烦,因此偏函数的作用就体现出来了,可以使用functools.partial()函数来重新定义
from functools import partial int2 = partial(int, base=2)
res = int2('')
print(res) #
到这里,你应该已经感觉到了偏函数的一点点魅力吧,那我们再从多个角度进一步看透它。
- 自定义函数的使用
1 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)) #
print(sum10()) #
按上述理解,没有指定默认参数时,默认赋给第一个参数,那么第一个参数永远是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命令行参数解析OptionParser类用法实例
python命令行参数解析OptionParser类用法实例 本文实例讲述了python命令行参数解析OptionParser类的用法,分享给大家供大家参考. 具体代码如下: from opt ...
- python argparse用法总结
转:python argparse用法总结 1. argparse介绍 argparse是python的一个命令行解析包,非常适合用来编写可读性非常好的程序. 2. 基本用法 prog.py是我在li ...
- julia与python中的列表解析.jl
julia与python中的列表解析.jl #=julia与python中的列表解析.jl 2016年3月16日 07:30:47 codegay julia是一门很年轻的科学计算语言 julia文档 ...
- python 解析XML python模块xml.dom解析xml实例代码
分享下python中使用模块xml.dom解析xml文件的实例代码,学习下python解析xml文件的方法. 原文转自:http://www.jbxue.com/article/16587.html ...
- iOS push全方位解析(二)【译文】"——生成OpenSSL证书,Provisioning Profile
这是一篇来自raywenderlich的教程,内容翔实!结构简单透彻.讲解循序渐进.文章质量上乘!是一篇难的的博文!使用半瓶的英语水平翻译了一下: 1.[iOS push全方位解析](一) push的 ...
- C# yield return 用法与解析
原文:C# yield return 用法与解析 C# yield return 用法与解析 本文参考自:http://www.jb51.net/article/54810.htm 当初没有认真理解 ...
- AFNetworking 使用总结 (用法+JSON解析)
« AFNetworking 图片的本地缓存问题 Get application bundle seed ID in iOS » AFNetworking 使用总结 (用法+JSON解析) Fr ...
- jquery.cookie用法详细解析,封装的操作cookie的库有jquery.cookie.js
jquery.cookie用法详细解析 需要注意存入cookie前,对数据进行序列化, 得到后在反序列化: 熟练运用:JSON.stringify();和JSON.parse(): 通常分为如下几个步 ...
- Python 迭代器和列表解析
Python 迭代器和列表解析 1)迭代器 一种特殊的数据结构,以对象形式存在 >>> i1 = l1.__iter__() >>> i1 = iter(l1) 可 ...
随机推荐
- 多用户vps管理面板怎么安装,有没有好用的vps管理工具
一.VPS安装VPSMate控制面板步骤 1.使用SSH连接到VPS.使用命令获取VPSMate安装包: wget http://www.vpsmate.org/tools/install.py ...
- [Python3]星号*的打开方式
python中,* 号除了用来做数量乘法,还有其他的用处. 结论 概括的来说,就是对修饰的变量进行拆分, 对修饰的形式参数进行参数聚集. 单*号,将被修饰的变量按元素方式拆分, 对修饰的形式参数进行参 ...
- jchdl - GSL实例 - MulC2(有符号数的乘法)
这里的实现,先把符号位取出来,使用两个正数相乘,然后在把符号加到乘积上. 参考链接 https://github.com/wjcdx/jchdl/blob/master/src/org/jch ...
- (Java实现) 蓝桥杯 国赛 重复模式
标题:重复模式 作为 drd 的好朋友,技术男 atm 在 drd 生日时送给他一个超长字符串 S .atm 要 drd 在其中找出一个最长的字符串 T ,使得 T 在 S 中至少出现了两次,而他想说 ...
- Java实现 蓝桥杯VIP 算法训练 和为T
问题描述 从一个大小为n的整数集中选取一些元素,使得它们的和等于给定的值T.每个元素限选一次,不能一个都不选. 输入格式 第一行一个正整数n,表示整数集内元素的个数. 第二行n个整数,用空格隔开. 第 ...
- Java实现 LeetCode 283 移动零
283. 移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序. 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必 ...
- Java实现蓝桥杯VIP算法训练 相邻字母
试题 算法训练 相邻字母 资源限制 时间限制:1.0s 内存限制:256.0MB [问题描述] 从键盘输入一个英文字母,要求按字母的顺序打印出3个相邻的字母,指定的字母在中间.若指定的字母为Z,则打印 ...
- Java实现 蓝桥杯VIP 算法提高 复数求和
算法提高 复数求和 时间限制:1.0s 内存限制:512.0MB 从键盘读入n个复数(实部和虚部都为整数)用链表存储,遍历链表求出n个复数的和并输出. 样例输入: 3 3 4 5 2 1 3 样例输出 ...
- Java实现第九届蓝桥杯耐摔指数
耐摔指数 题目描述 x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机. 各大厂商也就纷纷推出各种耐摔型手机.x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后 ...
- ClickHouse基本操作(一)
常用SQL 创建表 1 2 3 4 5 6 7 CREATE TABLE b6logs( eventDate Date, impid UInt64, uid String, idfa String, ...