1. 程式人生 > >python 基礎篇 13 叠代器與生成器

python 基礎篇 13 叠代器與生成器

IT 可叠代對象 rabl 數據 一個 ron 回顧 font 打印

13. 前??能-叠代器和?成器
本節主要內容:
1. 叠代器
2. ?成器

?. 叠代器
我們之前?直在?可叠代對象進?叠代操作. 那麽到底什麽是可叠代對象. 本?節主要討
論可叠代對象. ?先我們先回顧?下?前我們所熟知的可叠代對象有哪些:
str, list, tuple, dict, set. 那為什麽我們可以稱他們為可叠代對象呢? 因為他們都遵循了可
叠代協議. 什麽是可叠代協議. ?先我們先看?段錯誤代碼:

技術分享圖片

註意看報錯信息中有這樣?句話. ‘int‘ object is not iterable . 翻譯過來就是整數類型對象
是不可叠代的. iterable表?可叠代的. 表?可叠代協議. 那麽如何進?驗證你的數據類型是否
符合可叠代協議. 我們可以通過dir函數來查看類中定義好的所有?法.

技術分享圖片

我們發現在字符串中可以找到__iter__. 繼續看?下list, tuple, dict, set

我們發現這?個可以進?for循環的東?都有__iter__函數, 包括range也有. 可以??試?
.
綜上. 我們可以確定. 如果對象中有__iter__函數. 那麽我們認為這個對象遵守了可叠代協議.
就可以進?叠代. 這?的__iter__是幫助我們獲取到對象的叠代器. 我們使?__next__()來獲取
到?個叠代器中的元素. 那麽我們之前講的for的?作原理到底是什麽? 繼續看代碼

技術分享圖片

?. ?成器
什麽是?成器. ?成器實質就是叠代器.
python中有三種?式來獲取?成器:
1. 通過?成器函數
2. 通過各種推導式來實現?成器
3. 通過數據的轉換也可以獲取?成器
今天, 我們主要使??成器函數來完成?成器的創建和使?.
?先, 我們先看?個很簡單的函數:

技術分享圖片

技術分享圖片

運?的結果和上?不?樣. 為什麽呢. 由於函數中存在了yield. 那麽這個函數就是?個?成器
函數. 這個時候. 我們再執?這個函數的時候. 就不再是函數的執?了. ?是獲取這個?成器.
如何使?呢? 想想叠代器. ?成器的本質是叠代器. 所以. 我們可以直接執?__next__()來執?
以下?成器.

技術分享圖片

技術分享圖片

技術分享圖片

示例:

當程序運?完最後?個yield. 那麽後?繼續進?__next__()程序會報錯.
好了?成器說完了. ?成器有什麽作?呢? 我們來看這樣?個需求. 公司向JACK JONES
10000套學?服. JACK JONES就比較實在. 直接造出來10000套衣服.

技術分享圖片

但是公司現在沒那麽多人啊,你一下給我一萬套我沒地方存啊,很尷尬,

最完美的就是我用一套 你給我一套

技術分享圖片

區別: 第?種是直接?次性全部拿出來. 會很占?內存. 第?種使??成器. ?次就?個. ?多
少?成多少. ?成器是?個?個的指向下?個. 不會回去, __next__()到哪, 指針就指到哪?.
下?次繼續獲取指針指向的值.

---->>>> send和__next__區別<<<<<-----

技術分享圖片

第一次執行必須用__next__

技術分享圖片

這個比較亂,可以自己運行一下看看結果 先打印 然後打印yield返回值 然後send傳值進上一個yield 打印出來

python 基礎篇 13 叠代器與生成器