我从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__()
是阅读文档的方法?
如果您对我在哪里可以深入了解内置方法等方面有任何建议,如果您愿意,我会非常高兴。
答案 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:
可迭代
一个能够一次返回其成员的对象。
这意味着所有序列类型(
list
,str
和tuple
对象)和一些非序列类型(如dict
和file
)和对象您使用__iter__()
或__getitem__()
方法定义的任何类都是可迭代的。Iterables可用于for循环以及需要序列的许多其他地方(
zip()
,map()
,...)。当一个可迭代对象作为参数传递给内置函数iter()
时,它返回该对象的迭代器。
另一方面迭代器是
表示数据流的对象 。
重复调用迭代器的
next()
方法会返回流中的连续项。当没有更多数据可用时,会引发StopIteration
异常。