我试图理解为什么我可以沿着字符串迭代。我在文档中看到的是:
需要为要提供的容器对象定义一个方法 迭代支持:
容器。的 __ ITER __ ()
返回一个迭代器对象。该对象是必需的 支持下面描述的迭代器协议。如果是容器 支持不同类型的迭代,可以使用其他方法 提供专门请求那些迭代类型的迭代器。 (支持多种迭代形式的对象的一个例子是 是一个支持广度优先和深度优先的树状结构 遍历。)此方法对应于该类型的tp_iter槽 Python / C API中Python对象的结构。
迭代器对象本身需要支持以下内容 两种方法,它们共同构成了迭代器协议:
迭代器。的 __ ITER __ ()
返回迭代器对象本身。这是 需要允许容器和迭代器一起使用 for和in。此方法对应于tp_iter槽 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 ()。那它为什么有用呢?
答案 0 :(得分:9)
迭代器是Python 2.2中的新功能。旧方法是序列协议(使用基于0的索引实现__getitem__
)并且仍然有效。