高阶函数,柯里化,sort排序
高阶函数概念
first class object:
函数在python中时一等公民.
函数也是对象,可调用的对象.
函数可以作为普通变量,参数,返回值等等.
高阶函数:
数学概念: y=g(f(x)).
在数学和计算机科学中,高阶函数应当是至少满足下面一个条件的函数:
接受一个或多个函数作为参数.
输出一个函数.
计数器:
def counter(base):
def inc(step=1):
base += step
return base
return inc
# print(counter(5)())
res = counter(5)
print(res())
分析:
函数counter是一个高阶函数.
该函数运行会报错,原因在于第3行, base = base + step, base被重新赋值.
改进: 使用nonlocal.
nonlocal会指引inc去上层非全局作用域的本地作用域中查找.
改进之后的counter函数,f1 = counter(5)和f2 = counter(5).
比较f1和f2,值相同,但内存地址不同.因为inc是counter内的函数,每次调用counter,inc都要在栈上重新生成对象,故内存地址不相等.
自定义sort函数
排序问题: 仿照内建函数sorted,实现一个sort函数(不使用内建函数),能够为列表元素排序.
思路:
内建函数sorted会返回一个新的列表,可以设置升序或降序,设置的排序的函数,自定义的sort函数也要实现这个功能.
新建一个列表,遍历原列表,和新列表的值依次比较决定如何插入到新列表中.
for函数的使用原则: 不建议修改源,除非明确知道需要修改,因为不一定只给一个人用,所以要选择使用sort和sorted.
实现示例:
def sort(iterable):
ret = []
for x in iterable:
for i, y in enumerate(ret):
if x < y:
ret.insert(i, x)
break
else:
ret.append(x)
return ret
print(sort([1, 9, 5]))
sort函数实现,用一个参数控制顺序:
def sort(iterable, reverse=False):
ret = []
for x in iterable:
for i, y in enumerate(ret):
flag = x > y if reverse else x < y
if flag:
ret.insert(i, x)
break
else:
ret.append(x)
return ret
print(sort([1, 9, 5], reverse=True))
def sort(iterable, fn = lambda a, b : a < b):
ret = []
for x in iterable:
for i, y in enumerate(ret):
if fn(x, y):
ret.insert(i, x)
break
else:
ret.append(x)
return ret
print(sort([1, 9, 5]))
内建函数-高阶函数
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])
map(func, iterables) -> map object
对多个可迭代对象的元素按照指定的函数进行映射,返回一个迭代器.
list(map(lambda x:2x+1, range(5)))
dict(map(lambda x: (x%5,x) , range(500)))
注:
sort和map不改变元素个数.
filter可能会改变元素个数.
柯里化Currying
柯里化:
指将原来接收两个参数的函数变成新的接收一个参数的函数的过程, 新的函数返回一个以原有第二个参数为参数的函数.
z = f(x, y) 转换成 z = f(x)(y) 的形式.
举例: 将加法柯里化
def add(x, y):
return x + y
print(add(5, 4))
def add(x):
def _add(y):
return x + y
return _add
print(add(5)(4))
以上通过嵌套函数就可以把函数转换为柯里化函数.
高阶函数,柯里化,sort排序的更多相关文章
- scala面向对象.高阶函数,柯里化,Actor编程简介
1.定义一个类 class Person{ //用val修饰的变量是只读属性,有getter但是没有setter val id ="111" //用var修饰的变量既有getter ...
- Python高阶函数及函数柯里化
1 Python高阶函数 接收函数为参数,或者把函数作为结果返回的函数为高阶函数. 1.1 自定义sort函数 要求:仿照内建函数sorted,自行实现一个sort函数.内建函数sorted函数是返回 ...
- js高阶函数应用—函数柯里化和反柯里化
在Lambda演算(一套数理逻辑的形式系统,具体我也没深入研究过)中有个小技巧:假如一个函数只能收一个参数,那么这个函数怎么实现加法呢,因为高阶函数是可以当参数传递和返回值的,所以问题就简化为:写一个 ...
- 从 ES6 高阶箭头函数理解函数柯里化
前言:第一次看到多个连续箭头函数是在一个 react 项目中,然鹅确认了下眼神,并不是对的人,因为看得一脸懵逼.em......于是开始各种搜索,先是知道了多个连续箭头函数就是 es6 的多次柯里化的 ...
- js高阶函数应用—函数柯里化和反柯里化(二)
第上一篇文章中我们介绍了函数柯里化,顺带提到了偏函数,接下来我们继续话题,进入今天的主题-函数的反柯里化. 在上一篇文章中柯里化函数你可能需要去敲许多代码,理解很多代码逻辑,不过这一节我们讨论的反科里 ...
- React-高阶函数_函数柯里化
高阶函数_函数柯里化 高阶函数(定义) 如果一个函数符合下面两个规范,就是高阶函数: 如果A函数,接收的参数是一个函数,那么A就是一个高阶函数(比如数组方法arr.map()接收的就是一个处理item ...
- JavaScript函数柯里化的一些思考
1. 高阶函数的坑 在学习柯里化之前,我们首先来看下面一段代码: var f1 = function(x){ return f(x); }; f1(x); 很多同学都能看出来,这些写是非常傻的,因为函 ...
- 前端进击的巨人(五):学会函数柯里化(curry)
柯里化(Curring, 以逻辑学家Haskell Curry命名) 写在开头 柯里化理解的基础来源于我们前几篇文章构建的知识,如果还未能掌握闭包,建议回阅前文. 代码例子会用到 apply/call ...
- JavaScript中的函数柯里化与反柯里化
一.柯里化定义 在计算机科学中,柯里化是把 接受多个参数的函数 变换成 接受一个单一参数(最初函数的第一个参数)的函数 并且返回 接受余下参数且返回结果的新函数的技术 高阶函数 高阶函数是实现柯里化的 ...
随机推荐
- hdu1878判断欧拉回路
欧拉回路 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- java 学习笔记——类之间的关系之封装、继承与多态的详解
封装 一个封装的简单例子 封装就是把对象的属性(状态)和方法(行为)结合在一起,并尽可能隐蔽对象的内部细节,成为一个不可分割的独立单位(即对象),对外形成一个边界,只保留有限的对外接口使之与外部发生联 ...
- web应用程序 前段部分调优
1. 使用瀑布图初步诊断网站性能瓶颈 一般来说,打开一个网页的速度会受到以下几项的影响: 1) 服务器花了太长的时间将.aspx页面的内容转化为html. 2) .aspx页面花了太长的时间从服务器端 ...
- Python调用C# Com dll组件实战
之前公司有套C# AES加解密方案,但是方案加密用的是Rijndael类,而非AES的四种模式(ECB.CBC.CFB.OFB,这四种用的是RijndaelManaged类),Python下Crypt ...
- [置顶]
一个demo学会c#
学习了c#4.5高级编程这本书,自己喜欢边学边总结边写demo,所以写了这篇文章,包含了大部分的c#编程知识.让你一个demo掌握c#编程,如果有问题可以留言. 此demo主要包括五个文件:Stude ...
- linux上redis安装配置及其防漏洞配置及其攻击方法
Linux上redis安装: 需先在服务器上安装yum(虚拟机可使用挂载的方式安装) 安装配置所需要的环境运行指令: yum -y install gcc 进入解压文件执行make 指令进行编译 执 ...
- cocos2dx - 在MFC中使用cocos2dx
本节主要讲一下如何在MFC窗口中使用cocos2dx 在做比较复杂的游戏,有时需要通过一些工具来编辑生成关卡或者特效,技能等的配置文件.为了方便配置,需要可以通过修改参数直观得到显示的效果.这就需要将 ...
- 【特效】hover图片立体翻转
hover图片翻转效果二::绕Y轴旋转90度,注意父层要加透视属性perspective,这样才能看出立体效果 html: <ul class="list-img"> ...
- [js高手之路]html5 canvas动画教程 - 自己动手做一个类似windows的画图软件
这个绘图工具,我还没有做完,不过已经实现了总架构,以及常见的简易图形绘制功能: 1,可以绘制直线,圆,矩形,正多边形[已完成] 2,填充颜色和描边颜色的选择[已完成] 3,描边和填充功能的选择[已完成 ...
- win10 uwp 通知Toast
win10通知使用Toast 可以使用win10 模板添加通知 var t = Windows.UI.Notifications.ToastTemplateType.ToastText02; 使用Ge ...