生成器
- python2.7中rang()和xrang()都表示生成一定范圍的值
- rang()會返回一個(gè)集合,值一次性創(chuàng)建出來
- xrang()會返回一個(gè)生成器,里面沒有值,當(dāng)?shù)臅r(shí)候才逐個(gè)創(chuàng)建,節(jié)省內(nèi)存
- 生成器:具有生成某個(gè)東西的能力,在需要用到的時(shí)候才創(chuàng)建
def myrang():
print('1')
yield 1
print('2')
yield 2
print('3')
yield 3
ret = myrang()
print(ret) # <generator object myrang at 0x10217a8e0>
r1 = ret.__next__()
print(r1)
r2 = ret.__next__()
print(r2)
r3 = ret.__next__()
print(r3)
r4 = ret.__next__() # 報(bào)錯(cuò)
print(r4)
- 生成器函數(shù) & 生成器
- 當(dāng)函數(shù)中含有關(guān)鍵字yield(生成)時(shí),該函數(shù)為生成器函數(shù)
- 執(zhí)行生成器函數(shù),函數(shù)內(nèi)部代碼不會執(zhí)行,會返回一個(gè)生成器
- 當(dāng)生成器調(diào)用__next__()會執(zhí)行一下,有多少個(gè)yield,就可以執(zhí)行多少次__next__(),如果__next__()次數(shù)超過yield個(gè)數(shù),則報(bào)錯(cuò)
- 當(dāng)函數(shù)題內(nèi)部遇到return,則return后面的代碼不會再執(zhí)行,即使還有yield
- 自定義xrang(2.7)|rang(3.x)
def myrang(num):
cur = 0
while True:
if num <= cur:
return
yield cur
cur += 1
迭代器
- 生成器具有生成某個(gè)東西的能力,但是如果不去調(diào)用__next__()函數(shù),則不會生成值
- 如果要把生成器中的內(nèi)容拿出來可要用到迭代器
- 迭代器的一大優(yōu)點(diǎn)是不要求事先準(zhǔn)備好整個(gè)迭代過程中所有的元素蜡歹。迭代器僅僅在迭代到某個(gè)元素時(shí)才計(jì)算該元素屋厘,而在這之前或之后,元素可以不存在或者被銷毀月而。這個(gè)特點(diǎn)使得它特別適合用于遍歷一些巨大的或是無限的集合汗洒,比如幾個(gè)G的文件
it = iter([1,2,3,4,5])
ret = it.__next__()
print(ret)
ret = it.__next__()
print(ret)
b = it.__next__()
print(b)
- 通過for循環(huán)可以幫我們實(shí)現(xiàn)迭代,同時(shí)自動判斷是否還有__next__()
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者