可迭代物件和迭代器

2022-03-11 00:52:36 字數 2916 閱讀 2250

實現了__iter__方法的物件稱為可迭代物件,在python中,可迭代物件有字串、列表、元組、字典、集合等

class mynumbers:

def __init__(self):

self.a = 1

def __iter__(self):

return self

my_numbers = mynumbers()

判斷物件是否是可迭代物件

from collections.abc import iterable

print(isinstance("123", iterable)) #字串:true

print(isinstance([1, 2, 3], iterable)) #列表:true

print(isinstance((1, 2, 3), iterable)) #元組:true

print(isinstance(, iterable)) #字典:true

print(isinstance(, iterable)) #集合:true

print(isinstance(open("test.txt", "r"), iterable)) #檔案:true

print(isinstance(my_numbers, "r"), iterable)) #my_numbers物件:true

也可以去原始碼裡檢視,比如原始碼裡的list類實現了__iter__方法

實現了__iter__和__next__方法的物件稱為迭代器,__iter__返回乙個特殊的迭代器物件self,__next__返回下乙個可用元素,如果沒有元素,會丟擲stopiteration異常

map()、zip()、enumerate()、filter()、檔案物件等都是迭代器

class mynumbers:

def __init__(self):

self.a = 1

def __iter__(self):

return self

def __next__(self):

x = self.a

self.a += 1

return x

my_numbers = mynumbers()

print(next(my_numbers)) #1

print(next(my_numbers)) #2

print(next(my_numbers)) #3

from collections.abc import iterator

print(isinstance(my_numbers, iterator)) #my_numbers物件:true

可迭代物件實現了__iter__方法,但沒有實現__next__方法,實際上可迭代物件呼叫iter()方法時,它會自動呼叫__iter__方法,而__iter__方法的作用是返回乙個特殊的迭代器,因此實現了用可迭代物件建立迭代器

print(next(i)) #沒有下乙個元素,丟擲異常

print(next(i))

# 執行結果

traceback (most recent call last):

file "e:/virtual_workshop/everyday/test/iterators.py", line 80, in print(next(i))

stopiteration12

3為了避免異常的情況,可以使用for或者next加異常捕獲來遍歷元素

for迴圈

l = [1, 2, 3]

i = iter(l)

for i in i:

print(i, end=" ")

# 執行結果

1 2 3

next加異常捕獲

import sys

l = [1, 2, 3]

i = iter(l)

while true:

try:

print(next(i), end=" ")

except stopiteration:

sys.exit()

# 執行結果

1 2 3

d = 

i = iter(d)

for i in i:

print(i, end=" ")

# 執行結果

a b c

字典中有乙個迭代器(但不能說字典本身就是迭代器),在迭代環境中,會自動一次返回乙個key

d = 

for key in d:

print(key, end=" )

# 執行結果

a b c

《python3 迭代器與生成器》

《python3 迭代器》

《python3學習筆記(十四):可迭代物件、迭代器和生成器》

《如何理解python中的可迭代物件、迭代器和生成器》

迭代器和可迭代物件

本篇文章簡單談談可迭代物件,迭代器和生成器之間的關係。三者簡要關係圖 可迭代物件與迭代器 剛開始我認為這兩者是等同的,但後來發現並不是這樣 下面直接丟擲結論 1 可迭代物件包含迭代器。2 如果乙個物件擁有 iter 方法,其是可迭代物件 如果乙個物件擁有next方法,其是迭代器。3 定義可迭代物件,...

可迭代物件和迭代器

建立這個物件的類中是否定義了 iter 方法,如果定義了,那麼這個物件就是可迭代物件。isinstance obj,iterable 判斷 判斷乙個物件是不是迭代器的時候,需要判斷建立這個例項物件的類中是否定義了 iter 方法和 next 方法,如果都定義了,那麼這個物件就是可迭代物件。所以如果乙...

可迭代物件和迭代器

迭代器即迭代的工具,那什麼是迭代呢?迭代是乙個重複的過程,每次重複即一次迭代,並且每次迭代的結果都是下一次迭代的初始值 while true 只是單純地重複,因而不是迭代 print l 1,2,3 count 0 while count len l 迭代 print l count count 1...