生成器
- python2.7中rang()和xrang()都表示生成一定范圍的值
- rang()會返回一個集合,值一次性創建出來
- xrang()會返回一個生成器,里面沒有值,當迭代的時候才逐個創建,節省內存
- 生成器:具有生成某個東西的能力,在需要用到的時候才創建
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__() # 報錯
print(r4)
- 生成器函數 & 生成器
- 當函數中含有關鍵字yield(生成)時,該函數為生成器函數
- 執行生成器函數,函數內部代碼不會執行,會返回一個生成器
- 當生成器調用__next__()會執行一下,有多少個yield,就可以執行多少次__next__(),如果__next__()次數超過yield個數,則報錯
- 當函數題內部遇到return,則return后面的代碼不會再執行,即使還有yield
- 自定義xrang(2.7)|rang(3.x)
def myrang(num):
cur = 0
while True:
if num <= cur:
return
yield cur
cur += 1
迭代器
- 生成器具有生成某個東西的能力,但是如果不去調用__next__()函數,則不會生成值
- 如果要把生成器中的內容拿出來可要用到迭代器
- 迭代器的一大優點是不要求事先準備好整個迭代過程中所有的元素。迭代器僅僅在迭代到某個元素時才計算該元素,而在這之前或之后,元素可以不存在或者被銷毀。這個特點使得它特別適合用于遍歷一些巨大的或是無限的集合,比如幾個G的文件
it = iter([1,2,3,4,5])
ret = it.__next__()
print(ret)
ret = it.__next__()
print(ret)
b = it.__next__()
print(b)
- 通過for循環可以幫我們實現迭代,同時自動判斷是否還有__next__()
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。