1. 程式人生 > >可迭代物件,單詞序列

可迭代物件,單詞序列

# <流暢的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 不會

'''