函数在Python是一等公民(First-Class Object)
函数也是对象,是可调用对象
函数可以作为普通变量,也可以作为函数的参数、返回值
高阶函数
高阶函数(High-order Function)
数学概念 y = f(g(x))
在数学和计算机科学中,高阶函数应当是至少满足下面一个条件的函数
接受一个或多个函数作为参数
输出一个函数
观察下面的函数定义,回答问题
def counter(base): def inc(step=1): base += step return base return inc请问counter是不是高阶函数
上面代码有没有问题?如果有,如何改进
如何调用以完成计数功能
f1 = counter(5)和f2=counter(5),请问f1和f2相等吗?
练习:自定义sort函数
仿照内建函数sorted,请自行实现一个sort函数(不用使用内建函数),能够为列表元素排序
思考:通过练习,思考sorted函数的实现原理,map、filter函数的实现原理
思路:
内建函数sorted函数,它返回一个新的列表,可以设置升序或降序,可以设置一个用于比较的函数(自定义 函数也要实现这些功能)
新建一个列表,遍历原列表,和新列表中的当前值依次比较,决定带插入数插入到新列表的什么位置 实现
请问下面的函数是什么排序?代码还能怎么改变
def sort(iterable, *, key=None, reverse=False): newlist = [] for x in iterable: for i, y in enumerate(newlist): if x > y: newlist.insert(i, x) break else: # 不大于,说明是最小的,尾部追加 newlist.append(x) return newlist x > y 或 x < y能控制什么 这个算法是如何实现排序的** **
进一步实现reverse参数
def sort(iterable, *, key=None, reverse=False): newlist = [] for x in iterable: for i, y in enumerate(newlist): comp = x > y if reverse else x < y # 实现reverse参数 if comp: # x > y立即插入,说明y小被挤向右边。 newlist.insert(i, x) break else: # 不大于,说明是最小的,尾部追加 newlist.append(x) return newlist** **
进一步实现key参数功能
def sort(iterable, *, key=None, reverse=False):
newlist = []
for x in iterable:
cx = key(x) if key else x
for i, y in enumerate(newlist):
cy = key(y) if key else y
comp = cx > cy if reverse else cx < cy # 实现reverse参数
if comp: # x > y立即插入,说明y小被挤向右边。 换成 x < y是什么意思? newlist.insert(i, x)
break
else: # 不大于,说明是最小的,尾部追加
newlist.append(x)
return newlist
内建高阶函数
排序sorted
定义 sorted(iterable, *, key=None, reverse=False) - >list ,不在赘述
sorted(lst, key=lambda x:6-x) # 返回新列表
list.sort(key=lambda x: 6-x) # 就地修改
过滤filter
定义 filter(function, iterable)
对可迭代对象进行遍历,返回一个迭代器
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, *iterables) - > map object
对多个可迭代对象的元素,按照指定的函数进行映射
返回一个迭代器
list(map(lambda x: 2*x+1, range(10)))
dict(map(lambda x: (x%5, x), range(500)))
dict(map(lambda x,y: (x,y), ‘abcde’, range(10)))
** **
柯里化**
指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参 数为参数的函数
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次函数调用。
add(4)(5)
等价于
t = add(4)
t(5)
也就是说add(4)应该返回函数。
def add(x):
def _add(y):
return x + y
return _add
add(100, 200)
通过嵌套函数就可以把函数转成柯里化函数。
** **