Python之函数式编程
函数式编程的特点就是允许把函数本身作为参数传入另一个函数,还允许返回一个函数。
python 中函数式编程主要用到下面 4 个基础函数:
(1)、map()
(2)、reduce()
(3)、filter()
(4)、sorted()
还有一个匿名函数 lambda()往往和它们配合使用。
# 一、map
map()函数常见的调用方式如下:
map(function, interable)
map()函数中的两个参数是必填的,其中第一个参数是一个函数名或匿名函数,第二个参数是一个可迭代对象,如列表、元组等。
map()函数实现的功能就是把 interable 中的元素依次传入 function 中执行并返回结果,在 python2.x 中是将结果组成一个新的 list 返回,在 python3.x 中是返回一个 map 对象,要取得 map 对象里得内容可以用 list()方法,也可以通过循环遍历。
如下例子(python3):
>>> map(lambda x: x*2, [1,2,3,4,5])
<map object at 0x0000013D497E92E8>
>>> list(map(lambda x: x*2, [1,2,3,4,5]))
[2, 4, 6, 8, 10]
>>> for i in map(lambda x: x*2, [1,2,3,4,5]):
... print(i)
...
2
4
6
8
10
>>>
2
3
4
5
6
7
8
9
10
11
12
13
当然,map()还是可以传入多个 interable 对象,如下:
>>> list(map(lambda x,y: x+y, [1,2,3,4,5], [6,7,8,9,10]))
[7, 9, 11, 13, 15]
>>>
2
3
在传入多个 interable 对象的时候,首先你的函数体的接受多个参数,比如传入上面例子,传入两个 interable 对象,函数的接受参数也是两个,即 x,y。当传入多个 interable 对象的时候,函数是依次从 interable 对象中取值,然后组成一个新的元组,最后将元组传个 function,如上例子,第一次取(1,6)传入 function 得出结果 7,第二次取(2,7)得出结果 9,依次类推。
# 二、reduce
在 python3 中,reduce()已经从全局名字空间里移除了,它现在被放在functools模块中了,要使用需要先导入模块,reduce()函数常见的调用方式如下:
from functools import reduce
reduce(function, interable)
2
其中第一个参数是一个函数名或匿名函数,第二个参数是一个可迭代对象,第三个参数是一个初始值(可选参数),它的功能是返回函数的计算结果。如下:
>>> from functools import reduce
>>> reduce(lambda x,y: x+y, [1,2,3,4,5])
15
>>> reduce(lambda x,y: x*y, [1,2,3,4,5])
120
>>> reduce(lambda x,y: x*y, [1,2,3,4,5],100)
12000
2
3
4
5
6
7
reduce()的工作原理是,依次取 interable 对象中的一个元素,和上次的结果做计算,最后返回结果。如果没有传入默认参数,那么第一次计算的时候第一个参数作为结果,从第二个参数开始传值。如果有默认参数,那么直接从第一个参数和默认值进行计算,依次下去。
# 三、filter
filter()函数的调用格式如下:
filter(function, iterable)
filter()函数的两个参数,第一个是函数名或者匿名函数,第二个是可迭代对象,比如列表等。filer()函数和 map()函数比较类似,都是依次从 interable 对象中取值传入 function 中计算的出结果,不同的是 filter()函数会判断每次执行结果的 bool 值,并只将 bool 值为 True 的筛选出来,在 python2 中依然返回的是一个列表,在 python3 中返回的是一个 filter 对象,获取里面的值可以用 list()方法和循环等。如下:
>>> list(filter(lambda x: x/2, [1,2,3,4,5]))
[1, 2, 3, 4, 5]
>>> list(filter(lambda x: x%2, [1,2,3,4,5]))
[1, 3, 5]
>>>
2
3
4
5
# 四、sorted
sorted()函数的调用方式如下:
sorted(iterable, key=None, reverse=False)
参数说明如下:
interable,是一个可迭代对象,比如列表,元组等;
key,主要是用来比较的元素,只是一个参数,具体的参数是取自可迭代对象中,指定可迭代对象中一个元素来进行排序;
reverse,排序规则,reverse=True 表示降序,reverse=False 表示升序,默认是 False;
如下例子:
>>> sorted([1,9,8,2,3])
[1, 2, 3, 8, 9]
>>> sorted([1,9,8,2,3], reverse=True)
[9, 8, 3, 2, 1]
>>> sorted(L, key=lambda x:x[1])
[('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]
>>>
2
3
4
5
6
7
# 五、总结
函数式编程的好处如下:
(1)、代码更为简洁;
(2)、代码中没有循环体,少了很多临时变量,逻辑也更为简单;
(3)、数据集,操作和返回值都放在了一起;
作者:
本文链接:https://jokerbai.com
版权声明:本博客所有文章除特别声明外,均采用 署名-非商业性-相同方式共享 4.0 国际 (CC-BY-NC-SA-4.0) 许可协议。转载请注明出处!
- 02
- 使用Zadig从0到1实现持续交付平台07-19
- 03
- 基于Jira的运维发布平台07-19