實現了__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...