跳轉到

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) 更可讀。

相關條目#