1994:Python 1.0 問世——lambda、map、filter、reduce#
事件#
1994 年 1 月,Python 1.0 正式發佈。這個版本最重要的新增是四個函式式工具:lambda(匿名函式)、map、filter、reduce(1994 年加入 functools 化之前為內建)。同年,首屆 Python 工作坊在美國馬里蘭州召開,社群正式成形。
為何重要#
- 函式式語法的第一次進入:這是 Python 第一次從「純命令式腳本語言」跨界吸收函式式程式設計(FP)的傳統。
reduce的命運:有趣的是,reduce因被認為「可讀性差、誘導聰明但難懂的程式碼」,在 2008 年 Python 3.0 被移出內建(移入 functools)——這正是 Python「可讀性優先」哲學的具體展現。
理論與實用原因#
- 理論原因:源自 LISP(1958) 與 APL/SASL 傳統的高階函式(higher-order function)理論——把「對集合做映射/過濾/摺疊」抽象成通用操作,取代手寫 for 迴圈,減少樣板程式碼與索引錯誤。
- 實用原因:社群需求——1990 年代 Python 用戶(科學家、系統管理者)常常需要對列表做轉換與過濾;
map/filter配合 C 實作的內建函式,比手寫迴圈更快。
彌補了什麼缺陷#
彌補了 Python 0.9「只能靠手寫迴圈處理集合轉換」的缺陷;lambda 彌補了「為一個小操作定義具名函式太繁瑣」的缺陷。
程式範例#
1994 年的四個函式式工具:
xs = [1, 2, 3, 4, 5, 6]
# lambda:匿名函式,免為小操作定義具名函式
double = lambda x: x * 2
# map / filter:高階函式取代手寫迴圈
squares = list(map(double, xs)) # [2, 4, 6, 8, 10, 12]
evens = list(filter(lambda x: x % 2 == 0, xs)) # [2, 4, 6]
# reduce:摺疊整個列表為單一值(3.0 移入 functools)
from functools import reduce
total = reduce(lambda a, b: a + b, xs, 0) # 21
對比手寫迴圈(map/filter 之前的寫法):
squares = []
for x in xs:
squares.append(x * 2) # 樣板碼較多、索引錯誤風險較高
有趣的是,這段 reduce(lambda a, b: a + b, xs) 被社群認為「難懂」,2008 年被移出內建——sum(xs) 更可讀。