建立這個物件的類中是否定義了__iter__() 方法, 如果定義了,那麼這個物件就是可迭代物件。
isinstance(***_obj, iterable) 判斷
判斷乙個物件是不是迭代器的時候,需要判斷建立這個例項物件的類中是否定義了__iter__()方法和__next__()方法,如果都定義了,那麼這個物件就是可迭代物件。所以如果乙個物件是迭代器,那麼它一定是乙個可迭代物件。
isinstance(***_obj, iterator) 判斷
自己建立乙個可迭代物件
from collections import iterator
class
classmate
(object):
def__init__
(self)
: self.names =
list()
self.current_num =
0# 例項屬性,乙個類所建立出來的例項屬性之間並不共有這些屬性
classmate.num =
0# 類屬性,所有的例項屬性共有這個屬性
defadd
(self, name)
:def
__iter__
(self)
:return self
def__next__
(self)
:if self.current_num <
len(self.names)
: ret = self.names[self.current_num]
self.current_num +=
1return ret
else
:raise stopiteration
classmate = classmate(
)print
(isinstance
(classmate, iterator)
)classmate.add(
'ff'
)classmate.add(
'gg'
)classmate.add(
'kk'
)for i in classmate:
print
(i)
有了上面建立的可迭代物件,可以看看用for迴圈遍歷乙個這個物件的時候經歷了什麼樣的過程:
判斷***_obj是否是可迭代物件(即建立***_obj例項物件的類裡面是否含有__iter__方法)
滿足1的情況下呼叫內建函式iter(***_oj), 會呼叫類中的__iter__方法返回乙個迭代器***_obj_iterator(建立***_obj例項物件的類裡面含有__next__方法)
再呼叫內建函式next(***_obj_iterator), 會呼叫類中的__next__方法,每次返回乙個值
當__next__返回值的索引大於物件的長度,就會引發異常stopiteration, 結束__next__方法,for迴圈完成
迭代器和可迭代物件
本篇文章簡單談談可迭代物件,迭代器和生成器之間的關係。三者簡要關係圖 可迭代物件與迭代器 剛開始我認為這兩者是等同的,但後來發現並不是這樣 下面直接丟擲結論 1 可迭代物件包含迭代器。2 如果乙個物件擁有 iter 方法,其是可迭代物件 如果乙個物件擁有next方法,其是迭代器。3 定義可迭代物件,...
可迭代物件和迭代器
實現了 iter 方法的物件稱為可迭代物件,在python中,可迭代物件有字串 列表 元組 字典 集合等 class mynumbers def init self self.a 1 def iter self return self my numbers mynumbers 判斷物件是否是可迭代物...
可迭代物件和迭代器
迭代器即迭代的工具,那什麼是迭代呢?迭代是乙個重複的過程,每次重複即一次迭代,並且每次迭代的結果都是下一次迭代的初始值 while true 只是單純地重複,因而不是迭代 print l 1,2,3 count 0 while count len l 迭代 print l count count 1...