函数式编程

函数式编程

  • Functional Programming, 又称函数程序设计, 泛函编程

  • 是一种编程泛型

  • 避免使用程序状态以及易变对象

  • 在Python中, 函数式编程主要由几个函数的使用构成: lambda(), map(), reduce(), filter().

lambda

用来定义行内函数.

map

假设有一个列表a = [1, 2, 3], 要给列表内每个元素都加2得到一个新列表.

### 使用列表解析
a = [1, 2, 3]
b = [i + 2 for i in a]
print(b)
# 输出
[3, 4, 5]

### 使用map函数
a = [1, 2, 3]
b = map(lambda x: x+2, a)    # 在python 3.x中, map函数仅仅是创建一个待运行的命令容器, 只有其他函数调用它时才会返回结果; 在python 2.x中直接返回结果
b = list(b)    # 在python 2.x中不需要这一步操作
print(b)
# 输出
[3, 4, 5]

### 另一个示例
a = [1, 2, 3]
b = [2, 3, 4, 7]
c = map(lambda x, y: x+y, a, b)
c = list(c)
print(c)
# 输出
[3, 5, 7]

我们首先定义一个函数, 然后再用map()将函数逐一应用到map列表中的每个元素, 最后返回一个数组.

使用map()的效率要高于使用列表解析. 因为, 列表解释本质上还是使用的python的for循环, 而Python的for循环效率不高; map函数循环速度相当于c语言.

reduce

reduce函数有点像map函数. map函数用于逐一遍历, 而reduce函数用于递归计算.

下面是一个计算n阶乘的例子.

### 使用reduce函数计算n的阶乘
n = 3
res = reduce(lambda x,y: x*y, range(1, n+1))
print(res)

# 输出
6

其中:

  • range(1, n+1)给出了一个列表, 元素是1-n这n个整数

  • lambda x, y: x*y 构造了一个二元函数, 返回两个参数的乘积

  • reduce函数将列表的前两个元素作为lambda函数的参数进行计算, 然后将计算结果与第三个元素再作为lambda函数的参数计算, 以此类推, 知道遍历列表所有元素, 返回最终结果

等同于:

n = 3
s = 1
for i in range(1, n+1):
    s = s * i

filter

过滤器, 用来筛选列表中符合条件的元素.例如:

b = filter(lambda x: x > 5 and x < 8, range(10))
b = list(b)

# 输出
[6, 7]

使用filter函数, 首先需要一个返回bool类型的函数, 如上: lambda x: x > 5 and x < 8, range(10), 该函数判断x是否满足限制条件, filter将函数作用到range(10)的每个元素, 挑选出使函数返回True的元素, 组成列表返回.

示例

为每个元素调用函数处理

#!/bin/python3
# coding: utf-8

"""
TEST
"""

__author__ = "bovenson"
__email__ = "[email protected]"
__date__ = "2017-12-18 14:59"


def show_f(o):
    print(o)


l = [1, 2, 3]
r = map(lambda x: x+2, l)
print(list(r))

r = map(lambda x: show_f(x), l)
print(list(r))

#### OUTPUT
[3, 4, 5]
1
2
3
[None, None, None]

最后更新于

这有帮助吗?