day13 python學習 叠代器,生成器
阿新 • • 發佈:2017-11-05
繼續 spa 包含 true 表達式 處理機 調用 得到 gen
1.可叠代:
當我們打印
print(dir([1,2])) 在出現的結果中可以看到包含
‘__iter__‘, 這個方法,#次協議叫做可叠代協議
包含‘__iter__‘方法的函數就是可叠代函數
字符串、列表、元組、字典、集合都可以被for循環,說明他們都是可叠代的。
2.叠代器 iterator
l = [1,2,3,4] l_iter = l.__iter__() #叠代器的生成 item = l_iter.__next__() #叠代器的使用,用此方法一一釣魚叠代器中的數值 print(item) item = l_iter.__next__() print(item) item= l_iter.__next__() print(item) item = l_iter.__next__() print(item) item = l_iter.__next__() print(item)
這是一段會報錯的代碼,如果我們一直取next取到叠代器裏已經沒有元素了,就會拋出一個異常StopIteration,告訴我們,列表中已經沒有有效的元素了。
這個時候,我們就要使用異常處理機制來把這個異常處理掉。
l = [1,2,3,4] li=l.__iter__() while True: try: item=li.__next__()print(item) except StopIteration:#這裏要輸入的是報錯的內容 ,出現這個錯誤時執行以下內容
print(‘超出索引‘) break
3.判斷是否是叠代器
print(‘__next__‘ in dir(range(12))) #查看‘__next__‘是不是在range()方法執行之後內部是否有__next__ 當他為真時證明是可叠代的, print(‘__iter__‘ in dir(range(12))) #查看‘__next__‘是不是在range()方法執行之後內部是否有__next__ 當兩個結果都為True時,就是叠代器from collections import Iterator print(isinstance(range(100000000),Iterator)) #驗證range執行之後得到的結果不是一個叠代器
4.生成器
如果在某些情況下,我們也需要節省內存,就只能自己寫。我們自己寫的這個能實現叠代器功能的東西就叫生成器。
Python中提供的生成器:
1.生成器函數:常規函數定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回一個結果,在每個結果中間,掛起函數的狀態,以便下次從它離開的地方繼續執行
2.生成器表達式:類似於列表推導,但是,生成器返回按需產生結果的一個對象,而不是一次構建一個結果列表
生成器Generator:
本質:叠代器(所以自帶了__iter__方法和__next__方法,不需要我們去實現)
特點:惰性運算,開發者自定義
生成器函數
一個包含yield關鍵字的函數就是一個生成器函數。yield可以為我們從函數中返回值,但是yield又不同於return,return的執行意味著程序的結束,調用生成器函數不會得到返回的具體的值,而是得到一個可叠代的對象。每一次獲取這個可叠代對象的值,就能推動函數的執行,獲取新的返回值。直到函數執行結束。
def func(): #這就是一個簡單的生成器函數 for i in range(1000): yield (‘生產了%s件衣服‘%i) 註意這裏使用的是yield 返回數據 而不是return j=func() print(j.__iter__()) print(j.__iter__()) print(j.__iter__())
day13 python學習 叠代器,生成器