高阶函数(High-order Function)
观察下面的函数定义,思考几个问题
def counter(base):
def inc(step=1):
base += step
return base
return inc
Q&A:
Q : 请问 counter 是不是高阶函数
A : 是高阶函数
Q :上面代码有没有问题?如果有,如何改进
A : 在内层函数inc的局部作用域中,base += step 使得 base重新赋值定义,成为inc的局部变量,但是由于base引用在赋值之前,导致语法错误,所以应该在 base += step前声明 nonlocal base , 这样就会从上级函数中寻找自由变量 base,同时形成一个闭包。
Q : f1 = counter(5) 和 f2 = counter(5) ,请问 f1 和 f2 相等么?
A : 不相等,因为函数调用每次都会生成一个新的函数,由于没有牵扯到引用类型,所以这两次函数调用虽然看起来返回值一样,但确实是不相等的两次函数调用。
定义 sorted(iterbale,*,key=None,reverse=False) -> list
sorted(lst,key = lambda x : 6 - x ) 返回新列表
list.sort(key = lambda x : 6 - x ) 就地修改
filter(function,iterbale)
list(filter(lambda x : x % 3 == 0 , [1, 9, 55, 150, -3, 78, 28, 123] ))
list(filter(None, range(5)))
list(filter(None, range(-5,5)))
map(function,*iterbales) -> map object
list(map(lambda x : 2 * x + 1 ,range(10)))
dict(map(lambda x : (x % 5,x),range(100)))
dict(map(lambda x,y : (x,y),'abcedf',range(5)))
def add(x,y)
return x + y
原来函数调用为 add(4,5)
,柯里化的目标是 add(4)(5)
。如何实现?
每一次括号说明是函数调用,说明 add(4)(5)
是2次函数调用。
def add(x):
def _add(y):
return x + y
return _add
add(100)(200)
通过嵌套函数,就可以把函数转化成柯里化函数。
如何运用柯里化,实现下面的调用呢?
1、
def add(x):
def _add(y,z):
return x + y + z
return _add
add(500)(18,2)
2、
def add(x):
def _add(y):
def inner(z):
return x + y + z
return inner
return _add
add(419)(1)(100)
3、
def add(x,y):
def _add(z):
return x + y + z
return _add
add(20,400)(100)