生成器類似返回值為陣列的乙個函式,這個函式可以接受引數,可被呼叫,但只能產生乙個值,所以大大節省記憶體。
生成器表示式的語法非常簡單,只需要將列表推導式的中括號改成小括號就可以了
1 [x+x for x in range(10) if x%2==0]#會列印出整個列表
[0, 4, 8, 12, 16]
1 (x+x for x in range(10) if x%2==0)#按某種程式規則儲存起來,只隱士的顯示出來
at 0x7fbb230ebe50>呼叫生成器的方法也非常簡單,用迴圈直接打出即可,或用next()函式列印單個元素。但是生成器裡的物件只能被讀取一次,就會從記憶體中消失。
1 g=(x+x for x in range(10) if x%2==0)2for i ing:3
print(i)
0481216
嘗試第二次列印
1for i ing:2
print(i)#
因為被讀取過,所以列印為空
next()獲取
1 c=(x+x for x in range(10) if x%2==0)2 next(c)
1 next(c)
直到呼叫最後乙個物件之後再用next() 會出現stopiteration的報錯。
1、協議是一種約定,可迭代物件實現了迭代器協議,python的內部工具(如for迴圈,sum,min,max函式等)使用迭代器協議訪問物件
(實際for語句的內部實現應該就是首先呼叫物件的__iter__方法,獲取乙個迭代器物件,接著不停的呼叫迭代器物件的__next__方法,迴圈遍歷取值。)
2、可迭代物件:簡單來講可用for迴圈的物件,如list、dict、set等都是可迭代的物件。
3、迭代器協議是指:物件必須提供乙個next方法,執行該方法要麼返回迭代中的下一項,要麼就引起乙個stoplteration報錯,最後結束迭代。
4、可迭代物件可通過iter()函式轉化成迭代器
1 a=iter(list("python
"))#
用iter(可迭代物件)建立迭代器
2 a
next(a)
'p'
總結:1、簡單來講能被for作用迴圈的我們可以視為可迭代的物件(iterable),生成器(generator)、迭代器(iterator)、list、set等都為可迭代的物件。
2、能被next( )作用的物件我們稱之迭代器。我們可知生成器也能被next( )呼叫,其實生成器是特殊的迭代器。
3、為什麼有些可迭代物件不是迭代器,因為迭代器的實質是資料流,是惰性的,(我自己理解為待推到多公尺骨諾牌),所以迭代器可以用next()乙個個啟用其中的物件。
4、生成器、迭代器、可迭代的物件三者關係可理解為:生成器《迭代器《可迭代的物件
Python之生成器 迭代器
利用 建立generator a x x for x in range 10 列表生成式 a 0,1,4,9,16,25,36,49,64,81 b x x for x in range 10 用 建立乙個generator b at 0x7f62455db258 next b 利用 next 呼叫...
python之迭代器 生成器
迭代器 迭代器是訪問集合元素的一種方式。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器提供了統一的訪問集合的介面,只要定義 iter 方法物件,就可以使用迭代器訪問。迭代器有兩個基本的方法 iter 方法 返回迭代器物件本身 按我自己比較土的理解方法就是,每呼叫一次iter...
Python 迭代器 生成器
可以直接作用於for迴圈的物件,統稱為可迭代物件 iterable。iterator物件表示的是乙個資料流,iterator物件可以被next 函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷...