跳至內容

列表推導式

出自Taiwan Tongues 台語維基
於 2025年8月23日 (六) 18:32 由 TaiwanTonguesApiRobot留言 | 貢獻 所做的修訂 (從 JSON 檔案批量匯入)

(差異) ←上個修訂 | 已批准修訂 (差異) | 最新修訂 (差異) | 下個修訂→ (差異)

列表推導式(list comprehension), 是程序設計語言的一類語法結構,用佇基於描述創建一个列表(list)資料結構。佮數學上的集合建構式符號。但無仝款 map 佮 filter 函數。

「 list comprehension」無統一的中文譯法。有譯作列表解析式、列表生成式、列表構建、列表理解等。

概述

考慮下述集合建構式符號:


$ S=\ { 二 \ cdot x \ mid x \ in \ mathbb { N } , \ x ^ { 二 } > 三 \ } $

會當讀做:「 $ S $ 是所有「$ 二 $ 乘 $ x $」的數的集合,滿足 $ x $ 是自然數 $ \ mathbb { N } $,並且 $ x $ 的平方大於 $ 三 $。」


$ S=\ { \ underbrace { 二 \ cdot x } _ { \ color { Violet } { \ text { 抹出表鋪式 } } } \ mid \ underbrace { x } _ { \ color { Violet } { \ text { 鋪量 } } } \ in \ underbrace { \ mathbb { N } } _ { \ color { Violet } { \ text { 知入集合 } } } , \ \ underbrace { x ^ { 二 } > 三 } _ { \ color { Violet } { \ text { 鋪排 } } } \ } $
  • $ x $ 是表示輸入集合的成員的變量。
  • $ \ mathbb { N } $ 表示輸入集合,遮是自然數。
  • $ x ^ { 二 } > 三 $ 是人詞表示式,用佇對輸入集篩選。
  • $ 二 \ cdot x $ 是輸出表達式,用佇產生新的集合。
  • $ \ { \ } $ 花括號表示輸出值組成集合。
  • $ \ mid $ 徛槓讀作「滿足」,會當同冒號「:」相換使用。
  • $ , $ 弄號分隔稱詞,會當讀做「並且」。

列表推導式,佮迵天彼个輸入列表迵天代器,照伊一个列表的表示,有仝款的語法構件:

  • 代表輸入列表的成員的一个變量。
  • 一个輸入列表(抑是迵天代器)。
  • 一个可選的人詞(判斷)表達式。
  • 佮對滿足這个判斷的,輸入迵天代者的成員,產生輸出列表的成員的一个表達式。

佇咧 Haskell 的列表推導式語法內底,上述集合建造結構類似的寫做如下:

遮的列表 ` [零 . .] ` 表示 $ \ mathbb { N } $,` x ^ 二 > 三 ` 表示叫詞,而且 ` 二 * x ` 表示輸出表達式。列表推導式,照一个確定的次序,共出結果(佮集合的成員無仝); 並且列表推導式,伊一遍欲成做一个列表的成員,非生成這个列表的全體,對頭前進行的對一个無窮列表的成員的 Haskell 定義。

歷史

佇咧術語「列表推導式」欲用進前,伊就有關係的結構。集合論編程語言 SETL(一九六九年), 是有類似列表推導式的一種形成構造。比如講,這个代碼列印對 ` 二 ` 到 ` N ` 所有的素數:


` ` `

print ( [n in [ 二 . . N] | forall m in { 二 . . n-一 } | n mod m > 零 ] ) ; ` ` `

計算機代數系統 AXIOM(一九七三年), 有處理串流的類似構造。

頭一擺對這種構造的使用術語「推導式」,是佇一九七七年以後,Rod Burstall 和 John Darlington,用佇𪜶的函數式程式語言 NPL 欲描述內底。佇咧 David Turner 的回憶錄《函數式程式語言的一寡歷史》中,伊回想著:


NPL 由 Burstall 用 POP 二實現,並予人 Darlington 用佇咧程序變換的工課(Burstall & Darlington 一千九百七十七)。 這个語言,是一坎、強類型(但無講蓋濟)、 純函數式、傳值調用的。伊閣有「集合表達式」比如講:


` ` `

setofeven ( X ) <=< : x  : x in X & even ( x ) : > ` ` `

佇咧予術語「列表推導式」附加的跤註中,Turner 閣記矣:


我上頭仔叫「ZF 表達式」,參照矣 Zermelo-Frankel 集合論,Phil Wadler 鑄就了閣較好的術語「列表推導式」。

Burstall 和 Darlington 關於著 NPL 的工課,佇一九八空年代影響了真濟函數式的程式語言,但並毋是全部攏包括列表推導式。其中上有影響的,是一九八五年發行的,Turner 的閣愛和人純函數式程式語言 Miranda。後來開發的標準慢性純函數式的語言 Haskell,包括著矣 Miranda 的足濟特徵,包括列表推導式。

Python 示例

Python 語言的列表推導式佮生成器表達式的語法示例:

推廣

並行列表推導式

格拉斯哥 Haskell 編譯器,有一个擴展叫做「並行列表推導式」(嘛叫做拉鏈推導式), 伊允准佇咧列表推導式語法內底,有真濟个獨立分支的限定符 ` <-`。用弄號 ` , ` 分隔的限定符,是依賴的(「 1875套的」); 用管道符號 ` | ` 分隔的限定符,是並行求值的(這無牽連任何形式的多執行緒性,這隻意味著遮的分是予人搝鍊合併的)。

Python 語言的語法示例:

單仔推導式

佇咧 Haskell 中,單仔推導式會列表推導式,推廣為適用佇啥物單。

集合推導式

Python 語言用於生成集合的語法示例:

字典推導式

Python 語言用於生做字典(關聯數組)的語法示例:

類似構造

C + +

C + + 無直接支持列表推導的任何語言特性,但是運算符重載(比如講,重載 |,> >,> >=)已經成功用佇咧為著「1875入式」查詢領域特定語言提供表達式語法。抑是講,會用得使用 erase-remove idiom 來構造列表推導以選擇容器中的元素,並使用 STL 算法 for \ _ each 來轉換𪜶。

參見

  • 程式語言的列表推導式較

延伸閱讀

  • List Comprehension in The Free On-line Dictionary of Computing , Editor Denis Howe .
  • Trinder , Phil . Comprehensions , a query notation for DBPLs . Proceedings of the third international workshop on Database programming languages : bulk types & persistent data , Nafplion , Greece : 五十五–六十八 . 一千九百九十二 .
  • Wadler , Philip . Comprehending Monads . Proceedings of the 一千九百九十 ACM Conference on LISP and Functional Programming , Nice . 一千九百九十 [二千空二十一孵三鋪十六] .(原始內容存檔佇兩千空二十五十一鋪十一).
  • Wong , Limsoon . The Functional Guts of the Kleisli Query System . Proceedings of the fifth ACM SIGPLAN international conference on Functional programming . International Conference on Functional Programming : 一–十 . 兩千 .

參考文獻

外部連結

  • SQL-like set operations with list comprehension one-liners in the Python Cookbook
  • Discussion on list comprehensions in Scheme and related constructs
  • List Comprehensions across languages