迭代器 = iter(可迭代物件)
下乙個元素的值 = next(可迭代物件)
類中實現__iter__方法(提供迭代器)
實現迭代器
import time
class mylistiter(object):
"""迭代器類"""
def __init__(self,data):
self.data = data
self.index = 0
def __next__(self):
# 當迭代完成時,應該丟擲異常stopiteration
if self.index == len(self.data):
raise stopiteration
else:
ret = self.data[self.index]
self.index += 1
return ret
def __iter__(self):
"""迭代器也是乙個可迭代物件"""
return self
class mylist(object):
"""可迭代物件"""
def __init__(self):
self.data = [1,2,3,4,5]
def __iter__(self):
"""提供乙個迭代器"""
mi = mylistiter(self.data)
return mi
# 例項物件list
list = mylist()
li = iter(list)
while true:
try:
i = next(li)
except stopiteration as exp:
break
else:
print(i)
time.sleep(1)
結果:
①生成器表示式:
②生成器函式含有yield關鍵字的函式
掛起當前**,將yield後面的值返回到呼叫生成器物件的地方
當再次喚醒生成器**時,yield能夠恢復**,從上次執行的地方緊接著執行
接收額外資料,賦值給yield等號左邊的值
注意事項:第一次喚醒生成器,必須使用next( ),因為生成器**剛開始執行時,沒有yield接收訊息
def fib(n):
"""生成器函式"""
current = 0
num1, num2 = 0, 1
while current < n:
num = num1
num1, num2 = num2, num1+num2
current += 1
data = yield num
print("收到資料: %s" % data)
return "done"
li = iter(fib(10))
# 第一種喚醒生成器的方法:next(生成器物件)
data = next(li)
print(data)
# 第二種喚醒生成器的方式:生成器物件.send(傳送的資料)
i = li.send("hello")
print(i)
結果: 生成器 迭代器
最近見天一直在看廖大的python教程,卻發現很多基礎看著很簡單,但卻不會應用,歸根結底還是因為理解不到位,故而又將教程學了一遍,並將自己的理解記錄一下,也方便後面查閱。由於沒有相關程式設計基礎,有些理解可能是錯的,敬請批評指正。想深入具體學習廖大部落格請移步廖雪峰的官方 有時候用迴圈生成列表太過繁...
迭代器,生成器
迭代器 生成器 生成器的第1種實現方式 列表生成式改為生成器 python中yield關鍵字 函式中如果有yield,那麼呼叫這個函式的返回值為生成器。當生成器g呼叫next方法,執行函式,知道遇到yield就停止 再執行next,從上一次停止的地方繼續執行 函式中遇return直接退出,不繼續執行...
迭代器生成器
迭代器 iterator 概述 迭代器是訪問集合內元素的一種方式。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素都被訪問一遍後結束。迭代器不能回退,只能往前進行迭代。這並不是什麼很大的缺點,因為人們幾乎不需要在迭代途中進行回退操作。迭代器也不是執行緒安全的,在多執行緒環境中對可變集合使用迭代器...