函数式编程
函数式编程
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]
最后更新于
这有帮助吗?