函数式编程
基于lambda演算的一种编程方式
- 函数中只有函数
- 函数可以作为参数,同样可以作为返回值
- 纯函数式编程语言:LISP , Haskell
python函数式编程只是借鉴函数式编程的一些特点,可以理解成一半函数一半python
需要讲述:
- 高阶函数
- 返回函数
- 匿名函数
- 装饰器
- 偏函数
lambda表达式
函数:最大程度复用代码
存在问题:
- 如果函数很小,很短,则会造成啰嗦
- 如果函数被调用次数少,则会造成浪费
- 对于阅读者来说,造成阅读流程的被迫中断
lambda表达式(匿名函数):
- 一个表达式,函数体相对简单
- 不是一个代码块,仅仅是一个表达式
- 可以有参数,有多个参数也可以,用逗号隔开
用法:
- 以lambda开头
- 紧跟一定的参数(如果有的话)
- 参数后用冒号和表达式主题隔开
- 只是一个表达式,所以没有return
计算一个数字的100倍数
stm = lambda x: 100 * x print(stm(89)) 结果: 8900
多个参数
stm2 = lambda x,y,z,:x + y * 10 + z * 100 print(stm2(4,5,6)) 结果: 654
高阶函数
- 把函数作为参数使用的函数,叫高阶函数
变量可以赋值
a = 100 b = a
函数名称就是一个变量
def funA(): print(" In funA") funB = funA funB()
以上代码得出结论:
- 函数名称是变量
- funB和funA只是名称不一样
- 既然函数名称是变量,则应该可以被当做参数传入另一个函数
#高阶函数举例 #funA是普通函数,返回一个传入数字的100倍数字 def funA(n): return n * 100 # 再写一个函数,把传入参数乘以300倍 def funB(n): #最终返回300n return funA(n) *3 print(funB(9)) #写一个高阶函数 def funC(n,f): #假定函数是把n扩大100倍 return f(n) * 3 print(funC(9,funA))
系统高阶函数-map
- 映射,把集合或列表的元素,每个元素都按照一定规则进行操作,生成一个新的列表或者集合
- map函数是系统提供的具有映射功能的函数,返回值是一个迭代对象
#map 举例 #有一个列表,想对列表里的每个元素乘以10 L1 = [ i for i in range(10)] l2 = [] for i in L1: l2.append(i * 10) print(l2) 或高阶函数 def mulTen(n): return n*10 l3 = map(mulTen,L1) for i in l3: print(i,end=" ")
reduce
reduce 归并,缩减 把一个可迭代对象最后归并成一个结果 对于函数参数的函数要求:必须由两个参数,必须由返回结果 reduce([1,2,3,4,5]) == f(f(f(f(1,2),3),4),5) reduce 需要导入functools包 from functools import reduce def myAdd(x,y): return x + y rst = reduce(myAdd,[1,2,3,4,5,]) print(rst) 结果: 15
filter函数
- 对一组数据进行过滤,符合条件的数据会生成一个新的列表并返回
- 调用函数:filter(f,data),f是过滤函数,data是数据
def isRven(a): return a % 2 == 0 l = [1,2,3,4,5,6,7,8,9,10] rst = filter(isRven,l) print(rst) print([i for i in rst])
高阶函数-排序
- 把一个序列安照给定算法进行排序
- key:在排序前对每个元素进行key函数运算,可以理解成按照key函数定义的逻辑进行排序