Python,iterator,generator


今日勉強する部分
iterator, generator

iterator


イテレーション(反復器)はオブジェクトで、値を1つずつ取り出すことができます.これまでfor反復文を用いてrangeを用いた.100回繰り返したいなら
for i in range(100):
作成します.イテレーションマネージャは、0~99の値を順番に作成します.
連続した数値を作成する場合、メモリの大量使用はパフォーマンスに悪影響を及ぼします.したがって、Pythonはイテレーションのみを作成し、値が必要な場合に値を作成します.
すなわち、遅延評価(lazy evaluation)と呼ばれるデータの作成を後方に遅らせる.イテレーションは重複文字と呼ばれることがあります.

リピート可能オブジェクト


反復可能オブジェクト(iterable)は、文字列、リスト、バイナリ、コレクションの反復可能なオブジェクトとしてよく使用されます.複数の要素を含むオブジェクトを表し、1つの要素を一度に取り出すことができます.
オブジェクトが重複可能かどうかを決定するには、オブジェクトにiterメソッドがあるかどうかを確認します.dir関数を使用してオブジェクトをチェックする方法は、次のとおりです.
dir([1, 2, 3])

リスト[1,2,3]はdirであり、iterメソッドが含まれている.このリストからiterを呼び出すと、イテレーションが表示されます.
[1, 2, 3].__iter__()
>>> <list_iterator object at 0x03616630>
リストのイテレーションを変数に保存し、nextメソッドを呼び出して要素を順番に取り出します.
>>> it = [1, 2, 3].__iter__()
>>> it.__next__()
1
>>> it.__next__()
2
>>> it.__next__()
3
>>> it.__next__()
Traceback (most recent call last):
  File "<pyshell#48>", line 1, in <module>
    it.__next__()
StopIteration
nextが呼び出されるたびに、リストの1,2,3が表示されます.3 nextが呼び出されると、StopIteration異常が発生します.1,2,3回繰り返します.これは[1,2,3]ですから.
これにより、イテレーションはnextで要素を取り出し続け、取り出す要素がなければStopIteration異常が発生して繰り返しを終了します.
iterが呼び出されると、イテレーションが表示され、リストから文字列、バイナリファイル、セットだけでなく、イテレーションからnextが順次呼び出されます.
rangeからiterイテレーションを取得し、nextメソッドを呼び出します.
>>> it = range(3).__iter__()
>>> it.__next__()
0
>>> it.__next__()
1
>>> it.__next__()
2
>>> it.__next__()
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    it.__next__()
StopIteration

forと繰り返し可能オブジェクト


forで重複可能なオブジェクトを使用する場合の操作手順を確認します.

forでrange(3)を使用する場合、まずrangeからiterウィジェットを取得する.そして、1回繰り返すたびに、ミニバージョンからnextでiに数字を保存し、指定した数字3でStopIterationをトリガーして重複を取り出す.
これらの繰り返し可能なオブジェクトはiterメソッドでイテレーションを取得し、イテレーションのnextメソッドで繰り返します.ここでは、重複可能オブジェクトとイテレーションは別々ですが、クラスでiterとnextを実装すると、イテレーションを作成できます.特にiter、nextを有するオブジェクトは、イテレーションプロトコル(iterator protocol)をサポートします.

整理する

  • リピート可能なオブジェクトとは?1つの要素を一度に読み込むことができるオブジェクト
  • ウィジェットとは?nextメソッドを使用して、値のオブジェクトを1つずつ取り出すことができます.
  • 反復可能オブジェクト(iterable)とイテレーション(iterator)は独立したオブジェクトです.
  • 反復可能オブジェクトからiterメソッドウィジェットを取得します.

  • generator


    マネージャは、ウィジェットを作成する関数です.イテレーションはiter、next、またはgetitemメソッドを実装する必要がありますが、関数では、イテレーションはキーワードyieldのみで終了します.だから私の小さなプログラムは小さなプログラムよりも簡単に書くことができます.
    ジェニー・レイトも発生器と呼んでいます!

    yield

    def number_generator():
        yield 0
        yield 1
        yield 2
     
    for i in number_generator():
        print(i)
    >>> 0
    1
    2
    for反復文でnumber generator()を指定して値を出力すると、完成品に指定された0、1、2が出力されます.

    イテレーションオブジェクトがイテレーションであるかどうかを確認するには


    number generator関数を使用して作成したオブジェクトが本当にイテレーションであるかどうかを見てみましょう.
    g = number_generator()
    >>> g
    <generator object number_generator at 0x03A190F0>
    
    >>> dir(g)
    ['__class__', '__del__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__name__', '__ne__', '__new__', '__next__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'gi_code', 'gi_frame', 'gi_running', 'gi_yieldfrom', 'send', 'throw']
    numbergenerator関数を呼び出すと、ジェネレータオブジェクト(generatorオブジェクト)が返されます.dir関数を使用してオブジェクトを表示すると、イテレーションのiter、nextメソッドが表示されます.
    マネージャのnextを呼び出します.
    >>> g.__next__()
    0
    >>> g.__next__()
    1
    >>> g.__next__()
    2
    >>> g.__next__()
    Traceback (most recent call last):
      File "<pyshell#29>", line 1, in <module>
        g.__next__()
    StopIteration
    イテレーションと動作の動作は同じです.関数に降伏値を使用するだけで、イテレーションを簡単に実装できます.ただし、イテレーションはnextメソッドで直接値を返しますが、「歩留まり」で指定した値はnextメソッドの戻り値として使用されます.また、イテレーションはraiseを直接使用してStopIteration例外を生成しますが、イテレーションが関数の末尾に達すると自動的にStopIteration例外が発生します.
    マネージャオブジェクトからnextメソッドが呼び出されるたびに、マネージャは値が生成されるまでコードを実行します.

    forとサードパーティ


    for繰り返し文は、繰り返しのたびにnextを呼び出し、完成品で励起された値を取得します.StopIteration異常が発生した場合は、繰り返しを終了します.
    降伏を使用して、値を関数に渡しながら、コードを関数に譲ります.したがって、最終品目は現在の関数を一時的に停止し、関数外のコードを実行します.
  • 変数=next(サードパーティオブジェクト)
  • def number_generator():
        yield 0    # 0을 함수 바깥으로 전달하면서 코드 실행을 함수 바깥에 양보
        yield 1    # 1을 함수 바깥으로 전달하면서 코드 실행을 함수 바깥에 양보
        yield 2    # 2를 함수 바깥으로 전달하면서 코드 실행을 함수 바깥에 양보
     
    g = number_generator()
     
    a = next(g)    # yield를 사용하여 함수 바깥으로 전달한 값은 next의 반환값으로 나옴
    print(a)       # 0
     
    b = next(g)
    print(b)       # 1
     
    c = next(g)
    print(c)       # 2
    >>> 0
    1
    2

    収益率0の実行譲歩



    値が出力された場合はnext(g)を使用してブラウザでコードを再度実行します.yield 1が実行され、数字1を介して外部に渡されます.関数の外にprint(b)とnext(g)で返される値を出力します.

    譲歩する



    譲歩する



    これにより、関数を終了しない場合には、収益率を用いて値を外部に伝達することができる.すなわち、returnは関数を返すとすぐに終了しますが、returnは関数外のコードを一時的に実行させ、値を取得してから私のコードを実行し続けます.