文档章节

Python的偏函数应用

lionets
 lionets
发布于 2013/11/26 21:55
字数 517
阅读 348
收藏 2

在使用函数的时候,偶尔会遇到这种情况:某个函数带 n 个参数,但在重复使用的过程中,实际只有其中少数几个参数会不同,其他参数的值都是一样的。那么如何可以在多次使用这种函数时,减少输入重复参数的次数或干脆避免输入这些参数呢?

答案之一是使用默认参数。拿我们常用的 int() 函数举例,当我们使用 help() 查看该函数时,可以看到它的使用说明是酱紫的:

int(x=0) –> integer

int(x, base=10) –> integer

可见 int() 函数有一个用法是可以设定传递进来的字符串参数 x 的进制,而且其值默认为 10(当设定了base参数时,x 必须是基于 base 进制的字符串) 。这就避免了我们重复输入,而且 base = 10 确实是最常用的一个值。但,如果在某个情景下我们需要 base = 2 呢?也许我们可以这样重新包装一个函数 baseTwo(本函数不对输入做检查,全权交给 int() 来做):

def baseTwo(x):
    return int(x,base=2)
	
	
>>> int('10010',base=2)
18
>>> baseTwo('10010')
18

看起来没错,不过 Python 有更简单直观的实现路径,就是本篇的主题:偏函数应用(PFA)。这种函数可以固化一个多参函数的若干参数,并返回带有剩余参数的函数对象,听起来就像数学里的偏函数。它也可以被看作是柯里化(currying)的一种泛化形式。它通过 functools 模块下的 partial() 函数来实现。该函数的用法是这样的:

partial(func, *args, **keywords)     #  *args代表非关键字参数,**keywords代表关键字参数,不过为了避免出错,除非你明确知道 func 函数的参数顺序,否则应该尽量使用关键字参数

使用 partial() 来写上面的栗子是这样的:

from functools import partial

baseTwo = partial(int,base=2)


>>> baseTwo('10010')
18

© 著作权归作者所有

共有 人打赏支持
lionets
粉丝 90
博文 101
码字总数 135303
作品 0
朝阳
程序员
私信 提问
每周一个 Python 模块 | functools

functools 是 Python 中很简单但也很重要的模块,主要是一些 Python 高阶函数相关的函数。 该模块的内容并不多,看 官方文档 也就知道了。 说到高阶函数,这是函数式编程范式中很重要的一个概...

yongxinz
11/12
0
0
无需深度学习框架,如何从零开始用Python构建神经网络

  选自TowardsDataScience   作者:James Loy   机器之心编译   参与:陈韵竹、王淑婷      这是一份用于理解深度学习内部运作方式的初学者指南。作者根据自己从零开始学习用 Py...

机器之心
05/26
0
0
10分钟快速入门Python函数式编程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/82117264 作者 | Brandon Skerritt 译者 | 王天宇、琥珀 编辑 | 琥珀 出品...

AI科技大本营
08/27
0
0
【翻译】Sklearn与TensorFlow机器学习实用指南 —— 附录 C、SVM 对偶问题

为了理解对偶性,你首先得理解拉格朗日乘子法。它基本思想是将一个有约束优化问题转化为一个无约束优化问题,其方法是将约束条件移动到目标函数中去。让我们看一个简单的例子,例如要找到合适...

技术小能手
07/12
0
0
基于编程人员Python学习第一章节

基于廖雪峰的python零基础学习后,自我总结。适用于有一定基础的编程人员,对我而言,则是基于.net已有方面,通过学习,记录自我觉得有用的地方,便于后续回顾。 主要以快速定位内容,通过直...

Aikenwu
08/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

崛起于Springboot2.X之通讯WebSocket(40)

技术简介:Springboot2.0.3+freemaker+websocket 1、添加pom依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-bo......

木九天
15分钟前
1
0
Java常用四大线程池用法以及ThreadPoolExecutor详解

为什么用线程池? 1.创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处-理效率 2.线程并发数量过多,抢占系统资源从而导致阻塞 3.对线程进行一些简单的管理 在Java中...

孟飞阳
17分钟前
1
0
Netty+Websocket 实现一个简易聊天室

后台代码 /** * 服务端 */public class ChatServer {public static void main(String[] args) throws Exception {int port=8080; //服务端默认端口new ChatServer().bind...

这很耳东先生
19分钟前
2
0
一个本科学生对Linux的认知

我是一名大三的普通一本大学的软件工程的一名学生,学校开设了一些关于系统开发的课程,纸上得来终觉浅,学校的课程课时较短,想要在56个课时之内学会一些公司需要的技能,无疑是纸上谈兵,一...

linuxprobe16
20分钟前
1
0
如何选择开源许可证?

如何为代码选择开源许可证,这是一个问题。 世界上的开源许可证,大概有上百种。很少有人搞得清楚它们的区别。即使在最流行的六种----GPL、BSD、MIT、Mozilla、Apache和LGPL----之中做选择,...

吴伟祥
22分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部