functools 之 partial(偏函数)
当函数的参数个数太多,需要简化时,使用functools.partial
可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。当然,decorator(装饰器) 也可以实现,如果,我们嫌麻烦的话。
我们借助Python的help帮助函数,简单了解下什么是partial(偏函数):
这里我们主要说下紫色圈的意思:
partial 一共有三个部分:
(1)第一部分也就是第一个参数,是一个函数,这个函数可以是你定义的,也可以是Python内置函数
(2)第二部分是一个可变参数,*args,比如内置函数max的参数就是一个可变参数,max(1,2,3,4,5)=5
(3)第三部分是一个关键字参数,比如内置函数int的第二个参数就是命名关键字参数,默认base=10,表示int转换时默认是10进制的:
所以:
partial函数的作用就是:将所作用的函数作为 partial() 函数的第一个参数,原函数的各个参数依次作为 partial() 函数的后续参数,原函数有关键字参数的一定要带上关键字,没有的话,按原有参数顺序进行补充。
举例说明:
1. 参数一层一层传
from functools import partial def my_sum(a, b):
print("a=", a)
print("b=", b)
return a + b # 偏函数的第一个参数是 作用函数(my_sum)
# 偏函数的第二个参数是 传给作用函数的第一个参数(a)
# 偏函数的第三个参数是 传给作用函数的第三个参数(b)
new_my_sum = partial(my_sum, 10) # 相当于: new_my_sum = my_sum(10, b) 位置传参轮到a了, a=10
res = new_my_sum(20) # 相当于: res = my_sum(10, 20) 位置传参轮到b了, b=20 print("res=", res) # 结果:
# a= 10
# b= 20
# res= 30
2. 参数一次性传进去
from functools import partial def my_sum(a, b):
print("a=", a)
print("b=", b)
return a + b # 偏函数的第一个参数是 作用函数(my_sum)
# 偏函数的第二个参数是 传给作用函数的第一个参数(a)
# 偏函数的第三个参数是 传给作用函数的第三个参数(b)
new_my_sum = partial(my_sum, 10, 20) # 相当于: new_my_sum = my_sum(10, b) 位置传参轮到a了, a=10; 轮到b了, b=20
res = new_my_sum() # 相当于: res = my_sum(10, 20) print("res=", res) # 结果:
# a= 10
# b= 20
# res= 30
3. 关键字传参(1)
from functools import partial def my_sum(a, b):
print("a=", a)
print("b=", b)
return a + b # 偏函数的第一个参数是 作用函数(my_sum)
# 偏函数的第二个参数是 传给作用函数的第一个参数(a)
# 偏函数的第三个参数是 传给作用函数的第三个参数(b) # 注意: 这里的关键字传参,传给的是后边的b,前边的a未指定关键字,没有报错,正常,因为按照形参a和b的位置来看,关键字参数要在位置参数之后
new_my_sum = partial(my_sum, b=10) # 相当于: new_my_sum = my_sum(a, 10) 关键字传参,传给了b, b=10
res = new_my_sum(20) # 相当于: res = my_sum(20, 10) b有了实参,剩下a,所以传给了a, a=20 print("res=", res) # 结果:
# a= 20
# b= 10
# res= 30
4. 关键字传参(2)
from functools import partial def my_sum(a, b):
print("a=", a)
print("b=", b)
return a + b # 偏函数的第一个参数是 作用函数(my_sum)
# 偏函数的第二个参数是 传给作用函数的第一个参数(a)
# 偏函数的第三个参数是 传给作用函数的第三个参数(b) # 注意: 这里的关键字传参,传给的是前边的a,后边的b未指定关键字,就会报错,因为按照形参a和b的位置来看,关键字参数要在位置参数之后,也就是说,a指定了,b也必须指定就可以了
new_my_sum = partial(my_sum, a=10) # 相当于: new_my_sum = my_sum(10, b) 关键字传参,传给了a, a=10
res = new_my_sum(20) # 相当于: res = my_sum(10, 20) a有了实参,剩下b,所以想要传给b, b=20,但是违反了关键字参数在位置参数之后原则,所以报错 print("res=", res) # 结果:
# TypeError: my_sum() got multiple values for argument 'a'
本文参考:
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143184474383175eeea92a8b0439fab7b392a8a32f8fa000 (偏函数和装饰器的对比)
https://blog.csdn.net/appleyk/article/details/77609114 (偏函数)
functools 之 partial(偏函数)的更多相关文章
- python中 functools模块 闭包的两个好朋友partial偏函数和wraps包裹
前一段时间学习了python当中的装饰器,主要利用了闭包的原理.后来呢,又见到了python当中的functools模块,里面有很多实用的功能.今天我想分享一下跟装饰器息息相关的两个函数partial ...
- functools.partial偏函数的使用
https://docs.python.org/3.6/library/functools.html 从名字可以看出,该函数的作用就是部分使用某个函数,即冻结住某个函数的某些参数,让它们保证为某个值, ...
- 从源码带你看懂functools的partial方法
1.what? partial是什么, partial也叫偏函数.源码的描述是: 部分应用给定参数和关键字的新函数. New function with partial application of ...
- python:functools之partial
示例:from operator import addimport functoolsprint add(1,2) #3add1 = functools.partial(add,1)print add ...
- 装饰器的修复wraps,偏函数partial 以及chain
将被装饰的函数的一些属性值赋值给 装饰器函数,最终让属性的显示更符合我们的直觉. from functools import wraps def wapper(func): @wraps(func) ...
- gj13 asyncio并发编程
13.1 事件循环 asyncio 包含各种特定系统实现的模块化事件循环 传输和协议抽象 对TCP.UDP.SSL.子进程.延时调用以及其他的具体支持 模仿futures模块但适用于事件循环使用的Fu ...
- TCP协议粘包问题详解
TCP协议粘包问题详解 前言 在本章节中,我们将探讨TCP协议基于流式传输的最大一个问题,即粘包问题.本章主要介绍TCP粘包的原理与其三种解决粘包的方案.并且还会介绍为什么UDP协议不会产生粘包. 基 ...
- Python partial function 偏函数
Partial function 偏函数是将所要承载的函数作为partial()函数的第一个参数,原函数的各个参数依次作为partial()函数后续的参数,除非使用关键字参数. 当函数的参数个数太多, ...
- 偏函数应用(Partial Application)和函数柯里化(Currying)
偏函数应用指的是固化函数的一个或一些参数,从而产生一个新的函数.比如我们有一个记录日志的函数: 1: def log(level, message): 2: print level + ": ...
随机推荐
- 刘志梅201771010115.《面向对象程序设计(java)》第十七周学习总结
实验十七 线程同步控制 实验时间 2018-12-10 1.实验理论知识 多线程 多线程是进程执行过程中产生的多条执行线索.进程 线程是比进程执行更小的单位.线程不能独立存在,必须存在于 ...
- dubbo 调用服务超时
先贴出错误报告: Failed to invoke the method *** in the service ***. Tried times of the providers [] (/) on ...
- Shiro的FormAuthenticationFilter登陆成功不跳转
http://jinnianshilongnian.iteye.com/blog/2024723 张开涛的这个配置信息有误,导致默认authc登陆成功后无法跳转 FormAuthenticationF ...
- (转)SQLServer_十步优化SQL Server中的数据访问 三
原文地址:http://tech.it168.com/a2009/1125/814/000000814758_all.shtml 第六步:应用高级索引 实施计算列并在这些列上创建索引 你可能曾经写过从 ...
- python3csv与xlsx文件操作模块(csv、xlsxwriter)
一.csv模块实现csv文件操作 1.CSV介绍 CSV,全称为Comma-Separated Values,它以逗号分隔值,其文件以纯文本形式存储表格数据,该文件是一个字符序列,可以由任意数目的记录 ...
- C#绘图:带背景,拖鼠标画矩形和直线
基于 Visual Studio 2012 .net framework 4.5 效果截图: 代码: https://download.csdn.net/download/talkwah/104828 ...
- java-索引
集合 集合之深入理解HashMap HashMap的实现原理,以及在JDK1.7和1.8的区别 Java集合---ConcurrentHashMap原理分析 ConcurrentHashMap原理分析 ...
- mongo 数据查询
基本查询 方法find():查询 db.集合名称.find({条件文档}) 方法findOne():查询,只返回第一个 db.集合名称.findOne({条件文档}) 方法pretty():将结果格式 ...
- gflags 学习
一.下载 https://github.com/gflags/gflags 二.可以将gflags编译成lib 三.在需要的工程的workspace下面引入编译好的gflags动态库,在库里面写好BU ...
- Boost - 从Coroutine2 到Fiber
Boost - 从Coroutine2 到Fiber 协程引子 我开始一直搞不懂协程是什么,网上搜一搜,(尤其是Golang的goroutine)感觉从概念上听起来有点像线程池,尤其是类似Java的E ...