1. 程式人生 > >python之路——函數叠代,生成器

python之路——函數叠代,生成器

什麽 上一個 dir 指針 tor sin import lec collect

---恢復內容開始---

叠代器 生成器

叠代器:

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