Pythonでは、イテレータ(リスト、辞書など)のメンバーシップをチェックし、文字列内の部分文字列を探すことが知られています。私の質問は、次のすべてを達成するためにinをどのように実装するかに関するものです:1)メンバーシップのテスト、2)部分文字列のテスト、3)forループ内の次の要素へのアクセス。たとえば、for i in myList:
またはif i in myList:
が実行されると、in call myList.__next__()
?それが呼び出された場合、strオブジェクトがイテレータではなく(Python 2.7でチェックされているように)、next()メソッドがない場合、文字列でどのように機能しますか?詳細な議論場合での実装が可能でないことの要点はここに供給されている場合、幸いです。ありがとう!
クラスはin
、__contains__
メソッドを定義することにより、オペレーターがそのクラスのインスタンスでどのように機能するかを定義できます。
Pythonのデータモデルドキュメントは言います:
定義されていないオブジェクトの場合
__contains__()
、メンバーシップ・テストは、最初の経由反復をしようと__iter__()
、古いシーケンス反復プロトコルを経由して__getitem__()
、参照リファレンスガイドのこのセクションを。
Python言語リファレンスのセクション6.10.2「メンバーシップテスト操作」には、次のように書かれています。
オペレーター
in
とnot in
メンバーシップのテスト。xがsのメンバーであるかどうかをx in s
評価し、そうでない場合は評価します。の否定を返します。すべての組み込みシーケンスとセットタイプは、これと辞書をサポートします。辞書は、辞書に特定のキーがあるかどうかをテストします。list、tuple、set、frozenset、dict、collections.dequeなどのコンテナータイプの場合、式はと同等です。True
False
x not in s
x in s
in
x in y
any(x is e or x == e for e in y)
文字列およびバイトタイプの場合、xがyの部分文字列で
x in y
あるTrue
場合に限ります。同等のテストはです。空の文字列は常に他の文字列の部分文字列と見なされるため、を返します。y.find(x) != -1
"" in "abc"
True
__contains__()
メソッドを定義するユーザー定義クラスの場合、真の値をx in y
返すTrue
場合y.__contains__(x)
は戻り、False
それ以外の場合は返します。定義されていないユーザ定義クラスでは
__contains__()
なく、定義しない__iter__()
、x in y
あるTrue
一部の値があればz
とはx == z
反復処理しながら、生産されますy
。反復中に例外が発生した場合は、その例外が発生したかのようin
になります。最後に、古いスタイルの反復プロトコルが試される:クラス定義されている場合
__getitem__()
、x in y
あるTrue
と非負整数インデックスがある場合だけ、私ようにx == y[i]
、そしてすべての下位整数インデックスがレイズないIndexError
例外を。(他の例外が発生した場合は、その例外が発生した場合と同じですin
)。演算子
not in
は、の逆の真の値を持つように定義されていますin
。
上記のコメントが示すように、式演算子 in
は、ステートメントの一部を形成するキーワード in
とは異なります。Python文法では、は:の構文の一部として「ハードコード」されています。for
in
for
for_stmt ::= "for" target_list "in" expression_list ":" suite ["else" ":" suite]
したがって、for
ステートメントのコンテキストではin
、演算子として動作しません。これは、をtarget_list
から分離するための単なる構文マーカーexpression_list
です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加