2012-03-10 1 views
14

私は文字列に沿って反復できる理由を理解しようとしています。私はマニュアルに見るものは次のとおりです。文字列に沿って繰り返し処理できるのはなぜですか?

コンテナ:

一つの方法は、 イテレーションのサポートを提供するために、コンテナオブジェクトのために定義する必要があります。 __ iter __()

イテレータオブジェクトを返します。このオブジェクトには、後述のイテレータプロトコルをサポートするために、 が必要です。コンテナ が異なるタイプの反復をサポートしている場合は、具体的にその反復タイプのイテレータを要求するために追加のメソッドを として提供することができます。 (複数のフォームをサポートするオブジェクトの例は、幅優先と深さの両方をサポートするツリー構造で となります) トラバーサルです。このメソッドは、 のPythonオブジェクトの構造体のtp_iterスロットに対応しています/ C API。

イテレータ:

反復子自体が一緒イテレータプロトコルを形成する以下 2つのメソッドをサポートするために必要とされるオブジェクト。 __ iter __()

イテレータオブジェクト自体を返します。これは、コンテナとイテレータの両方を forおよびinステートメントとともに使用できるようにするには、 が必要です。このメソッドは、Python/C APIのPythonオブジェクトの型構造である のtp_iterスロットに対応します。

イテレータ。 ()

リターン容器から次のアイテム。 アイテムがない場合は、StopIteration例外を発生させます。この方法 は、Python/C APIのPythonの オブジェクトを表す型構造体のtp_iternextスロットに対応します。

しかし...

>>> 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ここに__表示されません)。ではなぜそれは機能しますか?

+4

私は、それはここでは関係だ疑うが、このようなケースでは、 'dir'にあまり信頼を置かないでください。 "dir()は、主に対話型プロンプトでの使用の便宜のために提供されているため、厳密にまたは一貫して定義された名前セットを提供しようとするよりも面白い名前セットを提供しようとします。たとえば、引数がクラスの場合、メタクラス属性は結果リストに含まれません。 – delnan

+6

だけを明確にする。 'str'インスタンスはPython 3.2の' __iter__'を実装しています。 – soulcheck

+0

私のコードは2.7.2でテストされました。 – Adam

答えて

9

イテレータは、Python 2.2で新たにしました。古いメソッドはシーケンスプロトコル(0から始まるインデックスを持つ__getitem__を実装しています)であり、まだ動作しています。

関連する問題