高阶函数
函数在Python中是一等公民
函数也是对象,可调用对象
函数可以做为普通变量、参数、返回值等
数学概念y = g(f(x))
在数学和计算机科学中,高阶函数要满足至少一个以下的条件
接收一个或多个函数
输出一个函数,最多一个,不能多
def counter(base): def inc(step = 1): nonlocal base base += step return base return inc s1 = counter(5) s2 = counter(5)
比较两个函数,比不了大小,就比地址,
== 判断内容是否相同,没有比地址,is判断地址是否相同
def sort(iterable,reverse=False): a = [] for x in iterable: for i,y in enumerate(a): flag = x>y if reverse else x<y if flag: a.insert(i, x) break else: a.append(x) return a sort([1,2])
插入实现用一个参数控制
def sort(iterable,reverse=False,key=lambda a,b: a>b): a = [] for x in iterable: for i,y in enumerate(a): flag = key(x,y) if reverse else not key(x,y) if flag: a.insert(i, x) break else: a.append(x) return a sort([1,2])
参数用函数,是高阶函数,忽略算法效率问题
enumerte
str.lower('A') 调用类方法,理解为函数,操作对象为’A‘
'A'.lower() ’A‘对象对自己调用方法把自己转化 对象.操作
内建函数,高阶函数
sorted(iterable, /, *, key=None, reverse=False)
sorted 中 key只是比较方式,不会影响原数据,reverse表示是否反转排序
sorted(range(5),key=lambda x: 6-x)
output : [4, 3, 2, 1, 0]
立即返回新列表
filter(function,iterable) 过滤可迭代对象的元素,返回一个迭代器
function 一个一个的计算,操作具有一个参数的函数,返回bool, 返回True时的实参
list(filter(lambda x:x-1, range(5)))
output : [0, 2, 3, 4]
x-1,当x = 1 时,得0,等效False,过滤掉1
map(func, *iterables) 对多个可迭代对象的元素按照指定的函数进行映射,返回一个迭代器
传入传出个数不变
list(map(lambda x:2*x+1 ,range(5)))
output : [1, 3, 5, 7, 9]
map函数返回一个迭代器,要用容器接收
dict(map(lambda x:(x%5,x), range(400)))
output : {0: 395, 1: 396, 2: 397, 3: 398, 4: 399}
注意字典集合去重的问题
函数返回值一定为1个
构造对象,解析式 都可以封装或者创建容器
柯里化 currying
指的是将原来接收两个参数的函数变成新的接收一个参数的函数的过程。新函数返回一个以原有第二个参数为参数的函数
z = f(x, y) 转换为z = f(x)(y)
通过嵌套函数可以把函数转化成柯里化函数
函数块右移,参数下拉,新建函数,再调用原函数
def add(x,y): return x+y add(4,5)
def add(x): def fn(y): return x+y return fn add(4)(5)