迭代器與生成器

2022-06-30 03:48:06 字數 4780 閱讀 3833

# 1.可迭代物件

# 能被for迴圈遍歷取值的資料型別:list/str/tuple/dict/set

# 遍歷(迭代):可迭代物件使用for.. in..的迴圈語法從其中依次拿到資料使用的過程

# for i in 可迭代物件:

# li = [1, 2, 3]

# for i in li: # 遍歷取值

# print(i)

# 可迭代物件:

# 泛指一類物件, 滿足以下條件的物件可以成為可迭代物件:

# 1.物件實現了__iter__方法

# 2.__iter__方法返回了迭代器物件

# 2.for迴圈工作原理

# 1.在內部對可迭代物件呼叫__iter__方法, 獲取到迭代器物件

# 2.再一次次的通過迭代器物件,呼叫__next__方法獲取結果

# tu = ('a', 'b', 'c') # 可迭代物件

# for i in tu:

# print(i)

# 3. 如果判斷乙個物件是否可以迭代 --- isinstance()

# 可迭代物件:iterable

# isinstance()

# 可迭代物件其實都是collections模組裡面的iterable類建立出來的例項

from collections.abc import iterable # 匯入模組

# name = 'jiuge'

# print(isinstance(name, iterable)) # 該物件是可迭代物件,返回為true

# print(isinstance(123, iterable)) # 該物件不是可迭代物件,返回為false

# 4.迭代器 iterator

# 迭代器就是實現了__iter__和 __next__方法的物件

# 迭代器有兩個函式: iter() 和 next()

# 遍歷取值步驟:

# 1.先呼叫物件的iter函式:

# iter()直接呼叫該物件的__iter__方法,並把該方法的返回結果作為自己的返回值

# 2.再使用next()函式來呼叫__next__方法

# 3.元素取完後,__next__方法會引發stopiteration異常

li = ['大海星辰', '活出自己', '好男人不止是曾小賢', '原來是美男吖']

# 建立迭代器物件

# it = iter(li) # 1.通過iter方法轉換迭代器物件

# print(it)

# 輸出元素

# print(next(it)) # 2.對獲取到的迭代器物件不斷使用next方法獲取下一條資料

# print(next(it))

# print(next(it))

# print(next(it))

# print(next(it)) # 3.取完元素後,再去取引發stopiteration異常

tu = (1, 2, 3, 4)

ut = tu.__iter__()

# print(ut)

# print(ut.__next__())

# print(ut.__next__())

# print(ut.__next__())

# print(ut.__next__())

# try:

# while true:

# print(ut.__next__())

## except:

# print('資料已經取完了')

# 5.可迭代物件和迭代器物件

# 可迭代物件:iterable

# 迭代器物件:iterator

# isinstance()判斷的函式

from collections.abc import iterable, iterator # 匯入模組

st = 'python'

# print(isinstance(st, iterable)) # true st是可迭代物件

# print(isinstance(st, iterator)) # false st不是迭代器物件

it = iter(st)

# print(it) #

print(isinstance(it, iterable)) # true it是可迭代物件

print(isinstance(it, iterator)) # true it是迭代器物件

# 總結:

# 迭代器物件一定是可迭代物件,可迭代物件不一定是迭代器物件

# 可迭代物件可以通過方法變成迭代器物件 (水果可以通過工廠變成水果罐頭)

# 1.迭代器協議

# 條件:

# 1.物件實現__next__方法

# 2.next方法放了某個資料

# 3.資料取完的時候,丟擲stopiteration異常

# 迭代器物件是實現了迭代器協議的物件

# 2.自定義迭代器類

# 需要有兩個特性:

# 2.1 具有iter方法,返回迭代器物件本身(類中定義了iter方法,這個類的例項就是乙個迭代器物件)

# 2.2 具有next方法,返回下乙個元素或者丟擲stopiteration異常

# 自定義類,例項化的物件不能使用for迴圈遍歷取值

class test:

def __init__(self):

self.n = 0 # 定義乙個初始值n

def funa(self): # 例項方法

# print('這是funa方法')

self.n += 1

return self.n

# # 例項化物件

# te = test()

## for i in te: # typeerror: 'test' object is not iterable

# print(i)

# 修改後,例項物件可以通過for迴圈遍歷取值

class test2:

# 返回迭代器物件

def __iter__(self):

self.n = 0

return self # 返回的是當前的例項物件,也就是迭代器物件

# 返回的是要取的資料

def __next__(self):

# 第二種:

if self.n == 6: # 設定條件,n的值為6時,丟擲異常

# 丟擲異常

raise stopiteration('超出範圍了')

self.n += 1

return self.n

te2 = test2()

# 直接呼叫next方法報錯,沒有呼叫iter方法,例項屬性self.n沒有生成

it = iter(te2)

while true:

print(next(it))

# 第一種:

# for迴圈中加結束條件

# for i in te2:

# if i <= 10:

# print(i)

# else:

# break

# 第二種:

# for i in te2:

# print(i)

# 1.生成器函式

# 生成器就是一種自定義的迭代器,本質是迭代器

# 定義方式:

# 1.1 生成器表示式:類似列表推導式

li = [i*2 for i in range(3)] # 列表推導式

# print(li) # [0, 2, 4]

li2 = (i*2 for i in range(3)) # 生成器表示式

# print(li2) # at 0x000002631b3a7dc8>

# print(next(li2))

# for i in li2:

# print(i)

# 1.2 生成器函式

# yield:每次返回乙個結果,在每個結果中間,掛起函式,以便下次從它離開的地方繼續執行

# yield使函式中斷,並儲存中斷的狀態,中斷後**可以繼續往下執行,過一段時間還可以重新呼叫這個函式

def test():

print('開始了...')

yield 123 # 返回乙個值'a', 暫停函式

yield 'b'

yield 'c'

t = test() # t是生成器物件

# print(t) #

# print(next(t))

# print(next(t))

# print(next(t))

# print(next(t))

# for i in t:

# print(i)

# 2. return和yield

# 如果生成器函式中有return,return返回的值是stopiteration異常的說明

def funa():

yield 123

return '這是return'

a = funa()

print(next(a))

print(next(a))

# 大概還有6節課

# 關於考試重點:資料型別,函式、物件導向,檔案操作

# 考試題型:選擇題、**題

迭代器與生成器

可迭代物件 可以直接作用於for迴圈的物件 統稱為可迭代物件 返回迭代器的物件 即iterable。一是集合資料型別,如list tuple dict set str等 二是generator,包括生成器和帶yield的generator function。容器 簡單來說 容器是一系列元素的集合 容...

生成器與迭代器

迭代是python最強大的功能之一,是訪問集合元素的一種方式。迭代器是乙個可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。迭代器有兩個基本的方法 iter 和 next 字串,列表或元組物件都可用於建立迭代器 list 1,2,3,...

生成器與迭代器

通過列表推導式,可以直接建立乙個列表,但是收到記憶體限制,列表容量肯定是有限的而且,建立乙個包含100萬個元素的列表,占用很大的儲存空間。如果我們僅僅需要訪問前面幾個元素,後面 後面元素的占用儲存空間就被浪費 所以,如果列表元素可以按照某種演算法算出來,那我們就可以再迴圈當中不斷地推導它,生成元素,...