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 Iterable from 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之路——函數叠代,生成器