久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

聯(lián)合迭代器與生成器,這個(gè)內(nèi)置函數(shù)真香,!

 黃爸爸好 2021-08-28

圖片

花下貓語(yǔ):Python 中很多內(nèi)置函數(shù)的作用都非常大,,比如說(shuō) enumerate() 和 zip(),它們使得我們?cè)谧鞯僮鲿r(shí)極為順手,。這是一篇很多年前的 PEP,,提議在 Python 2.3 版本中引入 enumerate(),該文檔整合了其它幾篇 PEP 的想法(包括當(dāng)時(shí)新引入的迭代器與生成器),,提出了更好的實(shí)現(xiàn)方案以及函數(shù)名,。經(jīng)過(guò)這么多年的發(fā)展,enumerate() 不可避免地有了一些變化,,但不變的是,,它跟 19 年前一樣,還是很有必要,、很好用,,用著真香!


PEP原文:https://www./dev/peps/pep-0279
PEP標(biāo)題:The enumerate() built-in function
PEP作者:Raymond Hettinger
創(chuàng)建日期:2002-06-30
合入版本:2.3
譯者:豌豆花下貓@Python貓

PEP翻譯計(jì)劃:https://github.com/chinesehuazhou/peps-cn

摘要

本 PEP 引進(jìn)了一個(gè)新的內(nèi)置函數(shù) enumerate() 來(lái)簡(jiǎn)化常用的循環(huán)寫法,。它為所有的可迭代對(duì)象賦能,,作用就像字典的 iteritems() 那樣——一種緊湊、可讀,、可靠的索引表示法,。

基本原理

Python 2.2 在 PEP 234[3] 中提出了可迭代對(duì)象接口的概念。iter() 工廠函數(shù)作為一種通用的調(diào)用約定而被提出,,深入修改了迭代器的使用方式,,作為整個(gè) Python 的統(tǒng)一規(guī)范。這種統(tǒng)一的規(guī)范就是為映射類型,、序列類型和文件對(duì)象建立一個(gè)通用的可迭代對(duì)象接口,。

PEP 255[1] 中提出的生成器是作為一種更容易創(chuàng)建迭代器的方法引入的,特別是具有復(fù)雜的內(nèi)部執(zhí)行過(guò)程或變量狀態(tài)的迭代器,。有了生成器以后,,PEP 212[2] 中關(guān)于循環(huán)的計(jì)數(shù)器的想法就有可能改進(jìn)了。

那些想法是提供一種干凈的迭代語(yǔ)法,,帶有索引和值,,但不適用于所有的可迭代對(duì)象。而且,,那種方法沒有生成器提供的內(nèi)存友好的優(yōu)點(diǎn)(生成器不會(huì)一次性計(jì)算整個(gè)序列),。

(Python貓注:關(guān)于生成器的 PEP 也有翻譯,請(qǐng)點(diǎn)擊查看 PEP-255,、PEP-342,、PEP-380

新的提議是添加一個(gè)內(nèi)置函數(shù) enumerate(),,在有了迭代器和生成器以后,它就可以實(shí)現(xiàn),。它為所有的可迭代對(duì)象賦能,,作用就像字典的 iteritems() 那樣——一種緊湊、可讀,、可靠的索引表示法,。像 zip() 一樣,它有望成為一種常用的循環(huán)習(xí)語(yǔ)(idiom),。

(Python貓注:zip() 函數(shù)非常強(qiáng),,推薦閱讀《一篇文章掌握 Python 內(nèi)置 zip() 的全部?jī)?nèi)容》)

這一提議的目的是利用現(xiàn)有的實(shí)現(xiàn),再加一點(diǎn)點(diǎn)的努力來(lái)整合,。它是向后兼容的,,不需要新的關(guān)鍵字。本提案將合入 Python 2.3,,不需要從 __future__ 中導(dǎo)入,。

新內(nèi)置函數(shù)的規(guī)范

def enumerate(collection):
   'Generates an indexed series:  (0,coll[0]), (1,coll[1]) ...'
   i = 0
   it = iter(collection)
   while 1:
      yield (i, it.next())
      i += 1

