Python迭代器和生成器

2022-08-11 15:51:15 字數 3354 閱讀 8614

一、迭代器

現在已知的可迭代物件:

str list tuple dict set range和檔案控制代碼。

但是,什麼是可迭代物件?可迭代物件的測量方法。

方法一: dir(被測物件) 如果 他含有__iter__ ,那這個物件就叫做可迭代物件.

下面字串s就是可迭代物件:

s= 'abcdef'

print('__iter__' in dir(s))

可迭代物件,iterable 與迭代器有什麼關係?可迭代物件可以轉換成迭代器(

可迭代物件.__iter__()

)。

s1 = s.__iter__()

print(s1) #iterator 遵循迭代器協議

迭代器的取值:(迭代器.__next__())

#迭代器取值:

s2 = 'abcd'

s3 = s2.__iter__()

print(s3.__next__()) #a

print(s3.__next__()) #b

只含有__iter__方法的資料是可迭代物件,含有__iter__方法,並且含有__next__方法的資料是迭代器
#迭代器的判斷:有__iter__方法,並且含有__next__方法的資料是迭代器

l = [1,2,3,4]

print('__iter__' in dir(l)) #true

print('__next__' in dir(l)) #false

liter = l.__iter__()

print('__next__' in dir(liter)) #true

print(liter.__next__()) #1

print(liter.__next__()) #2

print(liter.__next__()) #3

print(liter.__next__()) #4

方法二:測量他是可迭代的還是迭代器:

# 方法二 測試他是迭代器還是可迭代物件

l = [1,2,3]

l_iter = l.__iter__()

from collections import iterable

from collections import iterator

print(isinstance(l,iterable)) #true

print(isinstance(l,iterator)) #false

print(isinstance(l_iter,iterator)) #true

print(isinstance(l,list)) #true

迭代器的意義:

1)、迭代器節省記憶體.

2)、迭代器惰性機制.

3)、迭代器不能反覆,一直向下執行.

for 迴圈的內部機制:

1)、內部含有__iter__方法,他會將可迭代物件先轉化成迭代器.

2)、然後在呼叫__next__方法.

3)、for迴圈有異常處理的方法.

#用迭代器來表示for迴圈的內部機制

for i in [1,2,3]:

print(i)

l = [1,2,3]

l_iter = l.__iter__()

while true:

try:

print(l_iter.__next__())

except stopiteration:

break

二、生成器

什麼是生成器?

生成器是一次生成乙個值的特殊型別函式。可以將其視為可恢復函式。呼叫該函式將返回乙個可用於生成連續 x 值的生成器【generator】

簡單的說就是在函式的執行過程中,yield語句會把你需要的值返回給呼叫生成器的地方,然後退出函式,下一次呼叫生成器函式的時候

又從上次中斷的地方開始執行,而生成器內的所有變數參 數都會被儲存下來供下一次使用。

生成器的本質就是迭代器,生成器是自己用python**寫的迭代器。

1)、可以用生成器函式;

2)、可以用各種推導式構建迭代器;

3)、可以通過資料轉化。

生成器函式:

#生成器函式 生成器

def gener():

print('aaa')

yield 222

print('bbb')

yield 333

print('ccc')

g = gener()

print(g) #print(g.__next__()) #aaa

#222

print(g.__next__()) #bbb

#333

return yield 區別:

return 返回給呼叫者值,並結束此函式.

yiled 返回給呼叫者值,並將指標停留著當前位置.

def func():

for i in range(10):

yield i

g_func = func()

for i in range(3):

print(g_func.__next__()) #0 1 2

for i in range(3):

print(g_func.__next__()) #3 4 5

send和next:

1)、send 具有和next一樣的功能;

2)、send給上乙個yiled 整體傳送乙個值;

3)、send不能給最後乙個yield傳送值;

4)、獲取第乙個值的時候,不能用send 只能用next。

def gener():

yield 222#aaa

count = yield 333

print('-------->',count)

yield 'aaa'#none

yield 'bbb'

g = gener()

print(g.__next__())#222

print(g.send('aaa'))

print(g.send(none))

print(g.send('aaaa'))

列印結果:

222

333-------->none

aaabbb

列印結果

Python迭代器和生成器

先說迭代器,對於string list dict tuple等這類容器物件,使用for迴圈遍歷是很方便的。在後台for語句對容器物件呼叫iter 函式,iter 是python的內建函式。iter 會返回乙個定義了next 方法的迭代器物件,它在容器中逐個訪問容器內元素,next 也是python的...

Python迭代器和生成器

迭代器是訪問集合元素的一種方法 是可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問 他有兩個基本的方法,iter 和next 字串,列表或遠足物件都可以用於建立迭代器 list1 1,2,3,4 it1 iter list1 建立迭代器物件 print next ...

python 迭代器和生成器

迭代器是訪問集合元素的一種方式。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退,不過這也沒什麼,因為人們很少在迭代途中往後退。另外,迭代器的一大優點是不要求事先準備好整個迭代過程中所有的元素。迭代器僅僅在迭代到某個元素時才計算該元素,而在這之前或之後,元素可...