为什么Python可迭代对象以他们的方式工作?

时间:2015-11-02 20:43:12

标签: python class object python-3.x iterator

我从Python文档中读到了对象的内置迭代方法:

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

关于__iter__方法的说法如下:

  

返回一个迭代器对象。该对象需要支持   迭代器协议如下所述。

但是,在我看来似乎并非如此,如果我让__iter__方法返回类似'abc'的字符串,我会收到类型错误:TypeError: iter() returned non-iterator of type 'str'但是我们知道,字符串是可迭代的对象,python如何处理它就像它不是迭代对象一样?

我可以像这样解决这个问题:

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

但我不明白为什么我必须这样做,而不是只返回'abc'对象。

我还注意到Python文档对于初学者来说并不是很有用,它确实不会让学习进度变得容易。用什么逻辑可以得出结论return 'abc'.__iter__()是阅读文档的方法?

如果您对我在哪里可以深入了解内置方法等方面有任何建议,如果您愿意,我会非常高兴。

4 个答案:

答案 0 :(得分:1)

这是一个很好的观点,但关键是迭代器(例如,iter("abc")或等价的"abc".__iter__())和可迭代的(例如,"abc")两个略有不同事情,__iter__是返回迭代器所必需的。

答案 1 :(得分:1)

字符串是可以迭代的对象,但它本身不是迭代器。它们是对象层次结构中的两个单独的类。

答案 2 :(得分:1)

务实回答:迭代器需要支持next()

字符串不会:

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

仅仅是可迭代是不够的。

答案 3 :(得分:0)

来自python Documentation

可迭代

  

一个能够一次返回其成员的对象。

     

这意味着所有序列类型(liststrtuple对象)和一些非序列类型(如dictfile)和对象您使用__iter__()__getitem__()方法定义的任何类都是可迭代的。

     

Iterables可用于for循环以及需要序列的许多其他地方(zip()map(),...)。当一个可迭代对象作为参数传递给内置函数iter()时,它返回该对象的迭代器。

另一方面迭代器是

  

表示数据流的对象

     

重复调用迭代器的next()方法会返回流中的连续项。当没有更多数据可用时,会引发StopIteration异常。