Python 3:字符串是否有__next__()方法?

3
>>> s = 'spam'
>>> s.__next__()

结果为: Traceback (most recent call last): File "", line 1, in s._next_() AttributeError: 'str'对象没有'_next_'属性

但在文档http://docs.python.org/py3k/library/stdtypes.html#iterator-types中,我们可以了解到迭代器类型:

Python支持对容器进行迭代的概念。这是使用两种不同的方法实现的;这些方法用于允许用户定义的类支持迭代。序列,在下面更详细地描述,总是支持迭代方法。

下面描述的是:序列类型- str、bytes、bytearray、list、tuple、range。

那么,为什么str不支持next()呢?

2个回答

4

字符串没有__next__方法,但是str_iterator对象有。
你必须在字符串上调用iter以获取可迭代的(str_iterator)对象。

>>> s = 'spam'
>>> g = iter(s)
>>> g
<str_iterator object at 0xad91d0>
>>> next(g)
's'
>>> next(g)
'p'
>>> next(g)
'a'
>>> next(g)
'm'
>>> next(g)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

理解迭代器必须是一个独立的对象非常重要,因为否则您将无法在同一时间为同一对象拥有多个迭代器:

>>> g, h = iter(s), iter(s)
>>> next(h)
's'
>>> list(zip(g, h))
[('s', 'p'), ('p', 'a'), ('a', 'm')]

0

迭代器类型和容器类型并不相同。

要获取一个迭代器对象,您需要调用__iter__,正如您链接的文档中所述:

'spam'.__iter__().__next__()

或者更好

next(iter('spam'))

为什么当你执行a = next(iter('spam'))并多次调用a时,它不会迭代到下一个字符,而是每次都只产生's'呢? - chimpsarehungry
@chimpsarehungry 因为每一次都会创建一个新的迭代器。将其赋值给一个变量:i = iter('spam'),然后多次调用next(i)来获得所需的结果。 - Lev Levitsky
有没有办法回到迭代中之前的位置,就像 last(i) 这样的方法? - chimpsarehungry
@chimpsarehungry 不,没有。如果你需要随机访问,请使用容器(例如list)。 - Lev Levitsky
@chimpsarehungry 最后一个元素可能想要使用 string[-1] 来明确访问最后一个元素,如果你想要反向迭代,可以使用 reversed - Tadhg McDonald-Jensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接