📄 一句话概括
同一件事四种写法——for 循环 3 条语句、生成器推导 1 条、map+filter 2 条、类 2 条,结果都是 220;今天主流语言里两种范式并存,选哪种只看手上这件事。
📝 本节和前面几节的关系
正文十二章讲完面向对象。附章换一个范式:函数式。先说明为什么它值得单独讲。
一、实测:同一件事的四种写法
for 循环:3 条语句、2 个中间变量(total 与 i)。 生成器推导:1 条语句、0 个中间变量。 map+filter:2 条语句、2 个中间变量。 类:2 条语句、1 个状态(self.n)。 四种写法算出来都是 220。
二、为什么叫【混合时代】
三十年前要在两者里选一个:学 Smalltalk 还是学 Lisp,两条路。 今天不用选了:Python、Java、C#、JavaScript 四门主力语言都同时装着两套。 所以这不是【新范式替代旧范式】,是同一个工具箱里多了一把扳手。
三、这一章要讲什么
7 个特征(A.2~A.9 逐条讲、A.10 总结)、分类(A.11)、优势与课题(A.12~A.13)、与面向对象的关系(A.14)、怎么上手(A.15)。 注意不要求你改用函数式——要求你能认出它、在合适的地方用它。 判断依据还是那一条:这地方是要【管状态】还是要【做变换】?
四、动手 Demo:面向对象编程语言和函数式语言混合占据主流的时代
同一件事四种写法,用 ast 数语句条数。 确认四种结果一致。
import ast, inspect, textwrap
def nstmt(fn):
tree = ast.parse(textwrap.dedent(inspect.getsource(fn)))
return len(tree.body[0].body)
def for_way():
total = 0
for i in range(1, 11):
if i % 2 == 0:
total += i * i
return total
def comp_way():
return sum(i * i for i in range(1, 11) if i % 2 == 0)
print(nstmt(for_way), nstmt(comp_way)) # 3 1
print(for_way(), comp_way()) # 220 220
实跑输出:
--------------------------------------------------------------------
面向对象编程语言和函数式语言混合占据主流的时代
--------------------------------------------------------------------
同一件事(1~10 里偶数的平方和)四种写法,**量语句条数与中间变量:**
写法 语句条数 中间变量 结果
-----------------------------------------------
for 循环 3 2 220
生成器推导 1 0 220
map+filter 2 2 220
类 2 1 220
四种写法结果一致 True
语句最少的 生成器推导
中间变量最少的 生成器推导
**四种写法算出的都是 220**——**这就是【混合时代】的实际样子:**
**同一个语言里,面向对象和函数式并存,选哪种只看你手上这件事。**
**注意推导式那行【0 个中间变量】**——它不声明任何东西,**只描述【要什么】。**
实测:四种写法结果都是 220,语句从 3 条降到 1 条,中间变量从 2 个降到 0 个。 今天的语言同时装着两套,所以这是【多一把扳手】,不是【换一套工具】。 选哪套只看一件事:这地方是要管状态,还是要做变换。
30 秒实验
- 挑你最近写的一个 for 循环,用推导式重写一遍,看能少几个中间变量。
- 再挑一个必须保存状态的场景(例如购物车),想想为什么那里用类更合适。
常见误区
- 以为函数式是新东西。Lisp 比 Java 还老。
- 以为学了函数式就要放弃面向对象。主流语言两种都装着,用哪个看场合。
自测三问(点开对答案)
1. 同一件事四种写法各几条语句? —— for 循环 3 条、生成器推导 1 条、map+filter 2 条、类 2 条,结果都是 220。 2. 为什么叫混合时代? —— Python/Java/C#/JavaScript 这些主力语言同时支持两种范式,不用二选一。 3. 选哪种范式的判断依据? —— 这地方是要管状态(用对象),还是要做变换(用纯函数)。- ☐ A.2 函数式语言的7个特征
相关笔记
- 享受需要动脑的软件开发 — 全书收口
- 函数式语言的7个特征 — 本章提纲
- 函数式语言和面向对象的关系 — 两者的分工
- 🧩 面向对象是怎样工作的 · 索引