高阶函数与箭头函数:函数也是一等公民
函数是"值"
在 Python 和 JS 里,函数不是什么特殊的东西——它就是一个值,和数字、字符串一样。你可以把它赋给变量、放进列表、当参数传递。
加载代码编辑器中……
像这样能被当作"值"传来传去的函数,叫一等公民(first-class citizen)。Python 和 JS 都支持这个特性。
高阶函数
高阶函数就是"操作函数的函数"——它接受函数作为参数,或者返回一个函数。
加载代码编辑器中……
踩坑提醒
JS 的 .sort() 有一个著名的坑:默认按字符串排序!
[10, 9, 80].sort() // [10, 80, 9] 😱
因为它把数字转成字符串再比较——"10" < "80" < "9"。对数字排序必须传比较函数:.sort((a, b) => a - b)。漏了比较函数,结果会非常离谱。
匿名函数 / Lambda
有时候函数只用一次,不值得取名字。两种语言都有匿名函数的写法:
加载代码编辑器中……
箭头函数语法速查
JS 的箭头函数有好几种简写形式:
// 完整形式
const add = (a, b) => { return a + b }
// 单行表达式可以省略 {} 和 return
const add = (a, b) => a + b
// 单参数可以省略 ()
const double = x => x * 2
// 无参数要写 ()
const sayHi = () => console.log("Hi!")
| Python lambda | JS 箭头函数 | |
|---|---|---|
| 语法 | lambda x: x * 2 | x => x * 2 |
| 多行 | ❌ 不行 | ✅ 可以用 {} |
| 多参数 | lambda a, b: a + b | (a, b) => a + b |
Python 的 lambda 刻意设计成只能一行——Guido(Python 创造者)认为多行匿名函数会降低可读性。JS 的箭头函数没有这个限制。
回调函数
把函数当参数传给另一个函数,让它"在合适的时候回来调用",这就是回调(callback):
加载代码编辑器中……
回调在 JS 中极其常见——事件处理、网络请求、定时器都用回调。Python 中相对少见,Python 更喜欢用生成器和 async/await。
🏋️AI 练习
写一个 retry(func, times) 高阶函数:
- 接受一个函数
func和重试次数times - 调用
func(),如果返回结果包含 "error",就重试 - 最多重试
times次 - 返回最终的结果
提示:这里的 func 可以是一个模拟网络请求的函数,随机返回 "success" 或 "error"。
小结
| 概念 | Python | JavaScript |
|---|---|---|
| 函数是值 | ✅ 一等公民 | ✅ 一等公民 |
| 匿名函数 | lambda x: expr | (x) => expr |
| 匿名函数多行 | ❌ | ✅ (x) => { ... } |
| 回调模式 | 有,但不常见 | 极其常见 |
| sort 默认 | 数值排序 ✅ | 字符串排序 ⚠️ |
一句话:函数能当"值"传来传去,是现代编程的核心理念。 Python 的 lambda 简单纯粹,JS 的箭头函数灵活多变。