迭代器(iterator)
1.什么是迭代器(iterator)
迭代器是容器型數(shù)據(jù)類型(可以同時(shí)存儲(chǔ)多個(gè)數(shù)據(jù))些膨,但是想要獲取/查看迭代器中元素的值渗磅,只能將元素取出來翼岁。
取出來的元素在迭代器中就不存在了楼肪,取的時(shí)候只能從前往后一個(gè)一個(gè)的取开财,不能跳著取汉柒。
2.迭代器中的元素
迭代器的元素只能通過類型轉(zhuǎn)換误褪,將其他容器轉(zhuǎn)換成迭代器;或者通過生成器去生成
2.1.轉(zhuǎn)換 - 所有序列都可以轉(zhuǎn)換成迭代器
迭代器中的元素可以是任何類型的數(shù)據(jù)
iter1 = iter([1, 2, [3, 4]])
print(iter1)
3.獲取元素
迭代器獲取元素碾褂,不管以什么養(yǎng)的方式獲取兽间,獲取后,這個(gè)元素在迭代器中就不存在了
3.1.next(迭代器) - 獲取迭代器頂部的數(shù)據(jù)(最上面的數(shù)據(jù))
3.2.遍歷獲取每個(gè)元素
iter2 = iter('hello')
for x in iter2:
print('x:', x)
print(next(iter2)) # StopIteration
生成器(generator)
1.什么是生成器
生成器就是迭代器斋扰,迭代器不一定是生成器(迭代器包含生成器)
調(diào)用一個(gè)帶有yield關(guān)鍵字的函數(shù)渡八,就能得到一個(gè)生成器。(yield只能出現(xiàn)在函數(shù)體中)
def func1():
print('======')
return 100
yield
gen1 = func1()
gen2 = func1()
print(gen1, gen2)
2.生成器的元素
生成器獲取元素的方式和迭代器一樣:next()和循環(huán)遍歷
2.1.生成器元素的個(gè)數(shù):看執(zhí)行完生成器對(duì)應(yīng)的函數(shù)會(huì)遇到幾次yield
2.2.元素的值:看yield后面表達(dá)式的值
def func2():
print('函數(shù)體')
yield '10'
yield 'abc'
yield '1000'
return 100
gen3 = func2()
3.生成器產(chǎn)生數(shù)據(jù)的原理
當(dāng)獲取生成的元素時(shí)传货,會(huì)執(zhí)行生成器對(duì)應(yīng)的函數(shù)屎鳍,從開始執(zhí)行到y(tǒng)eild為止,將yield后面的數(shù)據(jù)作為元素返回并且記錄結(jié)束位置问裕;
下次獲取元素的時(shí)候逮壁,從上次結(jié)束的位置接著往后執(zhí)行,知道遇到下一個(gè)yield
以此類推
如果從開始執(zhí)行到函數(shù)結(jié)束粮宛,沒有遇到y(tǒng)ield窥淆,那么就獲取不到元素
def fun3():
print('第一次')
yield 1
print('第二次')
yield 2
print('第三次')
yield 3
gen4 = func3()
print('next1:',next(gen4))
print('next2:',next(gen4))
print('next3:',next(gen4))