ジェネレータノット

1884 ワード

一、定義
反復プロトコル(他のデータ型は独自のiterメソッドを呼び出す必要がある)を自動的に実現するデータ型と理解できます.したがって、ジェネレータは反復可能なオブジェクトです.
二、ジェネレータの二つの形式(Pythonは二つの異なる方式でジェネレータを提供する)
1.ジェネレータ関数:一般的な関数定義ですが、return文ではなくyield文を使用して結果を返します.yield文は一度に1つの結果を返し、各結果の間に関数の状態を掛けて、次の場所から離れた場所で実行を続行します.
yieldの機能:
  • 関数の結果を生反復器(iter,nextを優雅にカプセル化)
  • 関数の一時停止と再実行の状態はyield
  • である.
    def func():
            print('first')
    
            yield 11111111
    
            print('second')
    
            yield 2222222
    
            print('third')
      
            yield 33333333
    
            print('fourth')
    
    g=func()
    
    print(g)
    
    from collections import Iterator
    
    print(isinstance(g,Iterator))#          
    
    print(next(g))
    
    print('======>')
    
    print(next(g))
    
    print('======>')
    
    print(next(g))
    
    print('======>')
    
    print(next(g))
    
    for i in g: #i=iter(g)
    
    print(i)
    
    

    注意:yieldとreturnの比較?
  • 同様:いずれも戻り値がある機能
  • は異なります.returnは1回しか値を返すことができませんが、yieldは2回の値
  • を返すことができます.
    2.ジェネレータ式:リストの導出と同様ですが、ジェネレータは、結果リストを一度に構築するのではなく、必要に応じて結果を生成するオブジェクトを返します.
     g=('egg%s' %i for i in range(1000))
    print(g)
    print(next(g))
    print(next(g))
    print(next(g))
     
    with open('a.txt',encoding='utf-8') as f:
      # res=max((len(line) for line in f))
      res=max(len(line) for line in f)
      print(res)
     
    print(max([1,2,3,4,5,6]))
     
    with open('a.txt',encoding='utf-8') as f:
      g=(len(line) for line in f)
      print(max(g))
      print(max(g))
      print(max(g))
    

    三、応用
    # [{'name': 'apple', 'price': 333, 'count': 3}, ]    
    #                   
    with open('db.txt',encoding='utf-8') as f:
      info=[{'name':line.split()[0],
       'price':float(line.split()[1]),
       'count':int(line.split()[2])} for line in f if float(line.split()[1]) >= 30000]
      print(info)