python函数式编程:apply, map, lambda和偏函数

时间:2021-08-07 18:39:14

http://blog.csdn.net/pipisorry/article/details/38687763

Python 不是也不大可能会成为一种函数式编程语言,但是它支持许多有价值的函数式编程语言构建。也有些表现得像函数式编程机制但是从传统上也不能被认为是函数式编程语言的构建。Python提供的以 4 种内建函数和 lambda 表达式的形式出现。

内建函数 apply()、filter()、map()、reduce()。但是列表的综合使用的引入,部分被摈弃。

匿名函数与 lambda

偏函数应用

[Python核心编程2ed.pdf]

皮皮Blog


python 匿名函数与 lambda表达式

除非赋值给一个局部变量,这样的对象也不会在任何的名字空间内创建名字.)

一个完整的 lambda“语句”代表了一个表达式,这个表达式的定义体必须和声明放在同一行。我们现在来演示下匿名函数的语法:
lambda [arg1[, arg2, ... argN]]: expression

lambda只是一个表达式,函数体比def简单很多。

lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。

lambda表达式是起到一个函数速写的作用。允许在代码内嵌入一个函数的定义。

lambda 表达式返回可调用的函数对象。

例子:

python函数式编程:apply, map, lambda和偏函数

[Python中lambda表达式学习]

皮皮Blog



apply函数

apply(func[, nkw][, kw])

在python1.6 中有效的摈弃了 apply()。 这个函数将来会逐步淘汰,在未来版本中最终会消失。

皮皮Blog



map函数

map大多数的for循环可以用map来代替,用法是:map(func,seq),对seq中的每个元素进行操作,具体什么操作在func里定义。
我们以前是这么写for循环的:
array = [1, 2, 3]
square_array = []
for i in array:
    square_array.append(i ** 2)

改用map:
array = [1, 2, 3]
square_array = map(lambda i: i ** 2, array)

map的第一个参数是lambda表达式,冒号前面的i作为形参,来自于array中的元素,冒号后面就是要返回的值。
当然你也可以使用列表推导式来代替:
array = [1, 2, 3]
square_array = [i ** 2 for i in array]

皮皮Blog


filter函数

filter用法与map类似:filter(func,seq),对seq中的元素进行过滤,返回符合条件的那些元素。
比如返回array = [1, 2, 3, 4]中的所有奇数:
print filter(lambda i: i % 2, array)
这里是对2取余,返回结果为True的元素。那么什么情况下结果为True?Python里面不为0,None或者null都是True。所以结果就是,偶数是False,奇数是True,返回所有奇数。
列表推导式方案:
print [i for i in array if i % 2 != 0]

皮皮Blog


reduce函数

reduce用法:reduce(func,seq),对seq中的每个元素进行func操作,最后汇总返回一个值。
求array = [1, 2, 3]所有元素的和:
print reduce(lambda x, y: x + y, array)
reduce会先将array里面的头两个数分别作为x和y,求它们的和,然后把它的结果和第三个相加,再把结果和第四个相加,直到最后一个元素。
求array = [1, 2, 3]中的最大值:
print reduce(lambda x, y: x if x > y else y, array)
求strings = ["abc", "abcd", "def"]中”abc”出现的总次数:
print reduce(lambda count, str: count + str.count("abc"), strings, 0)
第三个参数0是count的初始值。


偏函数与闭包

偏函数

闭包[python变量及其作用域,闭包 ]

from:http://blog.csdn.net/pipisorry/article/details/38687763

ref: