Functools模块之偏函数
1.偏函数是什么先回顾一下我们使用函数的过程 。 首先我们先定义一个函数 , 如
deffunc():print("infunc")然后我们调用这个函数 , 即执行代码 , 如
func()#将会打印出infunc接下来我们说一说偏函数 。
?搭噶好我是C哥 。
?假设我通过学习编程走上人生巅峰 , 腰缠万贯 , 接下来需要购置房产安家平天下 。 接下来我们的时间很宝贵 , 我不太可能把自己投入到看盘、选盘、议价、交定金、签合同、过户等耗费时间的事情上 。 此时我可能会考虑请一个房产中介来帮助完成这一系列事情 。
?所谓偏函数 , 通俗解释偏函数就是我们的一个房产中介 。 不管是我自己还是房产中介买房做的步骤其实都是一样 , 只是是中介花时间去完成的 。
这就好比有一个买房的函数
def为C哥买房(身份证,无房证明,单身证明):print("开始买房")如果是我们自己亲力亲为则需要这样调用
我.为C哥买房('身份证号码','证明房产的证据','证明单身的证据')2.使用方式?接下来我们来看看偏函数的使用方式 。 先回到故事 , 我先把买房操作需要的数据交给中介公司 , 然后由中介公司的一个员工替我执行这个买房操作即可 。
小张=中介公司('身份证号码','证明房产的证据','证明单身的证据')小张.为C哥买房()?所以仿函数其实就是一个代理 。 我们为了更简单的操作 , 可以使用仿函数代理帮我们去执行一段代码逻辑 , 当然这个功能所需的参数数据要求我们自己提供 , 总不能让中介用他的身份证给C哥买房吧哈哈哈 。
?言归正传 。 看看偏函数的用法 。
#1创建中介对象并给这个对象传参告诉他做什么事情需要哪些数据#partial对象函数代码入口(函数名)函数参数partial对象=functools.partial(func,*args,**keywords)#2让中介对象执行我们委托给他的任务partial对象()用法明确了 , 接下来我们看看具体代码 。
fromfunctoolsimportpartial#导入偏函数#定义操作defadd(number1,number2,number3):returnnumber1+number2+number3#定义偏partial函数对象p=partial(add,100,99,100)#调用partial对象执行功能print(p())#执行结果是299然而这并不是偏函数的所有使用方式 , 以上这种情况太理想 。 更加实际的情况是这样的 。
?首先回到故事 , 有可能C哥在委托中介的时候只委托了身份证并没有提供其他证明 , 那这时候小张去操作时就会缺少证明 。 所以当C哥去让小张进行买房操作时还应该补齐剩余所需的数据 。
?回到python代码 , 同理我们在创建偏函数对象时可以只传入一部分参数 , 在执行偏函数对象时再传入剩余部分的参数 。 (所谓partial就是部分的意思 , 多多理解这里部分的含义)
所以可能代码会变成这样
fromfunctoolsimportpartial#导入偏函数#定义操作defadd(number1,number2,number3):returnnumber1+number2+number3#定义偏partial函数对象p=partial(add,100,99)#调用partial对象执行功能print(p())#报错因为缺少一个必要的位置参数print(p(100))#执行结果是299print(p(101))#执行结果是3003.偏函数对象剖析?再次强调一下偏函数就是一个中介 , 中介帮我们执行委托的任务 , 并且要求我们提供任务相关数据 。
fromfunctoolsimportpartial#导入偏函数#定义操作defadd(number1,number2,number3):returnnumber1+number2+number3#定义偏partial函数对象p=partial(add,100,number2=99)#获取对象中保存的目标代码入口print(p.func)#print(add)##通过结果验证:当我们使用p(100)时会执行p对象的__call__方法导致执行p.func#如果想要查看partial对象相关参数print(p.args)#获取目标代码相关的位置参数(100,)print(p.keywords)#获取目标代码相关的关键字参数{'number2':99}?再次强调一下偏函数就是一个中介 , 中介帮我们执行委托的任务 , 并且要求我们提供任务相关数据 。
4.应用场景接下来咱们说一说偏函数在实际开发中的应用场景:
?偏函数可以提前给函数绑定一部分参数 , 在执行时再传入另一部分参数显得很简洁 。
比如我们有一个函数需要计算两个日期之间的天数 。
defgetDays(date1,date2):实现省略return间隔天数在很多情况下可能第一个参数就是一个固定的日期比如#求'2019-07-01',现在我想要计算这一天到'2050-01-01'以及的天数getDays('2019-07-01','2050-01-01')#求'2019-07-01'到'2020-01-01'以及的天数getDays('2019-07-01','2020-01-01')getDays('2019-07-01','2017-01-01')getDays('2019-07-01','2017-08-17')#如果有偏函数可以提前提供部分参数这么写即可fromfunctoolsimportpartialg1=partial(getDays,'2019-07-01')g1('2050-01-01')g1('2020-01-01')g1('2017-01-01')g1('2017-08-17')#如果起始日期需要变化g2=partial(getDays,'2018-09-08')g2('2050-01-01')g2('2020-01-01')g2('2017-01-01')g2('2017-08-17')而这样提供的语法便利是函数的默认参数所不能达到的 。
【Functools模块之偏函数】后期预告?functools模块之wraps函数?装饰器进阶
推荐阅读
- 汇智电子5Vdcdc显示器电源模块,微小功率定电圧输出,小型SIP封装!
- 隆翠三号|集模块化轻量化双层底结构干湿分离卫生间一体智能房车
- 红师文职人员招考|军队文职模块化面试中的军事元素
- 古雷|国内首台裂解炉整体模块平移800米安全就位
- 意法半导体和三垦电气开发智能电源模块
- 华为Mate 40 Pro拆解:每个部件几乎都是模块化
- 3号舰2甲板以上的新模块已经出现了?
- 水杯也玩模块化,大中小杯随意切换,冷热饮都能用
- 易车|宝马 i3 第 20 万辆下线 莱比锡工厂明年起将生产电池模块
- 未来|15式坦克,一款高度模块化的火力平台,未来还能开启主战坦克模式
