一篇文章看懂 Python iterable, iterator 和 generato
Python 中的 iterable, iterator 以及 generator,一直是非常親密但是難以區分的概念。nvie 有一個很好的 帖子闡述了它們之間的關係,但是內容偏向於概括和總結,對於新手來說仍然難以理解。Fluent Python 的第 14 章也有非常好的演繹,但是我認為它對「為什麼要有這種語言特性」缺乏闡釋。我試圖從演變的角度,總結這些概念的來源和演化,以得到一個符合邏輯和容易理解的版本。 Simple Loop幾乎每一個 Python 入門教程,都會用類似下面的程式碼來講述最簡單的
在 Python 中,執行
Python 內建的大多數容器型別( Lazy Evaluation在上面的程式碼例子中,
前輩們提出了惰性求值( Lazy Evaluation )來解決這個問題。有些地方也叫它「延遲載入」「懶載入」等。它的基本理念是「按需載入」,在上面的例子中,可以將取資料過程變成一頁頁取,比如先取 100 條資料進行處理,處理完後再取下一個 100 條,直至全部取完。 The Iterator ProtocolPython 為了在語言層面支援 lazy evaluation,給出了 iterator 協議。如果一個類實現了
那麼這個類即支援 iterator 協議。於是「按需載入」,即可以通過每次 Enhanced iterable上文中的 可以看到有 is not iterable 的報錯。按上一節的描述,早期的 Python 僅在一個類有
那麼對於一個 iterator,如果你想能在 Generator Function上面雖然花了挺大篇幅講述 iterator 的機制,但是事實上 Python 中以 識別 generator 的標誌在 上面的
這套規則清晰直觀,可以將它套用在上面程式碼中驗證一下。 Generator Expression試試執行下面的程式碼: 後兩種寫法,跟第一種有什麼區別呢?後兩種即是 generator expression,是一種方便生成 generator 的語法糖,形式上是用括號包裹的 list comprehension。背後的理念大概是這樣:list comprehension 是用來生成元素的,generator 也是用來生成元素的,那為什麼不提供一種類似 list comprehension 語法的 expression 來表示 generator 呢?它跟下面的程式碼是等價的: 至於第三種寫法為啥不用括號包起來,是 Python 為了可讀性故意設計的,如果作為唯一的函式引數使用,則可以省略。 總結定義上:
語言機制上:
它們之間的關聯:
文:giy.hkv更多人工智慧相關文章:http://siligence.ai |
<