注A:PEP 212 循環(huán)計(jì)數(shù)器迭代[2]討論了幾個(gè)實(shí)現(xiàn)索引的提議。有些提議只適用于列表,,不像上面的函數(shù)適用于任意生成器,、xrange、序列或可迭代對(duì)象,。

另外,,那些提議是在 Python 2.2 之前提出并評(píng)估的,但是 Python 2.2 沒有包含生成器,。因此,,PEP 212 中的非生成器版本有一個(gè)缺點(diǎn),即會(huì)用一個(gè)巨大的元組列表,,導(dǎo)致消耗太多內(nèi)存,。

這里提供的生成器版本快速且輕便,適用于所有可迭代對(duì)象,,并允許用戶在不浪費(fèi)計(jì)算量的情況下中途放棄,。

還有一些涉及相關(guān)問(wèn)題的 PEP:整型迭代器、整型 for 循環(huán),,以及一個(gè)修改 range 和 xrange 的參數(shù)的 PEP。enumerate() 提案并不排斥其它提案,,即使那些提案被采納,,它仍然滿足一個(gè)重要的需求——對(duì)任意可迭代對(duì)象中的元素進(jìn)行計(jì)數(shù)的需求。

其它的提案給出了一種產(chǎn)生索引的方法,,但沒有相應(yīng)的值,。如果給定的序列不支持隨機(jī)訪問(wèn),,比如文件對(duì)象、生成器或用__getitem__定義的序列,,這就特別成問(wèn)題,。

注B:幾乎所有的 PEP 審閱人都?xì)g迎這個(gè)函數(shù),但對(duì)于“是否應(yīng)該把它作為內(nèi)置函數(shù)”

存在分歧,。一方提議使用獨(dú)立的模塊,,主要理由是減緩語(yǔ)言膨脹的速度。

另一方提議使用內(nèi)置函數(shù),,主要理由是該函數(shù)符合 Python 核心編程風(fēng)格,,適用于任何具有可迭代接口的對(duì)象。正如 zip() 解決了在多個(gè)序列上循環(huán)的問(wèn)題,,enumerate() 函數(shù)解決了循環(huán)計(jì)數(shù)器的問(wèn)題,。

如果只允許加一個(gè)內(nèi)置函數(shù),那么 enumerate() 就是最重要的通用工具,,可以解決最廣泛的問(wèn)題,,同時(shí)提高程序的簡(jiǎn)潔性、清晰度和可靠性,。

注C:討論了多種備選名稱:

函數(shù)名分析
iterindexed()五個(gè)音節(jié)太拗口了
index()很好的動(dòng)詞,,但是可能會(huì)跟 .index () 方法混淆
indexed()很受歡迎,但是應(yīng)該避免形容詞
indexer()在 for 循環(huán)中,,名詞讀起來(lái)不太好
count()直接而明確,,但常用于其它語(yǔ)境
itercount()直接、明確,,但被不止一個(gè)人討厭
iteritems()與字典的 key:value 概念沖突
itemize()讓人困惑,,因?yàn)?amap.items() != list(itemize(amap))
enum()簡(jiǎn)練;不及enumerate 清楚,;與其它語(yǔ)言中的枚舉太相似,,但有著不同的含義

所有涉及“count”的名稱還有一個(gè)缺點(diǎn),即隱含著計(jì)數(shù)是從 1 開始而不是從 0 開始的意思,。

所有涉及“index”的名稱與數(shù)據(jù)庫(kù)語(yǔ)言的用法沖突,,數(shù)據(jù)庫(kù)的索引表示一種排序操作,但不是線性排序,。

注D:在最初的提案中,,這個(gè)函數(shù)帶有可選的 start 和 stop 參數(shù)。GvR 指出,,函數(shù)enumerate(seqn,4,6) 還有一種看似合理的解釋,,即返回序列的第 4 和第 5 個(gè)元素的切片。為了避免歧義,這兩個(gè)可選參數(shù)被摘掉了,,盡管這意味著循環(huán)計(jì)數(shù)器失去了部分的靈活性,。

