🧩 附章 函数式语言是怎样工作的
📄 一句话概括

函数能赋给变量、放进列表、当参数传、当返回值——四件事全部成立;它和普通值只差【能不能调用】,而传函数就是【把一段做法当参数交出去】。

📝 本节和前面几节的关系

A.4 说一切皆值,这一节说函数也是值——这是函数式的全部入口。

一、实测四件事

赋给变量:f = abs,f(-3) 得 3。 放进列表:[abs, len, str.upper],三个都能调。 当参数传:sorted(xs, key=abs) 按绝对值排。 当返回值:make() 返回 abs,make()(-7) 得 7。

二、传函数到底传了什么

传的不是数据,是【一段做法】。 所以 key=abs 的意思是【按什么排由你决定】——排序的流程不动,判断标准交出去。 这是最省事的一种扩展:不用改函数,只换参数。

三、和面向对象对照

面向对象传的是对象:一组做法加一组数据,一起交出去。 函数式传的是函数:只有做法,没有数据。 所以前者适合【这东西有状态】,后者适合【这一步怎么算】——分界线还是那条。

四、动手 Demo:特征3:将函数作为值进行处理

四种用法各验一次。 确认函数与普通值只差能否调用。

f = abs
box = [abs, len, str.upper]

def make():
    return abs

print(f(-3))                              # 3
print(len(box))                           # 3
print(sorted([-3, 1, -2], key=abs))       # [1, -2, -3]
print(make()(-7))                         # 7

实跑输出:

--------------------------------------------------------------------
特征3:将函数作为值进行处理
--------------------------------------------------------------------

  【函数是值】意味着它能出现在变量能出现的任何地方。实测四件事:

  用法         实测
  --------------------------------------------------------
  赋给变量     f = abs,f(-3) = 3
  放进列表     [abs, len, str.upper] 有 3 个元素
  当参数传     sorted([-3, 1, -2], key=abs) = [1, -2, -3]
  当返回值     make()(-7) = 7

      四件事全部成立              是
      函数与普通值的差别          只差【能不能调用】

  **函数一旦是值,就能被【传来传去】**——**传函数就是把【一段做法】当参数交出去。**
  **这是函数式的全部入口**:后面 4、6 两个特征都建在这一条上。
  **面向对象里对应的是【传对象】——传的是一组做法加一组数据。**

实测:赋值、装列表、当参数、当返回值,四件事全部成立。 传函数传的是【一段做法】——所以 key=abs 只是把判断标准交出去。 面向对象传对象(做法+数据),函数式传函数(只有做法)。

30 秒实验

  1. 用 sorted(key=...) 把一组字典按第二个字段排一遍。
  2. 再写一个返回函数的函数,体会【把做法交出去】。

常见误区

  1. 以为函数是特殊的东西。在函数式语言里它就是普通值。
  2. 以为传函数一定比传对象好。有状态的地方,传对象更清楚。
自测三问(点开对答案) 1. 函数能当值用体现在哪四件事? —— 赋给变量、放进列表、当参数传、当返回值。 2. key=abs 传的是什么? —— 一段做法(怎么比较),不是数据。 3. 传函数与传对象的区别? —— 传函数只有做法;传对象是做法加数据。

相关笔记