迭代是數據處理的基石 掃描內存中放不下數據集時候, 我們要找到一種惰性獲取數據項方式, 即按需一次獲取一個數據項.
這就是迭代器
Python2.2在2001年加入了yield關鍵字 這個關鍵字用於構建生成器, 其作用與迭代器一樣
值得一提的是在Python3中 range()返回的是一個類似生成器的對象 而Python2則是list(這點在我之前那篇淺談面試阿里外包的面試文章中有提到)
所有Python程序員都知道序列可以迭代.!
原因是iter函數 解釋器需求要迭代對象時會自動調用iter(x)
我們所有的所有循環 for while 都是默認... iter取值的
內置的iter函數有這幾個作用
1. 檢查是否實現了__iter__方法, 有則調用並獲取迭代器
2. 如果沒實現__iter__方法, 但是實現了__getitem__方法, python會自動創建1
3. 捕獲異常機制 通常會提醒C object is not iterable 對象不可迭代!
任何python的序列都實現了__iter__我們所用的list, 元組, 集合, 字符串 dict 其實也都是class(所以我們都是站在巨人肩膀上開發的因爲我們用着前輩們給定義好的方法, 這些方法提供了我們日常工作的便利)
而for 和while 每次循環可迭代對象時 都會獲取迭代器只是我們看不到
這裏值得一提的是,, for循環自帶捕獲異常, 而while不帶
爲什麼提示StopIteration這個錯誤..
是因爲next 獲取下一個值時已經發現沒有字符了
標準的迭代都存在兩個方法.!
__next__返回一個可用的元素, 如果沒有... 就拋stopiteration
__iter__返回 self 在應該使用迭代時候使用迭代器
迭代器只有 next 和iter兩個方法 所以除了調用陪next() 方法, 以及捕獲異常StopIteration
迭代器
迭代器是這樣的對象:實現了無參數__next__方法, 返回序列中的下一個元素; 如果沒有元素了. 那麼拋出StopIteration異常,
python中跌大氣還實現了__iter__方法 因此迭代器也可以迭代
現在我們再看看生成器還是上面的代碼爲例子
效果是一樣的
只要在python函數中定義yield關鍵字, 該函數就是生成器函數. 調用生成器函數時, 會返回一個生成器對象. 也就是說 生成器函數是生成器工廠
之前我有一篇文章map高階函數的替代者... 就是列表推導式!!! 但是列表推導式也不要寫的特別複雜.
如果複雜最好還是加上註釋這是用來做什麼的. 如果過於複雜建議還是用函數來代替
列表推導式返回的是生成器! 不是list