文档章节

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
粉丝 91
博文 98
码字总数 132850
作品 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
一个简单的注册c函数到python的包装器

这几天继续研究了一下python,顺便看了一下如何注册c的函数到python,这方面网上的东西已经很多了,就不详细说明了。反正大概就是把要注册的函数写成 PyObject Fun(PyObject self, PyObject...

siddontang
2014/05/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7防火墙firewalld操作

firewalld Linux上新用的防火墙软件,跟iptables差不多的工具。 firewall-cmd 是 firewalld 的字符界面管理工具,firewalld是CentOS7的一大特性,最大的好处有两个:支持动态更新,不用重启服...

dingdayu
今天
1
0
关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
今天
2
0
Spring的Resttemplate发送带header的post请求

private HttpHeaders getJsonHeader() { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); ......

qiang123
昨天
3
0
Spring Cloud Gateway 之 Only one connection receive subscriber allowed

都说Spring Cloud Gateway好,我也来试试,可是配置了总是报下面这个错误: java.lang.IllegalStateException: Only one connection receive subscriber allowed. 困扰了我几天的问题,原来...

ThinkGem
昨天
26
0
学习设计模式——观察者模式

1. 认识观察者模式 1. 定义:定义对象之间一种一对多的依赖关系,当一个对象状态发生变化时,依赖该对象的其他对象都会得到通知并进行相应的变化。 2. 组织结构: Subject:目标对象类,会被...

江左煤郎
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部