8

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

4

1 回答 1

7

简单的答案:因为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'

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

于 2012-05-09T04:23:35.967 回答