高阶函数概念

first class object:

    函数在python中时一等公民.

    函数也是对象,可调用的对象.

    函数可以作为普通变量,参数,返回值等等.

高阶函数:

    数学概念: y=g(f(x)).

    在数学和计算机科学中,高阶函数应当是至少满足下面一个条件的函数:

    接受一个或多个函数作为参数.

    输出一个函数.

计数器:

  1. def counter(base):
  2. def inc(step=1):
  3. base += step
  4. return base
  5. return inc
  6. # print(counter(5)())
  7. res = counter(5)
  8. 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.

实现示例:

  1. def sort(iterable):
  2. ret = []
  3. for x in iterable:
  4. for i, y in enumerate(ret):
  5. if x < y:
  6. ret.insert(i, x)
  7. break
  8. else:
  9. ret.append(x)
  10. return ret
  11. print(sort([1, 9, 5]))

sort函数实现,用一个参数控制顺序:

  1. def sort(iterable, reverse=False):
  2. ret = []
  3. for x in iterable:
  4. for i, y in enumerate(ret):
  5. flag = x > y if reverse else x < y
  6. if flag:
  7. ret.insert(i, x)
  8. break
  9. else:
  10. ret.append(x)
  11. return ret
  12. print(sort([1, 9, 5], reverse=True))
  1. def sort(iterable, fn = lambda a, b : a < b):
  2. ret = []
  3. for x in iterable:
  4. for i, y in enumerate(ret):
  5. if fn(x, y):
  6. ret.insert(i, x)
  7. break
  8. else:
  9. ret.append(x)
  10. return ret
  11. 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:2
x+1, range(5)))

    ‡ dict(map(lambda x: (x%5,x) , range(500)))

注:

    sort和map不改变元素个数.

    filter可能会改变元素个数.

柯里化Currying

柯里化:

    指将原来接收两个参数的函数变成新的接收一个参数的函数的过程, 新的函数返回一个以原有第二个参数为参数的函数.

    z = f(x, y) 转换成 z = f(x)(y) 的形式.

举例: 将加法柯里化

  1. def add(x, y):
  2. return x + y
  3. print(add(5, 4))
  1. def add(x):
  2. def _add(y):
  3. return x + y
  4. return _add
  5. print(add(5)(4))

以上通过嵌套函数就可以把函数转换为柯里化函数.

高阶函数,柯里化,sort排序的更多相关文章

  1. scala面向对象.高阶函数,柯里化,Actor编程简介

    1.定义一个类 class Person{ //用val修饰的变量是只读属性,有getter但是没有setter val id ="111" //用var修饰的变量既有getter ...

  2. Python高阶函数及函数柯里化

    1 Python高阶函数 接收函数为参数,或者把函数作为结果返回的函数为高阶函数. 1.1 自定义sort函数 要求:仿照内建函数sorted,自行实现一个sort函数.内建函数sorted函数是返回 ...

  3. js高阶函数应用—函数柯里化和反柯里化

    在Lambda演算(一套数理逻辑的形式系统,具体我也没深入研究过)中有个小技巧:假如一个函数只能收一个参数,那么这个函数怎么实现加法呢,因为高阶函数是可以当参数传递和返回值的,所以问题就简化为:写一个 ...

  4. 从 ES6 高阶箭头函数理解函数柯里化

    前言:第一次看到多个连续箭头函数是在一个 react 项目中,然鹅确认了下眼神,并不是对的人,因为看得一脸懵逼.em......于是开始各种搜索,先是知道了多个连续箭头函数就是 es6 的多次柯里化的 ...

  5. js高阶函数应用—函数柯里化和反柯里化(二)

    第上一篇文章中我们介绍了函数柯里化,顺带提到了偏函数,接下来我们继续话题,进入今天的主题-函数的反柯里化. 在上一篇文章中柯里化函数你可能需要去敲许多代码,理解很多代码逻辑,不过这一节我们讨论的反科里 ...

  6. React-高阶函数_函数柯里化

    高阶函数_函数柯里化 高阶函数(定义) 如果一个函数符合下面两个规范,就是高阶函数: 如果A函数,接收的参数是一个函数,那么A就是一个高阶函数(比如数组方法arr.map()接收的就是一个处理item ...

  7. JavaScript函数柯里化的一些思考

    1. 高阶函数的坑 在学习柯里化之前,我们首先来看下面一段代码: var f1 = function(x){ return f(x); }; f1(x); 很多同学都能看出来,这些写是非常傻的,因为函 ...

  8. 前端进击的巨人(五):学会函数柯里化(curry)

    柯里化(Curring, 以逻辑学家Haskell Curry命名) 写在开头 柯里化理解的基础来源于我们前几篇文章构建的知识,如果还未能掌握闭包,建议回阅前文. 代码例子会用到 apply/call ...

  9. JavaScript中的函数柯里化与反柯里化

    一.柯里化定义 在计算机科学中,柯里化是把 接受多个参数的函数 变换成 接受一个单一参数(最初函数的第一个参数)的函数 并且返回 接受余下参数且返回结果的新函数的技术 高阶函数 高阶函数是实现柯里化的 ...

随机推荐

  1. bzoj2730(矿场搭建)

    矿场搭建,不知道为什么,莫名其妙T了在212上,额,zyh数据真的坑. bzoj200轻松跑过啊. 就是点双联通分量缩点,然后标记割点,一个块如果有>=2个割点,则不需要挖矿洞, 如果只有一割点 ...

  2. NOIP2017SummerTraining0726

    三道比较简单的题,还以为是八校考试的题目,但是并不是,无语了,第三题其实看了挺久的,一看到图,就想到了二分图,网络流之类的算法,但是尽力往这个方向想了好久都没什么思路, 最后从简单入手,然而没什么结果 ...

  3. 怎样清理c盘垃圾

    休眠文件清理 休眠文件(hiberfil.sys)是,当你的电脑进入休眠状态时,系统临关闭前会将所有内存内容写入hiberfil.sys文件.当你重新打开电脑时,系统在将hiberfil.sys文件内 ...

  4. tomcat 内存大小配置

    Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机.JAVA程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序.这个初始内存和最大内存在一定程度都会 ...

  5. YYModel学习总结YYClassInfo(1)

    OC的run-time 机制,简直像是网络上的猫! 我在开发中很少用到,但是作为iOS开发 人家肯定会问这个东西,所以深入的学习了下. 对于 run-time的入手,YYModel的学习,简直让人美滋 ...

  6. 百度地图JS调用示例

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  7. jQuery Mobile 所有data-*选项,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) jQuery Mobile事件全解 jQuery Mobile 所有class选项 jQuery Mobile 所有data-*选项 jQuery Mobile 所 ...

  8. NDK Jni 开发(1)

    1. 学习地址 http://my.oschina.net/lifj/blog/177087 http://www.cnblogs.com/devinzhang/archive/2012/02/29/ ...

  9. C#如何连接wifi和指定IP

    大家好哈,这是我第一次写博客,我也是才大一结束,自学了10多天C#,有不对的欢迎大家指正,最近因为项目的事而被Wifi和IP折磨了很久,后来借用了一下外国人的SimpleWifi.dll 再自己写了一 ...

  10. WPF 设置输入只能英文

    有时输入只能让用户输入英文,那么如何设置输入只能英文? 首先在xaml 写一个 TextBox ,给他一个名字. <TextBox x:Name="txt"></ ...