Pythonでは、in演算子はどのように実装されていますか?イテレータのnext()メソッドを使用していますか?

bp14

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「メンバーシップテスト操作」には、次のように書かれています。

オペレーターinnot inメンバーシップのテスト。xsのメンバーであるかどうかをx in s評価しそうでない場合評価します。の否定を返しますすべての組み込みシーケンスとセットタイプは、これと辞書をサポートします。辞書は、辞書に特定のキーがあるかどうかテストします。list、tuple、set、frozenset、dict、collections.dequeなどのコンテナータイプの場合、式はと同等です。TrueFalsex not in sx in sinx in yany(x is e or x == e for e in y)

文字列およびバイトタイプの場合、xyの部分文字列で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文法では、の構文の一部として「ハードコード」されていますforinfor

for_stmt ::=  "for" target_list "in" expression_list ":" suite
              ["else" ":" suite]

したがって、forステートメントのコンテキストではin、演算子として動作しません。これは、をtarget_listから分離するための単なる構文マーカーexpression_listです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