2015-10-02 41 views
3

我很長時間以來一直對這個問題感到困惑。對象中是否包含被稱爲序列類型的元素的任何Python類型?是否有任何類型的Python對象包含被稱爲序列類型的元素?

+2

HTTPS://docs.python .org/2/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange應該回答你的問題。所有類似序列行爲(如指定協議)都是序列類型。如果它看起來像一個序列,那就是一個序列。你好鴨子打字 – dhke

+1

https://docs.python.org/2/reference/datamodel.html#emulating-container-types –

回答

2

python中的序列是Containers(即它們有一個__contains__方法),是可以進行的(即它們有一個__iter__方法)並且是Sized的(即它們有一個__len__方法)。他們也有以下方法:

__getitem__ 
__reversed__ 
index 
count 

這些都是你的基本不變序列,是可變他們也會有以下幾種方法:

__setitem__ 
__delitem__ 
insert 
append 
reverse 
extend 
pop 
remove 
__iadd__ 
+0

非常感謝!我明白 –

+1

你實際上並不需要'__contains__'或'__iter__' - 一個'__getitem__'接受類似序列的索引並最終引發異常就足夠了。 '__reversed__'也是可選的('reversed'可以使用'__getitem__'和'__len__')。 'index'和'count'由內置序列提供,但它們不是必需的(例如,numpy數組不提供它們)。 – lvc

+0

@ lvc非常有啓發性,謝謝。什麼是序列指數?我假設他們必須有'__add__','__neg__','__cmp__'(我想'__mul__'用於擴展切片,或者他們可以通過添加來獲得)?還有其他什麼(或更少)? –

3

序列是一種遵循序列協議的類型。這意味着不只是指數是數字的,而且它們是連續的,從零開始,並且迭代以增加索引的順序產生元素,並且len(my_sequence)起作用。實際上,這意味着他們需要適當地實施__getitem____len__方法。從那裏開始,Python可以「填補空白」,這樣迭代x in my_sequencereversed(my_sequence)都可以在沒有實現關聯方法的情況下工作 - 但他們仍然可以選擇實現這些方法,特別是如果它們可以提供更高效的實現(例如,默認迭代行爲就好像__iter__剛剛從i=0嘗試self[i],直到它遇到IndexError,這對於鏈接列表不是理想的)。

+1

他們有一個長度。 '__len__'和'__getitem__'都必須實現。 –

相關問題