什么是可下標和可迭代物件之間的區別? 有哪些物件是可下標但不可迭代的,反之亦然呢?
P.s. 可下標物件是包含其他物件的物件,而迭代器是可下標的物件,可以迭代。但除此之外,我想不出更多的東西。
uj5u.com熱心網友回復:
可下標和可迭代的物件之間有什么區別?
下標物件實作了
__getitem__,從而實作了obj[key]語法的評價。iterable 物件實作了
__iter__,因此支持迭代。
哪些物件是可下標但不可迭代的呢
一個例子是
re.match(),它回傳一個不可迭代的下標。import re m = re.match(r "w (w )", "Isaac Newton, physicist" )然后你可以做:
print(m[1]) # "Newton"但是這產生了一個例外:
for word in m: # TypeError: 're.Match' object is not iterable[/span]。 print(word)反之亦然?
一個例子是
set,它支持迭代但不支持訂閱。所以你可以這樣做:for x in set([42] )。) print(x) # 42...但這產生了一個錯誤:
set([42]) [0] # TypeError: 'set'物件不是可下標的。uj5u.com熱心網友回復:
正如@juanpa.arrivillaga在其評論中所說:
可下標物件是實作
。__getitem__的物件。Iterable物件實作了__iter__所以在語言層面上這些概念并不直接相關
。盡管如此,大多數常見的容器如串列或字典既是可迭代的也是可下標的。但是
set是一個可迭代和不可下標的容器的例子,同樣,生成器產生可迭代和不可下標的物件。對于可下標但不可迭代的物件,我沒有常見的例子,但很容易想象一個特殊的類來驗證。角落的情況是,如果下標可以是整數,那么這個物件將不是一個真正的可迭代物件(不能對其使用
。iter),但是for ... in ...仍將作業,在引擎蓋下恢復到對連續的整數呼叫__getitem__但是這里有一個可能的例子(即使我無法想象一個現實世界的用例):
class SubscriptNonIter。 def __init__(self, count): self._count = count def __getitem__(self, key): return ''/span>. join(c for i, c in enumerate(key) if i % self._count == 0)示例用法:
>>> x = SubscriptNonIter(2) >>> x['abcd'/span>] 'ac' >>> for i in x。 print(i) 回溯(最近一次呼叫)。 檔案"...",行1,in<module>。 for i in x: 檔案 "...", line 6, in __getitem__ return ''/span>. join(c for i, c in enumerate(key) if i % self._count == 0) 型別錯誤。'int' object is not iterable轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/329126.html
標籤:
上一篇:將一個陣列項推送給一個物件。腳本
下一篇:添加兩個不同陣列的物件
