笔记 | Python之函数式编程

笔记 | Python之函数式编程
题图:来自plxabay

函数式编程的特点就是允许把函数本身作为参数传入另一个函数,还允许返回一个函数。
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

>>>

当然,map()还是可以传入多个interable对象,如下:

>>> list(map(lambda x,y: x+y, [1,2,3,4,5], [6,7,8,9,10]))

[7, 9, 11, 13, 15]

>>>

在传入多个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)

其中第一个参数是一个函数名或匿名函数,第二个参数是一个可迭代对象,第三个参数是一个初始值(可选参数),它的功能是返回函数的计算结果。如下:

>>> 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

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]

>>>

四、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)]

>>>

五、总结

函数式编程的好处如下:
(1)、代码更为简洁;
(2)、代码中没有循环体,少了很多临时变量,逻辑也更为简单;
(3)、数据集,操作和返回值都放在了一起;

猜你喜欢

转载自blog.51cto.com/15080014/2654770