本文主要介绍高阶函数以及函数柯里化的概念,顺便举几个例子
高阶函数
High-order function:
数学表达式:y = f(g(x))
条件:接受一个或多个函数作为参数,或者有输出函数的都叫高阶函数
函数运行后就消亡,但是有了赋值操作后,函数对象不会被释放,只要变量x还在,那么函数就可以继续运行
def counter(base): #形参就是本地变量,因此base就是本地变量
def inc(step=1):
#nonlocal base ##此语句不定义也可以,因为inc函数已经形成了闭包
base += step
return base
return inc
x = counter(100) #将counter函数运行并且赋值给x
x() #这个会返回结果
#多次单独运行x()可以不断累加,因为counter返回的函数对象已经被x记住,base变量的值也会随着运算的进行不断更新
y1 = counter(5)
y2 = counter(5)
print(y1 == y2) #False
print(y1 is y2) #False
print(y1() == y2()) #True
#这两次分别运行互不干扰,前两次返回的是函数地址,第三次返回的是运行的结果
可以得出结论:高阶函数在有函数输出时,高阶函数的每次运行都会返回互不相同的函数对象,如果使用变量记住这些函数对象,那么就可以通过x()的形式来运行内部的嵌套函数,可多次运行
柯里化
指的是将原来接受两个参数的函数变成接受一个参数的函数的过程,新函数返回一个以原第二个参数为参数的函数
即 y = f(x, y) --> y = g(x)(y)
def add(x, y):
return x + y
def add(x):
def add2(y):
return x + y
return add2
add(4, 5)
add1(4)(5) #这两次运行的结果是一样的
再举个栗子
def sub(x, y):
def add(z):
return x - y + z
return add
#这次要进行的是 sub(x, y)(z) --> sub2(x)(y)(z)
def sub2(x):
def sub3(y):
def add2(z):
return x - y + z
return add2
return sub3
sub(10,4)(3)
sub2(10)(4)(3)