在從 1 開始計(jì)數(shù)的常見用例中,這種可選參數(shù)的寫法很有用,,比如:

for linenum, line in enumerate(source,1):  print linenum, line

(Python貓注:這篇文檔說(shuō) enumerate 沒有起止參數(shù),,然而,在后續(xù)版本中(例如我用的 3.9),,它支持使用一個(gè)可選的 start 參數(shù),!我暫未查到這個(gè)變更是在何時(shí)加入的,如有知情者,,煩請(qǐng)告知我,,以便修正!)

GvR 評(píng)論道:

filter 和 map 應(yīng)該 die,,被納入列表推導(dǎo)式,,不增加更多的變體。我寧可引進(jìn)做迭代器運(yùn)算的內(nèi)置函數(shù)(例如 iterzip,,我經(jīng)常舉的例子),。

我認(rèn)可用某種方法并行地遍歷序列及其索引的想法。把它作為一個(gè)內(nèi)置函數(shù),,沒有問(wèn)題,。

我不喜歡“indexed”這個(gè)名字;形容詞不是好的函數(shù)名,??梢杂?iterindexed() ?

Ka-Ping Yee 評(píng)論道:

我對(duì)你的提議也很滿意……新增的內(nèi)置函數(shù)(傾向于用“indexed”)是我期盼了很久的東西。

Neil Schemenauer 評(píng)論道:

新的內(nèi)置函數(shù)聽起來(lái)不錯(cuò),。Guido 可能會(huì)擔(dān)心增加太多內(nèi)置對(duì)象,。你最好把它們作為某個(gè)模塊的一部分。如果你用模塊的話,,那么你可以添加很多有用的函數(shù)(Haskell 有很多,,我們可以去“偷”)。

Magnus Lie Hetland 評(píng)論道:

我認(rèn)為 indexed 會(huì)是一個(gè)有用和自然的內(nèi)置函數(shù),。我肯定會(huì)經(jīng)常使用它,。我非常喜歡 indexed();+1,。很高興它淘汰了 PEP-281,。為迭代器添加一個(gè)單獨(dú)的模塊似乎是個(gè)好主意。

來(lái)自社區(qū)的反饋:

對(duì)于 enumerate() 提案,,幾乎 100% 贊成,。幾乎所有人都喜歡這個(gè)想法。

作者的注釋:

在這些評(píng)論之前,,共有四種內(nèi)置函數(shù)被提出來(lái),。經(jīng)過(guò)評(píng)論之后,xmap,、xfilter 和 xzip 被撤銷了,。剩下的一個(gè)對(duì) Python 來(lái)說(shuō)是至關(guān)重要的。Indexed() 非常容易實(shí)現(xiàn),,并且立馬就可以寫進(jìn)文檔,。更重要的是,它在日常編程中很有用,,如果不用它,,就需要顯式地使用生成器。

這個(gè)提案最初包含了另一個(gè)函數(shù) iterzip(),。但之后在 itertools 模塊中實(shí)現(xiàn)成了一個(gè) izip() 函數(shù),。

參考材料

1、PEP 255 Simple Generators http://www./dev/peps/pep-0255
2,、(1, 2) PEP 212 Loop Counter Iteration http://www./dev/peps/pep-0212
3,、PEP 234 Iterators http://www./dev/peps/pep-0234

版權(quán)

本文檔已經(jīng)進(jìn)入公共領(lǐng)域。源文檔:
https://github.com/python/peps/blob/master/pep-0279.txt


重磅,!程序員遇見GitHub交流群已成立,!

額外贈(zèng)送福利資源!邱錫鵬深度學(xué)習(xí)與神經(jīng)網(wǎng)絡(luò),,pytorch官方中文教程,,利用Python進(jìn)行數(shù)據(jù)分析,機(jī)器學(xué)習(xí)學(xué)習(xí)筆記,,pandas官方文檔中文版,,effective java(中文版)等20項(xiàng)福利資源

圖片

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多