pythonの反復器(遍歴のように理解)

6521 ワード

反復器:
遍歴のように、このように理解すると、特別な回りではないことがわかります.最初はこの反復が特に理解しにくいと思っていました.概念は何度も見ていましたが、まだぼんやりしていました.突然反復という言葉を遍歴に変えたことに気づいて、考えが開いた!まずは一歩ずつ理解していきましょう~
1.反復の概念
forループを使用して値を取得するプロセスを反復と呼びます.たとえば、forループループリストを使用して値を取得するプロセスです.
for value in [2, 3, 4]:
    print(value)
  :
2
3
4

2.反復可能オブジェクト
forループを使用して値を取得するオブジェクトを反復可能オブジェクトと呼びます.たとえば、リスト、メタグループ、辞書、コレクション、range、文字列などです.
反復可能なオブジェクトの説明は反復(遍歴)できますが、反復器だけが使用できます!
3.iter()関数とnext()関数
わかりにくいので、とりあえず中を見ず~~~
iter関数iter関数:反復可能オブジェクトの反復器を取得し、反復可能オブジェクトのiterメソッドnext関数を呼び出す:反復器の次の値を取得し、反復器オブジェクトのnextメソッドを呼び出す
すなわち,この2つの関数は同時に1つのクラスにあり,同時に2つの方法を実現しなければならない.
4.反復可能オブジェクトのカスタマイズ
         :       __iter__         *   (  )  *
class MyList(object):

    def __init__(self,age):
        #    
    self.age = age

    def __iter__(self):
        #     
      return self

      "  :         ,   __iter__   。
              ,      (  ),
                 ;           。"
       #             ,            。

5.カスタム反復
カスタム反復オブジェクト:クラス内でiterメソッドとnextメソッドを定義して作成したオブジェクトが反復オブジェクトです.ここでは2つの方法を同時に実現するので,反復器と呼ぶ.
class MyClass(object):
    """  :             ;
      :   1 100   。
    """
    #    
    def __init__(self, age):
        self.age = age
        self.num = 0

    #   :             
    def __iter__(self):
        return self

    #   :   (  ) ,      
    def __next__(self):
        """               !"""
        #           
        if self.num >= self.age:

            #     (  )
            raise StopIteration

        else:
            #     (  )        
            self.num += 1
            return self.num

#    
MyClass = MyClass(100)

#  for    ,         。
for x in MyClass:
    print(x)

結果:1 2 3 4.....99 100
6.概念理解のまとめ
反復器:クラスを定義し、クラスの中でiterとnextを実現する2つの方法です.このクラスは反復器ですfor反復(遍歴)を使用できます.
(個人的に理解)注:iterの役割は、このような反復可能なオブジェクトになり、それ自体を返すことです.nextは反復(遍歴)したときに次の値を順次取り出すことができる.
7.反復器の適用シーン
---反復器:反復器の最も核心的な機能はnext()関数の呼び出しによって次のデータ値を返すことができることを発見しました.毎回返されるデータ値が既存のデータセットで読み取られるのではなく、プログラムによって一定の法則に従って計算されて生成される場合.--既存のデータセットに依存しないことを意味します.つまり、反復するすべてのデータを一度にキャッシュして後続の順番に読み取る必要がなくなり、大量のストレージ(メモリ)スペースを節約できます.
8.例を挙げる
例えば、数学には有名なフィボラッチ数列(Fibonacci)があり、数列の最初の数は0で、2番目の数は1で、その後の各数は前の2つの数から加算することができます.
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …
反復フィボナッチ数列の最初のn個の数をfor...in...サイクルで巡りたい.このフィボナッチ数列は反復器で実現でき,反復のたびに数学計算によって次の数を生成する.
class Fibonacci(object):

    def __init__(self, num):
        # num:      fibonacci  
        self.num = num
        #   (      )fibonacci    ,
        self.a = 0
        self.b = 1
        #            
        self.current_index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.current_index < self.num:
            result = self.a
            self.a, self.b = self.b, self.a + self.b
            self.current_index += 1
            return result
        else:
            raise StopIteration


fib = Fibonacci(5)
# value = next(fib)
# print(value)

for value in fib:
    print(value)

実行結果:
0 1 1 2 3