为什么可以沿着字符串迭代?

时间:2012-03-10 18:39:30

标签: python

我试图理解为什么我可以沿着字符串迭代。我在文档中看到的是:

  

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

     

容器。的 __ 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 ()。那它为什么有用呢?

1 个答案:

答案 0 :(得分:9)

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