高阶函数
#####此篇文章来源于我的老师Wayne,仅作记录以备复习
一等公民
- 函数在 Python 是一等公民(First-Class Object)
- 函数也是对象,是可调用对象
- 函数可以作为普通变量,也可作为函数的参数、返回值
高阶函数
高阶函数(High-order Function)
- 数学概念 y = f(g(x))
- 在数学和计算机科学中,高阶函数应道是至少满足下面一个条件的函数
- 接收一个或多个函数作为参数
- 输出一个函数
观察下面的函数定义,思考几个问题
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
定义 sorted(iterbale,*,key=None,reverse=False) -> list
sorted(lst,key = lambda x : 6 - x ) 返回新列表
list.sort(key = lambda x : 6 - x ) 就地修改
过滤 filter
- 定义
filter(function,iterbale)
- 对可迭代对象进行遍历,返回一个迭代器
- function 参数是一个参数的函数,且返回值应当是 bool 类型,或其返回值等效布尔值
- function 参数如果是 None,可迭代对象的每一个元素自身等效布尔值
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
- 定义
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)))
柯里化**
- 指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数
- z = f(x,y) 转化为 z = f(x)(y) 的形式
- 例如
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)
通过嵌套函数,就可以把函数转化成柯里化函数。
如何运用柯里化,实现下面的调用呢?
- add(4)(5,6)
- add(4)(5)(6)
- add(4,5)(6)
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)