Higher-order function
把别的函数当参数的函数


高阶函数基础:

变量指向函数

函数本身和变量一样可以相互赋值 “即函数也等同于变量”

  1. def func(a):
  2. print("function")
  3. return 0
  4. c = func
  5. c(10)
  6. print(type(c))
  7. #===================================
  8. #output
  9. function
  10. <class 'function'>

实际写代码时,像下面这样操作

  1. def func(a):
  2. print("function")
  3. return 0
  4. func = 5 # 当整数赋值给函数func时
  5. # 已经从<class 'function'>变成<class 'int'>
  6. try:
  7. func(10)
  8. except TypeError:
  9. print("func():TypeError")
  10. print("func:",func)
  11. print("func-type:",type(func))
  12. #===================================
  13. #output
  14. func():TypeError
  15. func: 5
  16. func-type: <class 'int'>

简单高阶函数

当一个函数可以接收 另一个函数作为参数时, 这个函数就是高阶函数

  1. def func1(f):
  2. print("function1")
  3. f()
  4. return 0
  5. def func2():
  6. print("function2")
  7. return 0
  8. func1(func2)
  9. #===================================
  10. #output
  11. function1
  12. function2

python内置高阶函数

映射器:map( )

map() 的功能就是将序列 “L” 中的所有元素,放进f(x)中遍历一次, 并生成新的序列,形成一 一对应的映射关系

  1. # map()基本原理
  2. #============================
  3. def f(x): #map()接受的第一个参数"函数"
  4. return x+x
  5. L = [1,2,3,4,5] #map()接受的第二个参数"序列"
  6. L_done = [] #map()的实现部分
  7. for x in L: #L_done就是map()的返回值
  8. f(x)
  9. L_done.append(f(x))
  10. print(L)
  11. print(L_done)
  12. #============================
  13. #output
  14. [1, 2, 3, 4, 5]
  15. [2, 4, 6, 8, 10]

L- 高阶函数 - 图1```python def f(x): #map()接受的第一个参数”函数” return x+x

L = [1,2,3,4,5] #map()接受的第二个参数”序列”

D = map(f,L) D2 = list(D) #注意: map的返回值的数据类型是

  1. # 需要转换成其他的数据类型例如<class 'list'>

print(type(D)) print(D)

print(type(D2)) print(D2)

=================================

output

[2, 4, 6, 8, 10]

  1. ---
  2. <a name="rHlRA"></a>
  3. #### 累加器:reduce( )
  4. > ![QQ截图20210119035305.png](https://cdn.nlark.com/yuque/0/2021/png/2485877/1610999592580-15fe35dc-866f-4109-b984-c76bf74f7697.png#align=left&display=inline&height=209&margin=%5Bobject%20Object%5D&name=QQ%E6%88%AA%E5%9B%BE20210119035305.png&originHeight=209&originWidth=445&size=10135&status=done&style=none&width=445)
  5. > initial”默认值是“None”,则‘function
  6. > 接受的第一个参数为 sequence 的一个元素 L[0]” ,“L[1]” 则为第二个参数。
  7. > 【即:function(L[0], L[1])】
  8. >
  9. > initial”如果不是默认值,则‘function
  10. > 接受的第一个参数为 initial ,“L[0]” 则为第二个参数。
  11. > 【即:function(initial, L[0])】
  12. >
  13. > 而函数“function”的返回值将做为下一次“function”执行的第一个参数,
  14. > 第二个参数则为‘L[2]’
  15. > f=function(L[0], L[1])】
  16. > function(f, L[2])】
  17. >
  18. > 直至遍历整个“sequence”,最后function的返回值即为reduce( )的返回值
  19. ![](https://cdn.nlark.com/yuque/0/2021/jpeg/2485877/1611251602068-75fb80cc-d34a-480d-90ec-d5b9f4cb97e4.jpeg)```python
  20. 基本原理
  21. 下面两个案例具有相同的结果
  22. #================================
  23. # 案例1
  24. def f(x,y):
  25. if x == None:
  26. return y
  27. else:
  28. return x + y
  29. L = ["A","B","C","D","E"]
  30. initial = None
  31. outputA = f(f(f(f(f(initial, L[0]), L[1]), L[2]), L[3]), L[4])
  32. print(outputA)
  33. #=================================
  34. # 案例2
  35. from functools import reduce
  36. def f(x,y):
  37. return x + y
  38. L = ["A","B","C","D","E"]
  39. outputA = reduce(f,L)
  40. print(outputA)
  41. outputA = reduce(f,L,None)
  42. print(outputA)
  43. #=================================
  1. from functools import reduce
  2. def f(x, y):
  3. print("x:",x)
  4. print("y:",y)
  5. return x+y
  6. L = ["A","B","C","D","E"]
  7. Ld = reduce(f,L,"F-")
  8. print("reduce:",Ld)
  9. #=================================
  10. # Output
  11. x F-
  12. y: A
  13. x F-A
  14. y: B
  15. x F-AB
  16. y: C
  17. x F-ABC
  18. y: D
  19. x F-ABCD
  20. y: E
  21. reduce: F-ABCDE

筛选器:filter( )

可以根据一些规则f(x)去筛选列表 语法和map( )相似 如果函数的返回值是False就会被剔除

L- 高阶函数 - 图2```python

用于判断是否为偶数的函数

def f(x):
if x%2 != 0: print(“Save”,x) return True else : print(“Delete:”,x) return False

L = [1, 2, 3, 4, 5, 6, 7, 8, 9]

D = filter(f,L) D = list(D) print(D)

=================================

Output

Save 1 Delete: 2 Save 3 Delete: 4 Save 5 Delete: 6 Save 7 Delete: 8 Save 9 [1, 3, 5, 7, 9]

  1. ---
  2. <a name="yIXVo"></a>
  3. #### 排序器:sorted( )
  4. > 事实上,之前在学 **序列容器 **的时候提到过类似的函数
  5. > **L.sort(key=None, reverse=False) **这个函数其实也是个高阶函数
  6. >
  7. > Sorted的工作原理:
  8. > sorted会给每一个Iterator中的每一个元素一个Key(类似Dict数据类型)
  9. > sorted默认情况下是以自身为Key
  10. > sorted会通过判单key的大小进行排序,默认是从小到大
  11. >
  12. > key也可以接受一个函数f(x)作为排序规则
  13. > Iterator会将元素做为参数xf(x)返回的值将作为key值进行判断大小
  14. > 和之前一样,通过判断大小进行排序
  15. ![](https://cdn.nlark.com/yuque/0/2021/jpeg/2485877/1611260164530-ef28f262-ae60-4d55-9f57-7d308fc6bf24.jpeg)```python
  16. L=["A", "D", "C", "B"]
  17. def f(x):
  18. if x == "A":
  19. return 1
  20. elif x == "B":
  21. return 2
  22. elif x == "C":
  23. return 3
  24. elif x == "D":
  25. return 4
  26. else:
  27. return 0
  28. L2 = sorted(L, key=f)
  29. print(L2)
  30. #=================================
  31. # Output
  32. ['A', 'B', 'C', 'D']
  1. # 如果将返回值顺序调整一一下
  2. #=================================
  3. L=["A", "D", "C", "B"]
  4. def f(x):
  5. if x == "A":
  6. return 2
  7. elif x == "B":
  8. return 1
  9. elif x == "C":
  10. return 4
  11. elif x == "D":
  12. return 3
  13. else:
  14. return 0
  15. L2 = sorted(L, key=f)
  16. print(L2)
  17. #=================================
  18. # Output
  19. ['B', 'A', 'D', 'C']