高阶函数

  • 将函数作为参数
  • 例如
    •  def sum_naturals(n):
      total, k = 0, 1
      while k <= n:
      total, k = total + k, k + 1
      return total
      def sum_cubes(n):
      total, k = 0, 1
      while k <= n:
      total, k = total + k*k*k, k + 1
      return total
      def pi_sum(n):
      total, k = 0, 1
      while k <= n:
      total, k = total + 8 / ((4*k-3) * (4*k-1)), k + 1
      return total
    • 以上三个例子中有许多共同的部分
      • def <name>(n):
        total, k = 0, 1
        while k <= n:
        total, k = total + <term>(k), k + 1
        return total
    • 高阶函数形式
    • def summation(n, term):
      total, k = 0, 1
      while k <= n:
      total, k = total + term(k), k + 1
      return total def cube(x):
      return x*x*x def sum_cubes(x):
      return summation(x,cube)
    • 函数环境
    • 黄金比例
    • def improve(update, close, guess=1):
      while not close(guess):
      guess = update(guess)
      return guess def golden_update(guess):
      return 1/guess + 1 def square_close_to_successor(guess):
      return approx_eq(guess * guess, guess + 1) def approx_eq(x, y, tolerance=1e-15):
      return abs(x - y) < tolerance improve(golden_update, square_close_to_successor)
  • 高阶函数的不足
    • 在全局环境中名称复杂
    • 每一个函数的形参个数是由限制的

函数的嵌套定义

  • 解决高阶函数存在的不足
  • def sqrt(a):
    def sqrt_update(x):
    return average(x, a/x)
    def sqrt_close(x):
    return approx_eq(x * x, a)
    return improve(sqrt_update, sqrt_close)
  • 嵌套定义中的函数作用域
    • 每一个嵌套的函数在定义函数内环境
    • #不是函数的调用处
  • 函数作用域的实现方法
    • 每一个函数都有他的父环境
    • 当函数被调用时,在其父环境中评估
  • 函数作用域的好处
    • 局部环境中的绑定不会影响全局环境
  • def square(x):
    return x * x def successor(x):
    return x + 1 def compose1(f,g):
    def h(x):
    return f(g(x))
    return h square_successor = compose1(square,successor)
    result = square_successor(12)

牛顿法

  • def newton_update(f, df):
    def update(x):
    return x - f(x) / df(x)
    return update def find_zero(f, df):
    def near_zero(x):
    return approx_eq(f(x), 0)
    return improve(newton_update(f, df), near_zero) def square_root_newton(a):
    def f(x):
    return x * x - a
    def df(x):
    return 2 * x
    return find_zero(f, df)

Currying

  • >>> def curried_pow(x):
    def h(y):
    return pow(x, y)
    return h
    >>> curried_pow(2)(3)
    8
    def curry2(f):
    """Return a curried version of the given two-argument function."""
    def g(x):
    def h(y):
    return f(x, y)
    return h
    return g
    def uncurry2(g):
    """Return a two-argument version of the given curried function."""
    def f(x, y):
    return g(x)(y)
    return f
  • 环境图

匿名函数

  • 可以看做

    •        lambda            x            :          f(g(x))
      "A function that takes x and returns f(g(x))"

函数装饰器

  • >>> def trace(fn):
    def wrapped(x):
    print('-> ', fn, '(', x, ')')
    return fn(x)
    return wrapped
    >>> @trace
    def triple(x):
    return 3 * x
    >>> triple(12)
    -> <function triple at 0x102a39848> ( 12 )
    36
    • @trace等同于
    • >>> def triple(x):
      return 3 * x
      >>> triple = trace(triple)

