當前位置:成語大全網 - 新華字典 - 什麽是Python中的生成器推導式

什麽是Python中的生成器推導式

Python中有壹種緊湊的語法,可以通過壹個循環和條件構建壹個列表,這種語法叫做列表推導式(list comprehension): my_list = [ f(x) for x in sequence if cond(x) ] 類似地,我們可以通過字典推導式

Python中有壹種緊湊的語法,可以通過壹個循環和條件構建壹個列表,這種語法叫做列表推導式(list comprehension):

my_list = [ f(x) for x in sequence if cond(x) ]

類似地,我們可以通過字典推導式(dictionary comprehension)創建字典,通過集合推導式(set comprehension)創建集合:

my_dict = { k(x): v(x) for x in sequence if cond(x) }

my_set = { f(x) for x in sequence if cond(x) }

(這壹語法支持更加復雜的操作,但這裏僅作示例)

最後,妳還可以使用類似的語法創建壹個生成器:

my_generator = ( f(x) for x in sequence if cond(x) )

不過,這並不叫做生成器推導式,而是叫做生成器表達式(generator expression)。為什麽不叫前者呢?如果前三個語法都被稱為“推導式”,為什麽生成器這個不叫呢?

PEP 289 —— 生成器表達式 的最後給出了詳細的備註,其中指出Raymond Hettinger起初提議使用“生成器推導式(generator comprehension)”壹詞,後來Peter Norvig提出了“累計顯示(accumulation displays)”,後來Tim Peters推薦了“生成器表達式”這個

名詞。但是它並沒有名詞出現了這樣的變化。

EarlGrey:上面提到的這幾位都是大牛啊!具體大家可以谷歌壹下。

所以我在Twitter上提出了這個問題:

python 有個我不懂的問題:為什麽它們被稱為“生成器表達式”,而不是“生成器推導式”?

Guido的回答指出了核心原因:

推導式壹開始屬於“字面量顯示(literal display)”這壹概念。而生成器表達式不是壹種顯示(display)。

Matt Boehm後來找到了Tim Peters提出“生成器表達式”壹詞的郵件,其中講述了壹些細節:

讀完郵件後,我對這個問題的理解更深了。首先,為什麽會使用“推導式”(comprehension)壹詞?Tim在郵件中指出,這個詞來源於集合論中的推導公理(Axiom of Comprehension),它指的是通過對另壹個集合的元素應用某個謂詞(predicate,即條

件)而組成新的集合。這和向另壹個序列中的元素應用某個條件從而生成列表的做法非常類似。

EarlGrey:我之前看到很多翻譯為“解析”,看到這裏才覺得“推導式”才是更準確的說法。

正如Guido所指出的,Python的設計者當時更註重的是顯示,而不是條件。“顯示”壹詞在這裏意味著代碼的語法看上和它將創建的數據結構很像。列表顯示(列表推導式)看上去像壹個列表。對於集合和字典顯示來說,也是壹樣的道理。但是由於沒有生成器

字面量語法,因此根本就沒有壹個生成器顯示可以進行對比,也就不存在生成器顯示了。

在設計該功能的那封郵件中,“推導式”壹次是“顯示”的同義詞,由於生成器沒有顯示,所以也不可能有推導式。

不過Time在他的郵件中也說到,推導式的奇妙之處在於條件。推導公理的核心則是謂語。也許是因為Python推導式中的條件是可選的,關註的焦點被轉移到了顯示方面。

但是我認為,我們應該叫它們“生成器推導式”。我們在描述這類語法時,並沒有使用“顯示”壹詞。我們沒有理由將“推導式”與“顯示”和字面量語法聯系在壹起。

列表推導式、字典推導式、集合推導式和生成器表達式,這四個表達式各自之間有著許多相似之處。如果將四者之間的類似點總結為“推導式”,將極大地簡化相關概念。它們之間的相似點遠大於不同之處,我建議大家對這四個表達式使用同樣的概念