1. 程式人生 > >python的迭代器,可迭代物件,生成器理解

python的迭代器,可迭代物件,生成器理解

上篇文章, 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