迭代器 可迭代物件 生成器

2022-05-07 17:54:08 字數 2288 閱讀 9862

先上本文主題:

迭代器一定是可迭代物件,可迭代物件不一定是迭代器;

可迭代物件要滿足什麼條件才能使用 for 正確遍歷;

生成器一定是迭代器.

# 是否為迭代器

isinstance(t,iterator)

# 是否為可迭代物件

isinstance(t,iterable)

實現了__iter__魔法方法,就是可迭代物件.

class test:

def __iter__(self):

pass

t = test()

print(isinstance(t,iterable)) # true

print(isinstance(t,iterator)) # false

實現了__iter____next__魔法方法,就是可迭代物件.

class test:

def __iter__(self):

pass

def __next__(self):

pass

t = test()

print(isinstance(t,iterable)) # true

print(isinstance(t,iterator)) # true

從上面兩個條件可以推導出,迭代器一定是可迭代物件

該物件需要是乙個可迭代物件,即實現了__iter__方法;

__iter__方法返回乙個實現了__next__方法的物件;

class a:

def __next__(self):

return 'hello world'

a = a()

class b:

def __iter__(self):

return a

b = b()

# 每次迴圈都會呼叫a的__next__方法獲取返回值.

for i in b:

print(i)

輸出如下:

hello world

hello world

hello world

hello world

hello world

hello world

hello world

hello world

hello world

hello world

hello world

hello world

hello world

hello world

hello world

hello world

...

上面兩個 class 組合在起義的寫法如下:

class b:

def __iter__(self):

return self

def __next__(self):

return 'hello world'

b = b()

for i in b:

print(i)

這裡的關鍵點就是在__iter__方法中返回的self,因為 class 實現了__next__方法,所以返回self正好滿足第二個條件.

為什麼這樣說呢?

返回生成器物件一共有兩種方式:

生成器表示式;

呼叫含有 yield 的函式.

以第一種方式為例

in [1]: a = (i for i in range(10))

in [2]: a.__next__

可以看到,雖然我們並未顯示定義,但是生成器表示式確實實現了__iter__和__next__方法,通過yield關鍵字定義的生成器同樣擁有這樣的特性,所以說,生成器自動實現了迭代器的協議.生成器一定是迭代器.

可迭代物件,生成器,迭代器

classa def init self self.count 10def iter self print 執行 iter return self def next self print 執行 next if self.count 0 self.count 1return self.count el...

迭代器和迭代物件 生成器

iterator 迭代器物件,必須要實現 next 魔法函式 iterable 可迭代物件,繼承 iterator,必須要實現 iter 魔法函式 迭代器 iterator 與可迭代物件 iterable 的區別 生成器生成器 函式中只要有 yield,這個函式就會變成生成器。每次執行到 yield...

可迭代物件 迭代器,生成器

可迭代物件 iterator 列表 集合 元組 字典 字串 生成器 我們可以使用isintance 判斷乙個物件是否是iterator物件 生成器 通過列表生成式,我們可以直接建立乙個列表,但是,受到記憶體限制,列表容量肯定是有限的,如果我們僅僅需要訪問前面幾個元素,如果列表元素可以按照某種演算法推...