【问题标题】:Python 3: do strings have __next__() method?Python 3:字符串有 __next__() 方法吗?
【发布时间】:2012-09-15 04:50:36
【问题描述】:
>>> s = 'spam'
>>> s.__next__()

结果是: 回溯(最近一次调用最后一次): 文件“”,第 1 行,在 s._下一个_() AttributeError: 'str' 对象没有属性 '_next_'

但在文档http://docs.python.org/py3k/library/stdtypes.html#iterator-types 中,我们可以阅读有关迭代器类型的信息:

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

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

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

【问题讨论】:

    标签: python-3.x


    【解决方案1】:

    字符串没有__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')]
    

    【讨论】:

      【解决方案2】:

      迭代器类型和容器类型不是一回事。

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

      'spam'.__iter__().__next__()
      

      或更好

      next(iter('spam'))
      

      【讨论】:

      • 当你说 a = next(iter('spam)) 然后多次调用 a 时,为什么最后一个不迭代。它只是每次都产生's'
      • @chimpsarehungry 因为每次都会创建一个新的迭代器。赋值给一个变量:i = iter('spam'),然后多次调用next(i)得到想要的结果。
      • 有什么方法可以返回迭代。喜欢最后一个(i)?
      • @chimpsarehungry 不,没有。如果您需要随机访问,请使用容器(例如 list)。
      • @chimpsarehungry 最后一个元素可能希望string[-1] 显式访问最后一个元素,如果你想反向迭代你可以使用reversed
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 2022-01-13
      相关资源
      最近更新 更多