SICP-1.6-高阶函数的更多相关文章

  1. 【SICP归纳】2 高阶函数和数据抽象

    上一篇博文相应的是书中的第一章的一二两节,我们已经大致的有了一种构造的感觉不是么. 书中展示了非常多有趣的句法(syntax). 如今我们要让思想进一步的抽象.写这篇博客的时候并未学完整本书.更不敢说 ...

  2. c#语言-高阶函数

    介绍 如果说函数是程序中的基本模块,代码段,那高阶函数就是函数的高阶(级)版本,其基本定义如下: 函数自身接受一个或多个函数作为输入. 函数自身能输出一个函数,即函数生产函数. 满足其中一个条件就可以 ...

  3. swift 的高阶函数的使用代码

    //: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...

  4. JavaScript高阶函数

    所谓高阶函数(higher-order function) 就是操作函数的函数,它接收一个或多个函数作为参数,并返回一个新函数. 下面的例子接收两个函数f()和g(),并返回一个新的函数用以计算f(g ...

  5. python--函数式编程 (高阶函数(map , reduce ,filter,sorted),匿名函数(lambda))

    1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...

  6. python学习道路(day4note)(函数,形参实参位置参数匿名参数,匿名函数,高阶函数,镶嵌函数)

    1.函数 2种编程方法 关键词面向对象:华山派 --->> 类----->class面向过程:少林派 -->> 过程--->def 函数式编程:逍遥派 --> ...

  7. Scala的函数,高阶函数,隐式转换

    1.介绍 2.函数值复制给变量 3.案例 在前面的博客中,可以看到这个案例,关于函数的讲解的位置,缺省. 4.简单的匿名函数 5.将函数做为参数传递给另一个函数 6.函数作为输出值 7.类型推断 8. ...

  8. Python之路 day3 高阶函数

    #!/usr/bin/env python # -*- coding:utf-8 -*- #Author:ersa """ 变量可以指向函数,函数的参数能接收变量, 那么 ...

  9. JavaScript高阶函数 map reduce filter sort

    本文是笔者在看廖雪峰老师JavaScript教程时的个人总结 高阶函数            一个函数就接收另一个函数作为参数,这种函数就称之为高阶函数          1.高阶函数之map:   ...

  10. js高阶函数

    我是一个对js还不是很精通的选手: 关于高阶函数详细的解释 一个高阶函数需要满足的条件(任选其一即可) 1:函数可以作为参数被传递 2:函数可以作为返回值输出 吧函数作为参数传递,这代表我们可以抽离一 ...

随机推荐

  1. MySQL存储过程_创建-调用

    阅读目录:MySQL存储过程_创建-调用-参数 存储过程:SQL中的"脚本" 创建存储过程 调用存储过程 存储过程体 语句块标签 存储过程的参数 in:向过程里传参 out:过程向 ...

  2. 关于Canvas Rect Transform 设置问题?

    Render Mode: Screen Space - Overlay:将UI放置在场景的上面,调节场景大小或调整分辨率,则Canvas也会随之调整. Screen Space - Camera:Ca ...

  3. TCP/IP协议精华笔记

    1.简介 TCP/IP协议并非单指TCP协议.IP协议,它是一组包括TCP协议和IP协议,UDP(User Datagram Protocol)协议.ICMP(Internet Control Mes ...

  4. 云计算之路-阿里云上:负载均衡错误修改Cookie造成用户无法登录

    最近陆续有用户反馈在我们网站上登录时遇到登录死循环问题.输入用户名与密码提交后,显示登录成功,但跳转到目标网址后(由于依然处于未登录状态)又跳转回登录页面,再次登录,再次这样...就这样一直循环,怎么 ...

  5. webstorm html碎片整理功能

    我们用字符串形式写html模板时,或者向某标签添加html内容时,如下,如果这个str更加的长,一旦里面少了一个单引号,少了一个加号,基本报错还看不懂,一脸懵逼... // 假定后台传给我们的数据为 ...

  6. iOS开发之判断用户是否打开APP通知开关

    一.前言 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是 ...

  7. selenium+python环境的搭建的自动化测试

    一.安装python: 我安装的是2.7.13版本的:可以在CMD下 运行python命令查看是否安装python,以及安装版本: 在https://www.python.org/getit/这个地址 ...

  8. hive网站日志数据分析

    一.说在前面的话 上一篇,楼主介绍了使用flume集群来模拟网站产生的日志数据收集到hdfs.但我们所采集的日志数据是不规则的,同时也包含了许多无用的日志.当需要分析一些核心指标来满足系统业务决策的时 ...

  9. 《安卓网络编程》之第五篇 WebView的使用

    Android提供了WebView组件,,在Android的所有组件中,WebView的功能是最强大的,是当之无愧的老大.WebView组件本身就是一个浏览器实现,她的内核是基于开源WebKit引擎. ...

  10. PATH menu

    先上效果图 主界面布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" ...