📄 一句话概括
函数能赋给变量、放进列表、当参数传、当返回值——四件事全部成立;它和普通值只差【能不能调用】,而传函数就是【把一段做法当参数交出去】。
📝 本节和前面几节的关系
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 秒实验
- 用
sorted(key=...)把一组字典按第二个字段排一遍。 - 再写一个返回函数的函数,体会【把做法交出去】。
常见误区
- 以为函数是特殊的东西。在函数式语言里它就是普通值。
- 以为传函数一定比传对象好。有状态的地方,传对象更清楚。
自测三问(点开对答案)
1. 函数能当值用体现在哪四件事? —— 赋给变量、放进列表、当参数传、当返回值。 2. key=abs 传的是什么? —— 一段做法(怎么比较),不是数据。 3. 传函数与传对象的区别? —— 传函数只有做法;传对象是做法加数据。- ☐ A.6 特征4:可以灵活组合函数和参数
相关笔记
- 特征2:所有表达式都返回值 — 上一条
- 特征4:可以灵活组合函数和参数 — 用这条去组合
- 三大要素之二:实现调用端公用化的多态 — 面向对象的对应物
- 🧩 面向对象是怎样工作的 · 索引