一、定义:
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()函数:处理一个序列,然后把序列进行合并操作