函数式编程
今天主要学习了函数时编程,一个高阶函数的应用,感觉得在解决问题上,的确是简洁了很多,而且比较方便,下面做了一点小结。
匿名函数
- 什么匿名函数
1.当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。
2.在Python中,对匿名函数提供了有限支持。还是以
map()
函数为例,计算f(x)=x2时,除了定义一个f(x)
的函数外,还可以直接传入匿名函数。3.关键字
lambda
表示匿名函数,冒号前面的x
表示函数参数。4.匿名函数有个限制,就是只能有一个表达式,不用写
return
,返回值就是该表达式的结果。5.用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数:
比如筛选出一个数字序列中的奇数,下面代码实现
num = list(filter(lambda n: n % 2 != 0,[1,2,3,4,5,6,7])) print(num) # 运行结果 [1, 3, 5, 7]
高阶函数
高阶函数简单地说就是编写高阶函数时,就是让函数的参数接受别的函数,这边我说的高阶函数主要有map、reduce、filter、sorted。
map() 映射
- map需要传入两个参数,一个是函数,一个是迭代器。返回一个值,返回的值是一个惰性序列,所以需要把它打印出来要用list().
- 高阶函数与普通函数的对比
分别用普通函数和高阶函数简单计算f(x)=x^2
普通函数
def num(L): L1 = [] for x in L: L1.append(x*x) return L1 L = [1,2,3,4,5,6,7] name = num(L) print(name) # 运行结果 [1, 4, 9, 16, 25, 36, 49]
高阶函数
num = map(lambda x: x*x,[1,2,3,4,5,6,7]) print(list(num)) # 运行结果 [1, 4, 9, 16, 25, 36, 49]
reduce() 归约
- reduce的用法是把一个函数作用在一个序列上,这个函数必须要接受两个参数,reduce把结果继续和序列下一个元素做积累计算。
比方说一个序列求和,我们就可以用reduce,在用reduce函数时,我们需要导入一个模块。
from functools import reduce num = reduce(lambda x,y:x+y,[1,2,3,4,5,6,7,8,9,10]) print(num) # 运行结果 55
到这了,有的人会说,python不是有求和的内置函数sum吗?没有必要动用reduce,但是要把序列[1,3,5,7,9]变换成13579,reduce就可以派上用场了。
from functools import reduce num = reduce(lambda x,y:x*10+y,[1,3,5,7,9]) print(num) # 运行结果 13579
filter() 过滤、筛选
- filter函数和map函数类似,filter()也接收一个函数和一个序列,与map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值True还是False决定保留还是丢弃这个元素。
例如在一个list中,删掉偶数,只留奇数,可以这么写:
num = list(filter(lambda n: n % 2 == 0,[1,2,3,4,5,6,7])) print(num) # 运行结果 [2, 4, 6]
返回函数
- 什么是返回函数
返回函数是函数作为返回值
例子(当需要求几个相加的时候,就让函数返回值返回一个数字相加的函数,当几个数相减的时候,让函数返回一个相减的函数)
# 利用flag控制调用相加函数还是相减函数 def functools(flag): # 定义一个相间的函数 def add(a,b,c,d): return a + b + c + d # 定义一个相减的函数 def jian(a,b,c,d): return a - b -c - d # 判断flag if flag == "+": return add elif flag == "-": return jian # 返回值赋值给name name = functools("-") # name其实就是函数jian() # 给name函数传入参数a,b,c,d print(name(1,2,3,4)) # 运行结果 -8