跳到主要内容

高阶函数与箭头函数:函数也是一等公民

函数是"值"

在 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 lambdaJS 箭头函数
语法lambda x: x * 2x => 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"。

小结

概念PythonJavaScript
函数是值✅ 一等公民✅ 一等公民
匿名函数lambda x: expr(x) => expr
匿名函数多行(x) => { ... }
回调模式有,但不常见极其常见
sort 默认数值排序 ✅字符串排序 ⚠️

一句话:函数能当"值"传来传去,是现代编程的核心理念。 Python 的 lambda 简单纯粹,JS 的箭头函数灵活多变。