Python中的迭代器和生成器

2022-09-12 06:42:14 字數 1470 閱讀 6781

面試的時候總是被問到迭代器、生成器、裝飾器,一開始不知道怎麼回答,然後查閱資料之後總算是有點認識了。

迭代器其實是乙個實現了迭代器協議的容器物件。

它基於2個方法:

range()函式就是乙個迭代器

接下來我模擬range寫乙個迭代器

class range:

def __init__(self, start : int = 0, end : int = 10, step : int = 1):

self.start = start

self.end = end

self.step = step

def __next__(self):

if self.start > (self.end - self.step):

raise stopiteration

self.start += self.step

return self.start

def __iter__(self):

return self

測試預設值:

>>> print([i for i in range()])

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

測試非預設值,設定步長為3:

>>> print([i for i in range(10, 50, 3)])

[13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49]

可見range物件是乙個可以迭代的物件

迭代器跟生成器一般是結合使用的。

基於yield語句,生成器可以暫停當前執行的函式,返回yield當前要返回的值,並儲存上下文。

例如生成可以被3整除的數:

def divide_three():

a = 3

while true:

yield a

a += 3

測試:

>>> res = divide_three()

>>> print([next(res) for i in range(20)])

[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60]

這裡呼叫了20次,理論上,如果你願意,可以呼叫無限次,是不是很神奇。

來看看divide_three的型別:

>>> print(divide_three())

現在是不是對迭代器、生成器有點感覺了。

enjoy your code, good luck.

python中迭代器和生成器

迭代器 迭代器的實質是實現了next 方法的物件,常見的元組 列表 字典都是迭代器。迭代器中重點關注兩種方法 iter 方法 返回迭代器自身。可以通過python內建函式iter 呼叫。next 方法 當next方法被呼叫的時候,迭代器會返回它的下乙個值,如果next方法被呼叫,但迭代器沒有只可以返...

python中迭代器和生成器

1 迭代器 iterator 是乙個實現了迭代器協議的物件,python的一些內建資料型別 列表,陣列,字串,字典等 都可以通過for語句進行迭代,我們也可以自己建立乙個容器,實現了迭代器協議,可以通過for,next方法進行迭代,在迭代的末尾,會引發stopiteration異常。迭代器有兩個基本...

python中迭代器和生成器

這裡的迭代可以指for迴圈,在python中,對於像list,dict和檔案等而言,都可以使用for迴圈,但是它們並不是迭代器,它們屬於可迭代物件。1.1什麼可迭代物件 最簡單的解釋 可以使用for.in.語句進行迴圈的物件,就是可迭代物件 iterable 可以使用isinstance 方法進行判...