Python的函数式编程及基本函数

限于喜欢 提交于 2019-12-02 04:42:54

函数式编程

    函数式编程并不是在使用Python时需要考虑的首要问题,它的主要作用在于写出更为精确和高效的代码。

    用函数式的风格写代码时,函数应该设计成没有其它副作用,也就是所谓的纯函数:函数接收参数并生成输出而不保留任何状态或修改任何不反映在返回值中的内容。

# 非函数式
a = 0
def increment1():
    global a
    a += 1
    
# 函数式
def increment2(a):
    return a + 1


lambda

    匿名函数,一般用来给map、filter等服务,即用即扔,或者作为回调函数,传递给某些应用。

    lambda args: expression

    冒‍号左边是参数,右边是表达式,并将结果作为返回‍值。


map

    map接受一个方法和一个集合作为参数,以集合中的每一个元素作为参数传入方法,然后把返回值插入到新创建的集合中,最后返回那个新集合。

>>> map(lambda s: s * 2, [1,2,3,4,5])[2, 4, 6, 8, 10]

    map也可以接收多个集合作为参数,这个时候,会从多个集合中依次取出对应元素组成元组传递给方法,再将执行结果插入到新的集合中并返回该集合。如果多个集合长度不一致,会以None补上。当然,集合的个数需要与方法参数的个数一致。

>>> plus = lambda x,y : (x or 0) + (y or 0) # x or 0 为防止None和0相加出现异常
>>> map(plus, [1,2,3], [4,5,6])
[5, 7, 9]
>>> map(plus, [1,2,3,4], [4,5,6])
[5, 7, 9, 4]
>>> map(plus, [1,2,3], [4,5,6,7])
[5, 7, 9, 7]

    有种情况是传递给map的func方法为None,则从集合中取值的过程依然不变,但是会将取值后的结果直接返回。

>> map(None, [1,2,3,4])
[1, 2, 3, 4]
>>> map(None, [1,2,3,4], [5,6,7,8])
[(1, 5), (2, 6), (3, 7), (4, 8)]
>>> map(None, [1,2,3,4], [5,6,7])
[(1, 5), (2, 6), (3, 7), (4, None)]
>>> map(None, [1,2,3,4], [6,7,8,9], [11,12])
[(1, 6, 11), (2, 7, 12), (3, 8, None), (4, 9, None)]


reduce

    reduce接收的参数形式如下:

 reduce(func, iterable[, initializer])

    reduce对iterable可迭代对象中的元素从左到右累计运算,initializer为初始值,若未指定初始值,则将第一个元素作为初始值,从第二个开始迭代。

>>> plus = lambda x, y : x + y
>>> reduce(plus, [1,2,3,4,5])
15
>>> reduce(plus, [1,2,3,4,5], 10)
25


filter

   filter同样接收一个方法和可迭代的集合对象作为参数,行为和map类似,但是filter会从方法执行结果中过滤出值为True的结果集并返回。

>>> filter(lambda x: x % 2, [1,2,3,4,5,6,7,8,9,10])
[1, 3, 5, 7, 9]














易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!