📄 一句话概括
7 个特征逐条拿到 Python 上验:3 个完全具备、3 个部分、1 个没有——最要紧的是【都是表达式】和【没有副作用】这两条,它们才是分水岭。
📝 本节和前面几节的关系
A.1 说明为什么讲,这一节先把 7 条列出来当提纲,A.3~A.9 逐条展开。
一、实测:7 条在 Python 上的判定
完全具备 3 条:用函数编写程序、函数作为值、灵活组合函数与参数。 部分具备 3 条:所有表达式都有值、没有副作用、模式匹配与递归。 不具备 1 条:自动类型推断。 所以 Python 不是函数式语言,是【借了它一半】。
二、两条分水岭
第 2 条【所有表达式都有值】:有语句的语言,代码就不能随便嵌进别处。 第 5 条【没有副作用】:允许随便改东西,就没法保证同输入同输出。 这两条决定了代码能不能【组合】——其余五条都是围绕这两条的配套。
三、怎么用这张表
判断一门语言像不像函数式,只问两句:① 有没有语句?② 允不允许随便改? 判断自己写的东西像不像函数式,也问两句:有没有中间变量?有没有改外面? 注意这不是评分表——是给你一张地图,知道自己在哪。
四、动手 Demo:函数式语言的7个特征
把 7 个特征逐条在 Python 上判一次。 统计【有/部分/没有】各几个。
rows = [("1 用函数编写程序", "有"),
("2 所有表达式都有值", "部分"),
("3 函数作为值", "有"),
("4 灵活组合函数与参数", "有"),
("5 没有副作用", "部分"),
("6 模式匹配与递归", "部分"),
("7 自动类型推断", "没有")]
print(sum(1 for a, b in rows if b == "有")) # 3
print(sum(1 for a, b in rows if b == "部分")) # 3
print(sum(1 for a, b in rows if b == "没有")) # 1
实跑输出:
--------------------------------------------------------------------
函数式语言的7个特征
--------------------------------------------------------------------
把 7 个特征逐条拿到 Python 上验,**看它是【有】【部分】还是【没有】:**
特征 Python 的情况 判定
----------------------------------------------------------------
1 用函数编写程序 def 与 lambda 都有 有
2 所有表达式都有值 if/for/赋值是语句 部分
3 函数作为值处理 能赋值、能传递、能返回 有
4 灵活组合函数与参数 partial/闭包都在 有
5 没有副作用 语言不强制,靠自觉 部分
6 模式匹配与递归 3.10 起有 match,无尾调用优化 部分
7 自动类型推断 动态类型,注解不推断 没有
特征总数 7 个
完全具备 3 个
部分具备 3 个
不具备 1 个
**7 个里只有 3 个是【完全具备】**——**所以 Python 不是函数式语言,是【借了它一半】。**
**最要紧的是第 2 条和第 5 条**:表达式与副作用,**这两条才是函数式的分水岭。**
**后面 7 节逐条展开,就是为了把这两条讲透。**
实测:7 条里完全具备 3 条、部分 3 条、不具备 1 条。 两条分水岭是【都是表达式】和【没有副作用】,其余五条是配套。 所以 Python 是借了函数式一半的语言,不是函数式语言。
30 秒实验
- 用那两句问话(有没有语句/允不允许改)去判一门你熟悉的语言。
- 数一数你今天写的代码里有几个中间变量、几处改了外部对象。
常见误区
- 背 7 个特征当知识点。只记两条分水岭就够用。
- 以为【部分具备】是缺点。工程语言都是妥协出来的。
自测三问(点开对答案)
1. 7 条里 Python 完全具备几条? —— 3 条:用函数编写程序、函数作为值、组合函数与参数。 2. 两条分水岭是哪两条? —— 所有表达式都有值、没有副作用。 3. 怎么快速判断一门语言像不像函数式? —— 问两句:有没有语句、允不允许随便改东西。- ☐ A.3 特征1:使用函数编写程序
相关笔记
- 面向对象编程语言和函数式语言混合占据主流的时代 — 为什么讲这个
- 对7个特征的总结 — 打分版总结
- 特征1:使用函数编写程序 — 第一条展开
- 🧩 面向对象是怎样工作的 · 索引