python函数式编程-偏向函数

Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial function)。要注意,这里的偏函数和数学意义上的偏函数不一样。

在介绍函数参数的时候,我们讲到,通过设定参数的默认值,可以降低函数调用的难度。而偏函数也可以做到这一点。举例如下:

int()函数可以把字符串转换为整数,当仅传入字符串时,int()函数默认按十进制转换:

>>> int(‘12345‘)
12345

int()函数还提供额外的base参数,默认值为10。如果传入base参数,就可以做N进制的转换:>>> int(‘12345‘, base=8

5349
>>> int(‘12345‘, 16)
74565

假设要转换大量的二进制字符串,每次都传入int(x, base=2)非常麻烦,于是,我们想到,可以定义一个int2()的函数,默认把base=2传进去:

def int2(x, base=2):
    return int(x, base)

这样,我们转换二进制就非常方便了:

>>> int2(‘1000000‘)
64
>>> int2(‘1010101‘)
85

functools.partial就是帮助我们创建一个偏函数的,不需要我们自己定义int2(),可以直接使用下面的代码创建一个新的函数int2

>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2(‘1000000‘)
64
>>> int2(‘1010101‘)
85

所以,简单总结functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。

注意到上面的新的int2函数,仅仅是把base参数重新设定默认值为2,但也可以在函数调用时传入其他值:

>>> int2(‘1000000‘, base=10)
1000000

最后,创建偏函数时,实际上可以接收函数对象、*args**kw这3个参数,当传入:

int2 = functools.partial(int, base=2)

实际上固定了int()函数的关键字参数base,也就是:

int2(‘10010‘)

相当于:

kw = { ‘base‘: 2 }
int(‘10010‘, **kw)

当传入:

max2 = functools.partial(max, 10)

实际上会把10作为*args的一部分自动加到左边,也就是:

max2(5, 6, 7)

相当于:

args = (10, 5, 6, 7)
max(*args)

结果为10

小结

当函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。

时间: 2024-10-05 14:37:09

python函数式编程-偏向函数的相关文章

1.python函数式编程-map函数

编程方法论 面向过程 函数式 面向对象 面向过程 将编程过程拆分成多个步骤,在函数中按照每个步骤进行编程: 函数式编程 编程语言定义的函数+数学意义的函数 1.不可变,不用变量保存状态,不修改变量: 2.第一类对象,函数即变量---------高阶函数:把函数当做参数传递给另外一个函数:返回值中包含函数.(装饰器) 3.尾调用:在函数的最后一步调用另外一个函数(最后一行不一定是函数的最后一步) 调用栈:在系统调用递归函数的时候不是最后一步(区别最后一行),则需要保留当前层的状态.如果是最后一步进

Python 函数式编程--返回函数

1.1   返回函数 1.1.1   函数作为返回值 >>> def lazy_sum(*args):    #可变参数 ...    def sum(): ...        ax = 0 ...        for i in args:    #调用外部函数的参数 ...             ax = ax + i ...        return ax ...    return sum       --这里返回的是个函数 ... >>> >>

Python 函数式编程--匿名函数Lambda

1.1   匿名函数 有些时候,不需要显式地定义函数,直接传入匿名函数更方便. >>> list(map(lambda x:x*x, (1, 2, 3, 4, 5))) [1, 4, 9, 16, 25] 冒号前面的x表示函数参数. 匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果. >>> f = lambda x: x * x >>> f(2) 4 >>> def build(x, y): ..

python函数式编程-返回函数

一:函数作为返回值 >>> def lazy_sum(*args): ... def sum(): ... ax = 0 ... for n in args: ... ax = ax + n ... return ax ... return sum ... >>> f=lazy_sum(1,2,3,4,5) >>> >>> f <function sum at 0x7fd1b3eccaa0> >>> f(

python函数式编程-匿名函数

>>> map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]) [1, 4, 9, 16, 25, 36, 49, 64, 81] 关键字lambda表示匿名函数,冒号前面的x表示函数参数. 匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果.

python之函数式编程与函数闭包

防伪码:忘情公子著 Python函数式编程: 函数式编程: 也称作泛函编程,是一种编程范型,说白了就是实现可以把函数当参数传递给另一个函数: 它将电脑运算视为数学上的函数计算,并且避免状态以及可变数据: 函数式编程语言最重要的基础是lambda演算,而且lambda演算的函数可以接受函数当作输入和输出 Python支持有限的函数式编程功能: filter(func,seq): 调用一个布尔函数func来迭代遍历每个seq中的元素:返回一个使func返回值为true的元素的序列 In [1]: d

Python进阶之函数式编程(把函数作为参数)

什么是函数式编程? 什么是函数式编程? 函数:function 函数式:functional,一种编程范式 函数式编程是一种抽象计算的编程模式 函数≠函数式,比如:计算≠计算机 在计算机当中,计算机硬件是最底层的,而越往上语言越高级 低--------------------------------->高计算机硬件-->汇编语言-->c语言-->Python语言 ↓ ↓ ↓ 指令 函数 函数式计算机------------------------>计算(数学) ○ 函数式编程

【人生苦短 Python当歌】——Python函数式编程01

对Python有一定了解的人应该知道,Python并不是一门函数式编程语言,而是一门支持多种范式的语言,这也使得在Python中也能实现函数式编程, 对于学习到Python函数式编程的朋友,在这里推荐大家看一本名字叫<Python函数式编程>(Functional Programming in Python)从这本书中你应该能收获不少: 怎么说呢,函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就把复杂的任务分解成简单的任务,这种就称为面向过程的程序设

深入浅出 Python 函数式编程

1.函数式编程的定义与由来 如果程序中的函数仅接受输入并产生输出,即输出只依赖于输入,数据不可变,避免保存程序状态,那么就称为函数式编程(Functional Programming,简称FP,又称泛函编程). 这种风格也称声明式编程(Declarative Programming),与之相对的是指令式编程(Imperative Programming),后者中的对象会不断修改自身状态.函数式编程强调程序的执行结果比执行过程更重要,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算