【问题标题】:Why is it possible to iterate along a string?为什么可以沿字符串迭代?
【发布时间】:2012-03-27 19:00:33
【问题描述】:

我试图理解为什么我可以遍历字符串。我在文档中看到的是:

需要为容器对象定义一个方法来提供 迭代支持:

容器。__iter__()

返回一个迭代器对象。对象是必需的 支持下面描述的迭代器协议。如果一个容器 支持不同类型的迭代,可以附加方法 提供专门为这些迭代类型请求迭代器。 (一个支持多种迭代形式的对象的例子是 是一个支持广度优先和深度优先的树结构 traversal.) 这个方法对应于类型的 tp_iter slot Python/C API 中 Python 对象的结构。

迭代器对象本身需要支持以下 两种方法,共同构成迭代器协议:

迭代器。__iter__()

返回迭代器对象本身。这是 需要允许容器和迭代器与 for 和 in 语句。这个方法对应的tp_iter slot Python/C API 中 Python 对象的类型结构。

迭代器。下一个()

从容器中返回下一个项目。如果有 没有其他项目,引发 StopIteration 异常。这种方法 对应于 Python 的类型结构的 tp_iternext 槽 Python/C API 中的对象。

但是……

>>> dir('aa')
['__add__', '__class__', '__contains__', '__delattr__', '__doc__',
 '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__',
 '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__',
 '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__',
 '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__',
 '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
 '_formatter_field_name_split', '_formatter_parser', 'capitalize',
 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs',
 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower',
 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip',
 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition',
 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip',
 'swapcase', 'title', 'translate', 'upper', 'zfill']

我在这里没有看到任何 __iter__() 或 next()。那么它为什么会起作用呢?

【问题讨论】:

  • 虽然我怀疑它在这里是否相关,但在这种情况下不要太相信dir。正如文档所说:“因为提供 dir() 主要是为了方便在交互式提示下使用,所以它尝试提供一组有趣的名称,而不是尝试提供一组严格或一致定义的名称,并且它的详细行为可能会因版本而异。例如,当参数是类时,元类属性不在结果列表中。"
  • 只是为了说明问题。 str 实例在 python 3.2 中实现了 __iter__

标签: python


【解决方案1】:

迭代器是 Python 2.2 中的新功能。旧方法是序列协议(使用从 0 开始的索引实现 __getitem__)并且仍然有效。

【讨论】:

    猜你喜欢
    • 2016-08-22
    • 1970-01-01
    • 2016-10-13
    • 2013-12-29
    • 2019-05-06
    • 2023-03-13
    • 2012-12-31
    • 1970-01-01
    • 2017-02-09
    相关资源
    最近更新 更多