Python での for ループの動作の詳細な説明

零下一度
リリース: 2017-07-02 10:45:00
オリジナル
5089 人が閲覧しました

Python の for ループ についてよくわからない場合は、この記事を読むことをお勧めします。この記事では主に Python での for ループの仕組みについて説明します。誰にとっても有益であり、学習する価値があります。必要な方は以下をご覧ください。

はじめに

for...in は、Python プログラマーによって最もよく使用されるステートメントです。for ループは、コンテナー オブジェクト 内の要素を反復するために使用されます。これらのオブジェクトには、リスト、タプル、辞書などがあります。セット、ファイル、またはカスタム クラスや関数など。

>>> for elem in [1,2,3]:
...  print(elem)
...
1
2
3
ログイン後にコピー

コレクションに対して動作


>>> for i in ("zhang", "san", 30):
...  print(i)
...
zhang
san
30
ログイン後にコピー

辞書に対して動作


>>> for c in "abc":
...  print(c)
...
a
b
c
ログイン後にコピー
ファイルに対して動作


>>> for i in {"a","b","c"}:
...  print(i)
...
b
a
c
ログイン後にコピー

ステートメントでこれほど多くの異なるタイプのオブジェクトがサポートされている理由を尋ねる、for ステートメントでは他にどのような種類のオブジェクトを使用できますか?この質問に答える前に、まず for ループの背後にある実行原理を理解する必要があります。 for ループはコンテナを反復するプロセスです。反復とは何ですか?反復とは、コンテナー内の要素がなくなるまで、コンテナー オブジェクトから要素を 1 つずつ読み取ることです。では、どのオブジェクトが反復操作をサポートしているのでしょうか?どのようなオブジェクトでも使用できますか?まずクラスをカスタマイズしてみて、それが機能するかどうかを確認してください:


>>> for k in {"age":10, "name":"wang"}:
...  print(k)
...
age
name
ログイン後にコピー

エラー スタック ログには、MyRange が反復可能なオブジェクトではないため、反復に使用できないことが非常に明確に示されています。つまり、どのような種類のオブジェクトが呼び出されるのか反復可能なオブジェクト (反復可能)? Iterable オブジェクトは iter メソッドを実装し、イテレータを返す必要があります。イテレータは next メソッドを実装するだけで済みます。ここで、リストが反復をサポートする理由を検証してみましょう:


>>> for line in open("requirement.txt"):
...  print(line, end="")
...
Fabric==1.12.0
Markdown==2.6.7
ログイン後にコピー

実験結果から、リストは iter メソッドを実装し、次のメソッドが実装されているため反復子オブジェクト (list_iterator) を返すため、反復可能オブジェクトです。次のメソッドが継続的に呼び出されていることがわかります。実際には、コンテナ内の要素がなくなり、StopIteration 例外がスローされるまで、コンテナ内の要素を繰り返し取得しています。

では、for ステートメントはどのようにループするのでしょうか?この時点で、ご想像のとおり、手順は次のとおりです。


まず、オブジェクトが反復可能オブジェクトであるかどうかを判断し、そうでない場合は、TypeError 例外をスローします。 iter メソッドを実行し、イテレータを返します


イテレータの次のメソッドを継続的に呼び出し、そのたびにイテレータの値を順番に返します

最後まで繰り返し、要素がなくなったら例外

StopIteration が発生しますPython はこの例外を独自に処理します 処理は開発者に公開されません


for の実行原理を理解した後は、独自の実装を行うことができます。 for ループで使用するイテレータ。

以前の MyRange はイテレータ プロトコルにこれら 2 つのメソッドを実装していないためエラーを報告しました。現在は改善を続けています:

  • >>> class MyRange:
    ...  def init(self, num):
    ...   self.num = num
    ...
    >>> for i in MyRange(10):
    ...  print(i)
    ...
    Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
    TypeError: &#39;MyRange&#39; object is not iterable
    ログイン後にコピー

    次のメソッドを実装しているため、MyRange 自体はすでにイテレータであるため、 iter とは返されるのはオブジェクトそのものです。次に、これを for ループで使用してみます。

  • >>> x = [1,2,3]
    >>> its = x.iter() # x有此方法,说明列表是可迭代对象
    >>> its
    <list_iterator object at 0x100f32198>
    
    >>> its.next() # its有此方法,说明its是迭代器
    1
    >>> its.next()
    2
    >>> its.next()
    3
    >>> its.next()
    Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
    StopIteration
    ログイン後にコピー

    カスタム MyRange 関数が組み込み関数の range と非常によく似ていることに気づきましたか。 for ループの本質は、StopIteration 例外が発生するまで反復子の次のメソッドを呼び出し続けることであるため、任意の反復可能なオブジェクトを for ループで使用できます。

    以上がPython での for ループの動作の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート