標籤:item 結束 發送 意義 就是 告訴 strong color python
---恢複內容開始---
迭代器 產生器迭代器:1, 什麼是迭代器協議
① dir(被測對象) 如果它含有 __iter__,那這個對象叫做可迭代對象,遵循可迭代協議。
② 可迭代對象:iterable 可以轉換 迭代器(如何?:都像內部定義一個 __iter__()方法)
迭代器(iterator)遵循迭代器協議
2, 迭代器
1,只含有__iter__方法的資料是課迭代的對象
l = [1,2,3,4]print(‘__iter__‘ in dir(l))
2,含有__iter__方法,並且含有__next__方法的資料是迭代器。
print(dir([1,2].__iter__()))
3, 迭代器的意義:
① 迭代器節省記憶體
② 迭代器有惰性機制
③ 迭代器不能反覆,一直向下執行。
4, for 迴圈機制
for 可以迴圈有: 字串,列表,元祖,字典,集合,說明它們都是可以被迭代的。
在for迴圈中,就是在內部調用了__next__方法才能取到一個一個的值。
那接下來我們就用迭代器的next方法來寫一個不依賴for的遍曆。
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]l_iter = l.__iter__()while True: try: item = l_iter.__next__() print(item) except StopIteration: break
那現在我們就使用while迴圈實現了原本for迴圈做的事情,我們是從誰那兒擷取一個一個的值呀?是不是就是l_iter?好了,這個l_iter就是一個迭代器。
1,內部含有__iter__方法,他會將可迭代對象先轉化成迭代器,然後在調用__next__方法。
2,它有異常處理方法
range 它是可迭代對象,不是迭代器
驗證range 是不是迭代器
print(‘__next__‘ in dir(range(12))) #查看‘__next__‘是不是在range()方法執行之後內部是否有__next__print(‘__iter__‘ in dir(range(12))) #查看‘__next__‘是不是在range()方法執行之後內部是否有__next__
from collections import Iterablefrom collections import Iterator
print(isinstance(range(100000000),Iterable))print(isinstance(range(100000000),Iterator)) #驗證range執行之後得到的結果不是一個迭代器
產生器:1, 產生器的本質就是迭代器,迭代器,產生器是python自己用python代碼寫的迭代器
2,產生器的特點:①可以用產生器函數寫
②可以用各種推導式構建迭代器
③可以通過資料轉化
3,return 和 yield 的區別
① return 返回給調用者值,並結束此函數
② yiled 返回給調用者值,並將指標停留在當前位置
4, send :
1,給上一個 yiled 整體發送一個值
2, send 不能給最後一個 yiled 發送值
3, 擷取第一個值的時候,不能用 send 只能用 next
---恢複內容結束---
python之路——函數迭代,產生器