python基础学习-高阶函数
高阶函数
First Class Object
- 函数在Python中是一等公民
- 函数也是对象,可调用的对象
- 函数可以作为普通变量、参数、返回值等等
高阶函数
- 数学概念
y=g(f(x))
- 在数学和计算机科学中,高阶函数应当是至少满足下面一个条件的函数
- 接受一个或多个函数作为参数
- 输出一个函数
- 数学概念
计数器
1 | def counter(base): |
- 分析
- 函数counter是不是一个高阶函数
- 上面代码有没有什么问题?怎么改进
- 如何调用完成计数功能
foo = counter(10)
和foo1 = counter(10)
,请问foo和foo1相等吗?
自定义sort函数
- 排序问题
- 依照内建函数sorted,请自行实现一个sort函数(不使用内建函数),能够为列表元素排序
- 思路
- 内建函数sorted函数是返回一个新的列表,可以设置升序或降序,可以设置一个排序的函数。自定义的sort函数也要实现这个功能
- 新建一个列表,遍历原列表,和新列表的值依次比较决定如何插入到新列表中
- 思考
- sorted函数的实现原理,扩展到map、filter函数的实现原理
1 | # sort函数实现。下面实现的什么排序?还能怎么改变 |
内建函数-高阶函数
sorted(iterable[,key][,reverse])
- 排序
- 返回一个新的列表,对一个可迭代对象的所有元素排序,排序规则为key定义的函数,reverse表示是否排序翻转
sorted(lst,key=lambda x:6-x)
返回新列表list.sort(key=lambda x:6-x)
就地修改
filter(function,iterable)
->filter object
- 过滤数据
- 过滤可迭代对象的元素,返回一个迭代器
- function一个具有一个参数的函数,返回bool
- 例如,过滤出数列中能被3整除的数字
list(filter(lambda x:x%3 == 0,[1,9,55,150,-3,78,28,123]))
- 因为x%3 == 0是一个逻辑表达式,那一定会返回True或False,这个表达式的值就是return值,所以这里返回的是一个bool类型。把x%3 == 0可以改为0或True,效果是怎样的?
map(func,*iterables)
->map object
- 映射
- 对多个可迭代对象的元素按照指定的函数进行映射,返回一个迭代器
list(map(lambda x:2*x+1,range(5)))
dict(map(lambda x:(x%5,x),range(500)))
- 只会显示下面5个信息是因为通过key过滤掉重复数据了?
柯里化 Currying
- 柯里化
- 指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数
z = f(x,y)
转换成z = f(x)(y)
的形式
1 | # 举例:将加法函数柯里化 |
python基础学习-高阶函数