可迭代物件,單詞序列
阿新 • • 發佈:2018-12-12
# <流暢的python> #實現一個類,以此來探索 可迭代物件 的旅程 import re import reprlib RE_RORD = re.compile("\w+") class Sentence: def __init__(self, text): self.text = text self.words = RE_RORD.findall(text) #self.words ['Good', 'times', 'are', 'always', 'short', 'the', 'Fat', 'said'] def __getitem__(self, item): return self.words[item] def __len__(self): return len(self.words) def __repr__(self): return 'Sentence({})'.format(reprlib.repr(self.text)) s = Sentence('"Good times are always short." the Fat said') for word in s: print(word) ''' Good times are always short the Fat said ''' print(s[0]) print(s[1]) print(s[-1]) print(len(s)) ''' Good times said 8 ''' # 序列可以迭代 ,下面說明原因 # 是因為 iter 函式 # 直譯器 需要迭代物件 X 時 , 會自動呼叫iter(X) # 內建的iter 有如下作用---對於我們的作用 # 1. 檢查物件 是否實現了 __iter__方法,如果實現了就呼叫它,獲取一個迭代器 # 2. 如果沒有實現__iter__方法 , 但是實現了 __getitem__方法,python會建立一個迭代器,嘗試按順序獲取元素(從0開始索引) # 3. 如果嘗試失敗,python 會丟擲TypeError 異常,通常是 提示 "C object is not iterable" ---C 不是可迭代物件,C是所屬的類名 ''' 從python3.4開始,檢查x是否迭代,最準確的就是使用iter(x),如果不可迭代,再處理異常 這個方法比 isinstance(x,abc.Iterable)更準確 因為iterx(x) 會考慮到 __getitem__方法,而abc.Iterable 不會 '''