1. 程式人生 > >day13 python學習 叠代器,生成器

day13 python學習 叠代器,生成器

繼續 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學習 叠代器,生成器