python的迭代器,可迭代物件,生成器理解
阿新 • • 發佈:2018-11-03
上篇文章, python itertools 裡面實現的groupby方法。裡面用到了object, id, iter等很基礎的方法, 看的有點暈。這裡重新整理一下迭代器,可迭代物件, 生成器。複習一下,加深印象。
python語言很容易上手。比如for迴圈。
a = [1, 2, 3, 4]
for i in a:
print(i)
不需要獲取key, 直接就遍歷了一遍。但是其他語言呢?比如c?
a_list = [1, 2, 3, 4]
for(int i=0; i<a_list.length(); i++)
printf(a_list[i])
其他的語言都是用下標來遍歷物件的, 如果你覺得python的語言底層可能用的是下標,那麼你可以自行嘗試一下集合。這裡要說明的是,只有字串,列表,元組是滿足下標,也就是序列的情況,而字典,集合,檔案這些都不滿足。但是他們都可以用for迴圈來一個一個的取出來,why?
因為它們不是用的序列來取的!!!可以用for迴圈的容器(列表,集合,字典,元組…),說明它們是可迭代物件, 想取出來它們裡面的值,你得用迭代器的方法來取。
迭代器物件就是一個一個的取數,一旦變成迭代器,資料就是一次性的,就只能取一次,下次取還需要重新從列表裡面再次生成迭代器物件。
可迭代物件通過iter方法,就可以變成一個迭代器,變成迭代器之後,就可以通過next的方法來取數,next一次可以取出來一個數,如果取完了, 會觸發StopIteration。 for 迴圈裡面會判斷,如果發現觸發了StopIteration,就直接return.
迭代器說完了就得說生成器。生成器就是特殊的迭代器,生成器無非就是更優雅一點,說白了,如果讓你自己實現for迴圈,你不需要再用iter 和 next方法了, 你只需要用一個yield就行了。而如果有值需要返回的時候,你也不用自己append了,你只需要yield要返回的值,就解決了。
not use yield
def something():
result = []
for ... in ...:
result.append(x)
return result
use yield
def iter_something():
for ... in ...:
yield x
再三提醒,生成器和迭代器,它們都是一次性的,如果使用一次之後,它們就為空了!特別需要注意!!!
如果我有沒寫清楚,或者看完後有疑問的地方,歡迎向我提問!
參考:
http://python.jobbole.com/87805/
https://pyzh.readthedocs.io/en/latest/the-python-yield-keyword-explained.html
https://www.jb51.net/article/143757.htm