函数式编程

一、定义:

1、编程的方法论:

面向过程、面向对象、函数式

高阶函数:

① 函数接受的参数是一个函数名

② 返回值中包含函数名

2、函数式编程:函数式=编程语言定义的函数+数学意义的函数

函数式就是用编程语言去实现数学函数。这种函数内对象是永恒不变的,要么参数是函数,要么返回值是函数,没有for和while循环,所有的循环都用递归去实现,无变量的赋值(即不用变量去保存状态),无赋值即不改变。

3、特性

① 不可变数据:不用变量保存状态,不修改变量

② 第一类对象:函数即“变量” 

③ 尾调用优化(尾递归):在函数的最后一部调用另外一个函数(最后一行不一定是函数的最后一步)

4、实例

#把函数当作参数传入到另外一个函数中

def foo(n):
    print(n)
def bar(name):
    print('my name is %s'%name)
foo(bar('alex'))

输出结果:

my name is alex
None

二、高阶函数

1、 map函数:map(function, iterable, ...)

意义:根据提供的函数对指定序列做映射。

第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

lum = [1,5,6,11,20]
li = []
#非map用法
def test(x,y):
    for i in y:
        k = x(i)
        li.append(k)
    return li
print(test(lambda x:x**2 ,lum))

#map函数用法
def square(x):
    return x**2
print(list(map(square,lum))) #转化为列表形式

输出结果:

[1, 25, 36, 121, 400]
[1, 25, 36, 121, 400]

最精简样式,输出结果与上面一致:

print(list(map(lambda x:x**2,[1,5,6,11,20])))

2、filter() 函数:filter(function, iterable)

意义:用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

def test(x):
    return x%2 == 0
li = filter(test,[1,2,3,46,55,64,87,99])
print(list(li))

输出结果:[2, 46, 64]

3、reduce() 函数:reduce(function, iterable[, initializer])

意义:对参数序列中元素进行累积

函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给reduce中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果

from functools import reduce #调用reduce功能
print(reduce(lambda x,y:x*y,[1,2,45,4]))

输出结果:360

小结:

map()函数:处理序列中的每个元素,得到的结果是一个列表,该列表元素个数及位置与原来一样

filter()函数:遍历序列中的每个元素,判断每个元素得到布尔值,如果是Ture则留下来

reduce()函数:处理一个序列,然后把序列进行合并操作

原文地址:https://www.cnblogs.com/lishuangtu/p/8945443.html