Python 2.7中的str对象没有__iter__,但它的行为类似于iterable.为什么?

yas*_*sar 7 string iterator python-2.7

我在Python中检查str对象,并且我意识到Python 2.7中的str对象既__iter__()没有next()方法也没有方法,而在Python 3.0中str对象有__iter__()方法,因此它们是可迭代的.但是,我仍然可以使用str对象,就好像它们在Python 2.7中是可迭代的一样.例如,我可以在for循环中使用它们.这是如何运作的?

Eri*_* W. 5

简单的答案:因为iter(s)返回一个可迭代的对象。

更长的答案:iter()寻找一种__iter__()方法,但是如果找不到方法,它将尝试构造和迭代器本身。任何支持__getitem__()从0开始的整数索引的对象都可以用来创建简单的迭代器。__getitem__()是列表/字符串索引操作背后的函数,例如s[0]

>>> "abc".__iter__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute '__iter__'
>>> iter("abc")
<iterator object at 0x1004ad790>
>>> iter("abc").next()
'a'
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参见此处