Python函数式编程

120 阅读3分钟

「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战

一、lambda

lambda是匿名函数,也叫行内函数。 具体用法如下:

f = lambda x : x+2        #定义了一个函数f(x)=x+2
g = lambda x,y : x+y     #定义了一个函数f(x,y)=x+y

lambda只是一个表达式,函数体比def简单得多,lambda表达式运行起来像一个函数。关于lambda函数的用途有两点说明。

(1)对于单行函数,使用lambda可以省去定义函数的过程,让代码更加简洁。

(2)在非多次调用函数的情况下,lambda表达式即用即得,可以提高性能。

使用lambda的匿名函数的例子如下:

>>> f = lambda x,y,z:x+y+z
>>> f(1,2,3)
6
>>>

二、reduce()

使用reduce(func(),Z),可以把一个函数作用在一个序列上累计计算。其效果如下:

reduce(f, {x1,x2,x3,x4}) = f(f(f(x1,x2,x3),x4)

Python中的reduce内建函数func()是一个二元操作函数,它将一个数据集合Z(可以是列表或元组等)中的所有数据进行下列操作:用函数func()对集合Z中的第1、第2个数据进行运算,将得到的结果再与Z中的第三个数据运算,以此循环。

例如:

from functools import reduce
def add (x,y):
   return x+y
     
sum=reduce(add,(1,2,3,4,5,6,7))
print(sun)

执行上面的程序,输出1+2+3+4+5+6+7的结果即28.reduce就是将add(x,y)函数作用在(1,2,3,4,5,6,7)上,即:1赋给x,2赋给y,再将计算结果(1+2)赋给x,3赋给y;再次将计算结果((1+2)+3)赋给x,4赋给y,以此类推。 当然,也可以用lambda的方法,更为简单:

>>> from functools import reduce
>>> sun=reduce(lambda x,y:x+y,(1,2,3,4,5,6,7))
>>>print(sum)
28
>>>

reduce在Python 2.x中可以直接使用,但在Python 3.0以后,已经不在built-in function中,要使用它就必须先导入:from function import reduce。

三、filter

filter()用于过滤序列。filter()接收一个函数和一个序列,并把传入的函数依次作用于每个元素,然后根据返回值True或者False,决定保留还是丢弃该元素。

例如,在一个list中,删掉偶数,只保留奇数,代码如下:

>>> def is_odd(n):
        return n % 2 == 1
>>>list (filter(is_odd, [1,2,4,5,6,9,10,15]))
[1,5,9,15]
>>>

再如把一个序列中的空字符串删掉,代码如下:

>>> def not_empty(s):
        return s and s.strip()
>>> list(filter(not_empty,['A', ''B', None, 'C', ' '])}
['A', 'B', 'C']
>>>

可见,用filter()这个高阶函数时,关键在于正确地实现一个“筛选”函数。、

filter()函数还可以实现行函数功能,例如:

>>> b=[i for i in range (1,10) if i>5 and i<9]
>>>b
[6,7]
>>>

用filter()函数改写如下:

>>> b=filter(lambda x: x>5 and x<8, range(1,10))
>>> list (b)
[6, 7]
>>>

filter()在Python 2.7中直接返回一个列表。但在Python 3.x中,finter()是一个容器,返回时需要用list调用才显示数据。