迭代器 生成器

2021-08-19 10:33:13 字數 1882 閱讀 7778

迭代器 = 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 概述 迭代器是訪問集合內元素的一種方式。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素都被訪問一遍後結束。迭代器不能回退,只能往前進行迭代。這並不是什麼很大的缺點,因為人們幾乎不需要在迭代途中進行回退操作。迭代器也不是執行緒安全的,在多執行緒環境中對可變集合使用迭代器...