【pythonユーティリティ】-yieldジェネレータ


文書ディレクトリ
  • 1、ジェネレータとは何ですか?
  • 2、なぜジェネレータを使うのですか?何のメリットがありますか.
  • 3、pythonではジェネレータをどのように実現しますか?
  • 4、yieldジェネレータの動作メカニズム
  • 5、反復生成器
  • にループを用いる.
    この概念は理解しにくいので,以下のいくつかの問題を解くことでそれを把握することができる.このセクションでは、 および の知識を使用します.まず、前の文章を見て理解することをお勧めします.【pythonユーティリティ】-反復、反復可能オブジェクト、反復器【pythonユーティリティ】-リスト生成式
    1、ジェネレータとは?
    ジェネレータ: 、よく理解して、オブジェクトを作成する意味です. は何ですか?器は道具の意味として理解できるので、 , , 。2、なぜジェネレータを使うのですか.何のメリットがありますか.
    簡単な例を挙げると、100要素のリストを作成します.簡単です.list(range(100))ですが、100万、1000万の要素のリストを作成するとしたら?確かに、私たちは依然としてlist(range(10000*100)list(range(10000*1000)を使用して目的を達成することができます.しかし、これはいくつかの問題をもたらします.
  • 変数はメモリに格納されるため、リスト長はメモリサイズに制限され、限られた
  • である.
  • リストは、すべての要素を一度に作成してから操作する必要があります.データが大きすぎると、メモリの使用が瞬時に上昇し、メモリ不足のリスクがあります.
  • は、多くの場合、要素の一部しか使用できないため、メモリ領域の浪費が発生し、以上の問題を解決するために , —— が導入されているため、ジェネレータを使用するメリットも明らかである:(1)(2)
  • 3、pythonでジェネレータをどのように実現しますか?
    一般的にpythonのジェネレータには2つの実装方法があります.
  • は一般的にリスト生成式の[]()に変更すればよく、例は以下の通りである:
    g = (x for x in range(10))
    print(type(g)) #type  g   
    from typing import Iterable
    print(isinstance(g,Iterable)) #          
    
    出力:
    <class 'generator'>
    True
    
    可視、このときのgはジェネレータであり、反復可能なオブジェクトでもある!これは、next(g)を使用して
  • の値を取ることができることを意味します.
  • yield実装例は以下の通りであり、0~2
    #      
    def getN(N):
        n = 0
        while n<N:
            yield n  #  yield     
            n+=1
    g = getN(3)
    print(next(g))
    print(next(g))
    print(next(g))
    
    出力を印刷する:
    0
    1
    2
    
    上述のように、関数getN(N)yieldキーワード戻りデータを使用したので、この関数はジェネレータとなる.小結:関数にyieldを使用してデータを返すと、この関数はジェネレータです.

  • 4、yieldジェネレータの運行メカニズム
    上記の学習を通じて、ジェネレータを構築する方法を知っています.どうやって動いているのでしょうか?なぜデータを逐次取得しているのでしょうか.まず例を見てみましょう
    def test():
        print('       :')
        yield 'data1'
        print('       :')
        yield 'data2'
        print('       :')
        yield 'data3'
    g = test()
    print(next(g))
    

    出力:
           :
    data1
    

    3つのyieldが返されているが、next()関数を1回しか使用していないため、data1、最初のyieldが返されたデータのみが印刷されている.2回呼び出すの?
    print(next(g))
    print(next(g))
    

    出力:
           :
    data1
           :
    data2
    

    まとめ:next()関数を1回呼び出すと、ジェネレータが実行され、yieldキーワードに遭遇した後、データが返されます.その後、ジェネレータは運転を一時停止し、現在の運転状態を保存し、次のnext()呼び出しを待つ.
    5、ループを使用してジェネレータを反復する
    上記の例では、next()関数によって値を取ります.この方式はデータ量が大きくなると、面倒になります.ジェネレータも反復可能なオブジェクトなので、ループを使用して反復することができます.0~2を印刷した例は以下のように書き換えられる.
  • whileサイクル
    
    def getN(N):
        n = 0
        while n<N:
            yield n
            n+=1
    g = getN(10)
    while True:
        try:
            print(next(g),end='\t')
        except StopIteration:
            break #    
    
    注:whileサイクルで実現する場合は、try...exceptStopIterator異常をキャプチャします.
  • forループ
    def getN(N):
        n = 0
        while n<N:
            yield n
            n+=1
    g = getN(3)
    for data in g:
        print(data)
    
    注:forループは、next()関数を自動的に呼び出し、異常をキャプチャします.使用を推奨します.

  • ブロガーのその他のシリーズ記事:
    [1]【pythonユーティリティ】-スライス
    [2]【pythonユーティリティ】-反復、反復可能オブジェクト、反復器
    [3]【pythonユーティリティ】-リスト生成式
    [4]【pythonユーティリティ】-アクセサリー
    [5]Pythonが動的Webページデータを取得する方法
    [6]Python+seleniumによる自動爬取の実施例
    [7]python豆弁を這い出すTop 250-改良版
    [8]【Scrapy爬取例】-爬取チェーンホームネットワーク指定都市中古住宅源情報