Higher-order function
把别的函数当参数的函数
高阶函数基础:
变量指向函数
函数本身和变量一样可以相互赋值 “即函数也等同于变量”
def func(a):
print("function")
return 0
c = func
c(10)
print(type(c))
#===================================
#output
function
<class 'function'>
实际写代码时,像下面这样操作
def func(a):
print("function")
return 0
func = 5 # 当整数赋值给函数func时
# 已经从<class 'function'>变成<class 'int'>
try:
func(10)
except TypeError:
print("func():TypeError")
print("func:",func)
print("func-type:",type(func))
#===================================
#output
func():TypeError
func: 5
func-type: <class 'int'>
简单高阶函数
当一个函数可以接收 另一个函数作为参数时, 这个函数就是高阶函数
def func1(f):
print("function1")
f()
return 0
def func2():
print("function2")
return 0
func1(func2)
#===================================
#output
function1
function2
python内置高阶函数
映射器:map( )
map() 的功能就是将序列 “L” 中的所有元素,放进f(x)中遍历一次, 并生成新的序列,形成一 一对应的映射关系
# map()基本原理
#============================
def f(x): #map()接受的第一个参数"函数"
return x+x
L = [1,2,3,4,5] #map()接受的第二个参数"序列"
L_done = [] #map()的实现部分
for x in L: #L_done就是map()的返回值
f(x)
L_done.append(f(x))
print(L)
print(L_done)
#============================
#output
[1, 2, 3, 4, 5]
[2, 4, 6, 8, 10]
```python def f(x): #map()接受的第一个参数”函数” return x+x
L = [1,2,3,4,5] #map()接受的第二个参数”序列”
D = map(f,L)
D2 = list(D) #注意: map的返回值的数据类型是
# 需要转换成其他的数据类型例如<class 'list'>
print(type(D)) print(D)
print(type(D2)) print(D2)
=================================
output
---
<a name="rHlRA"></a>
#### 累加器:reduce( )
> ![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)
> “initial”默认值是“None”,则‘function’
> 接受的第一个参数为 “sequence” 的一个元素 “L[0]” ,“L[1]” 则为第二个参数。
> 【即:function(L[0], L[1])】
>
> “initial”如果不是默认值,则‘function’
> 接受的第一个参数为 “initial” ,“L[0]” 则为第二个参数。
> 【即:function(initial, L[0])】
>
> 而函数“function”的返回值将做为下一次“function”执行的第一个参数,
> 第二个参数则为‘L[2]’
> 【f=function(L[0], L[1])】
> 【function(f, L[2])】
>
> 直至遍历整个“sequence”,最后function的返回值即为reduce( )的返回值
![](https://cdn.nlark.com/yuque/0/2021/jpeg/2485877/1611251602068-75fb80cc-d34a-480d-90ec-d5b9f4cb97e4.jpeg)```python
基本原理
下面两个案例具有相同的结果
#================================
# 案例1
def f(x,y):
if x == None:
return y
else:
return x + y
L = ["A","B","C","D","E"]
initial = None
outputA = f(f(f(f(f(initial, L[0]), L[1]), L[2]), L[3]), L[4])
print(outputA)
#=================================
# 案例2
from functools import reduce
def f(x,y):
return x + y
L = ["A","B","C","D","E"]
outputA = reduce(f,L)
print(outputA)
outputA = reduce(f,L,None)
print(outputA)
#=================================
from functools import reduce
def f(x, y):
print("x:",x)
print("y:",y)
return x+y
L = ["A","B","C","D","E"]
Ld = reduce(f,L,"F-")
print("reduce:",Ld)
#=================================
# Output
x: F-
y: A
x: F-A
y: B
x: F-AB
y: C
x: F-ABC
y: D
x: F-ABCD
y: E
reduce: F-ABCDE
筛选器:filter( )
可以根据一些规则f(x)去筛选列表 语法和map( )相似 如果函数的返回值是False就会被剔除
```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]
---
<a name="yIXVo"></a>
#### 排序器:sorted( )
> 事实上,之前在学 **序列容器 **的时候提到过类似的函数
> **L.sort(key=None, reverse=False) **这个函数其实也是个高阶函数
>
> Sorted的工作原理:
> sorted会给每一个Iterator中的每一个元素一个Key(类似Dict数据类型)
> sorted默认情况下是以自身为Key
> sorted会通过判单key的大小进行排序,默认是从小到大
>
> key也可以接受一个函数f(x)作为排序规则
> Iterator会将元素做为参数x,f(x)返回的值将作为key值进行判断大小
> 和之前一样,通过判断大小进行排序
![](https://cdn.nlark.com/yuque/0/2021/jpeg/2485877/1611260164530-ef28f262-ae60-4d55-9f57-7d308fc6bf24.jpeg)```python
L=["A", "D", "C", "B"]
def f(x):
if x == "A":
return 1
elif x == "B":
return 2
elif x == "C":
return 3
elif x == "D":
return 4
else:
return 0
L2 = sorted(L, key=f)
print(L2)
#=================================
# Output
['A', 'B', 'C', 'D']
# 如果将返回值顺序调整一一下
#=================================
L=["A", "D", "C", "B"]
def f(x):
if x == "A":
return 2
elif x == "B":
return 1
elif x == "C":
return 4
elif x == "D":
return 3
else:
return 0
L2 = sorted(L, key=f)
print(L2)
#=================================
# Output
['B', 'A', 'D', 'C']