2015-11-02 21 views
0

我看了一下建在從Python文檔對象的迭代方法:爲什麼Python可迭代對象按照他們的方式工作?

https://docs.python.org/2/library/stdtypes.html#iterator-types

是怎麼說__iter__方法如下:

Return an iterator object. The object is required to support the iterator protocol described below.

然而,在我看來,這似乎不是這種情況,如果我使__iter__方法返回一個字符串,如'abc'我得到一個類型錯誤:TypeError: iter() returned non-iterator of type 'str'但我們知道,字符串是可迭代的對象,它怎麼可能像Python那樣對待它是n一個迭代對象?

我可以解決這樣這個問題:

def __iter__(self): 
    return 'abc'.__iter__() 

,但我不明白爲什麼我必須這樣做,這樣,而不是僅僅返回'abc'對象。

我還注意到Python文檔對初學者不是很有幫助,它確實沒有讓這個學習過程變得簡單。用什麼邏輯可以得出結論return 'abc'.__iter__()是通過閱讀文檔去的路?

如果您對我在哪裏可以深入瞭解更多關於內置方法等方面的任何建議,如果您願意分享,我會非常高興。

+3

字符串是*迭代*,但他們不是*迭代器*。該文檔完全清楚構成* iterator *的是什麼:支持迭代器協議的任何對象。 – nneonneo

回答

1

務實的答案:迭代器需要支持next()

的字符串不會:

next('abc') 
TypeError: 'str' object is not an iterator 

只是要迭代是不夠的。

+0

我看,似乎我認爲字符串有'__next__'方法,因爲您可以迭代它。這似乎是迄今爲止最好的答案。 – Parsee

+0

內置序列都不是迭代器。他們都有一個相應的迭代器。 'iter('abc')'返回'。這種分離不僅可以重新迭代,而且可以同時擁有多個迭代器。考慮s ='abc'\ nfor c1 in s:\ n for c2 in s:\ n yield c1,c2' to get all ordered ordered pairs of letters in s s each for for循環調用iter(s)來獲得它自己的迭代器。 –

1

這有點一個細點,但關鍵是一個迭代(例如,iter("abc")或等效"abc".__iter__())和迭代(例如,​​)是兩個略微不同的東西,__iter__需要返回一個迭代。

1

字符串是一個可以迭代的對象,但它本身不是迭代器。它們是對象層次結構中的兩個獨立的類。

0

從Python Documentation

可迭代是

an object capable of returning its members one at a time.

This means all sequence types (list , str , and tuple objects) and some non-sequence types like dict and file and objects of any classes you define with an __iter__() or __getitem__() methoda are iterables.

Iterables can be used in a for loop and in many other places where a sequence is needed (zip() , map() , ...). When an iterable object is passed as an argument to the built-in function iter() , it returns an iterator for the object.

在另一方面迭代器是

an object representing a stream of data.

Repeated calls to the iterator’s next() method return successive items in the stream. When no more data are available a StopIteration exception is raised instead.

相關問題