リスト解析式、ジェネレータ式、集合解析式、辞書解析式

5714 ワード

知識の先取り:
反復可能オブジェクト:
  • は、forによって反復することができ、
  • は、後で印刷を継続することができる.
  • はnext()関数出力
  • によって出力できない.
    反復器(iterator):
  • forループ出力反復器の項
  • を用いることができる.
  • はnext()関数によって重点を出力することができます:反復器は必ず反復可能なオブジェクトですが、反復可能なオブジェクトは必ずしも反復器ではありません!ポイント:ジェネレータオブジェクトは必ず反復器ですが、反復器は必ずしもジェネレータオブジェクトではありません.検証方法:
  •     next():    ,  next        !
               :
            # a = (i for i in range(10))
            # next(a)             ,        
                 :
            # a = [i for i in range(10)]
            # next(a)    'list' object is not an iterator,         
            iter():            
            # iter(a)
            # next(iter(a)) #             ,      iter          ,    id()  
            #b = iter(a) #       a          b

    ジェネレータとリストの解析比較:
    計算方法:
  • ジェネレータ式遅延計算、不活性評価
  • リスト解析式は直ちに計算され、
  • に戻る.
    メモリ使用量:
  • 戻り値自体から言えば、ジェネレータ式はメモリを節約し、ジェネレータオブジェクト
  • を返す.
  • でリスト解析式が直接計算され、新しいリスト
  • が戻る.
    計算速度:
  • 単従計算時間、ジェネレータ式消費時間が短く、リスト解析式消費時間が
  • である.
  • しかし、ジェネレータ自体は、値、すなわち計算結果を返すことなく、1つのジェネレータオブジェクト
  • のみを返す.
  • リスト解析式は、計算後の新しいリスト
  • を返す.
    1,リスト解析List:
    構文:
  • [戻り値for要素in反復可能オブジェクトif条件判定]
  • は中括弧[]を使用し、内部はforループであり、if条件文は
  • オプションである.
  • はすぐに新しいリスト
  • を返します.
  • if条件判断は論理要素演算子:and,or,not
  • を用いることができる.
    定義と初期化:リスト解析式は構文糖です
  • コンパイラは最適化され、簡略化によって効率に影響を与えることはなく、最適化によって効率が向上する
  • プログラマーの作業量を減らし、エラーを減らす
  • はコードを簡略化したが、可読性は
  • 向上した.
    リスト解析アクション:
  • 10以内の偶数
        # [i for i in range(0, 10, 2)]
        # numlist = [print(i) for i in range(10)],print     i      ,    numlist  None,  print(i)      None,    i  。    type()     !
    
  • を取得する.
  • 例2:sortedはネストされたリスト
        # nums = [sorted(range(10))]
        # len(nums)   1
    
  • を返すリストである.
  • の下の各辞書は単独であるため、5つの要素
        # [{x:y} for x in 'abcde' for y in range(3)]
    
  • ではない.
    ジェネレータ式:
    構文:
  • (戻り値for要素in反復可能オブジェクトif条件)
  • ジェネレータ式小括弧で包む
  • アクセントジェネレータ式はジェネレータオブジェクトを返します!
  • ジェネレータは反復可能オブジェクト
  • である.
  • ジェネレータと反復器は異なるオブジェクトですが、反復可能なオブジェクトです!

  • リスト解析式との違い:
  • ジェネレータ表現式は、オンデマンド計算(または不活性評価、遅延計算)
  • である.
  • リスト解析式は、即時戻り値
  • である.
  • 最初から最後まで歩き終え、再び
  • を反復することはできません.
    ジェネレータ操作:
    g = ("{:04}".format(i) for i in range(1, 11)) #    at 0x7f3db0814eb8>
    next():            
    
    In [2]: it = (print("{}".format(i)) for i in range(2))
    In [3]: it
    Out[3]:  at 0x7faca927ffc0>
    
    In [4]: [i for i in it]
    0
    1
    Out[4]: [None, None]
    
    In [5]: [i for i in it]
    Out[5]: []

    集合解析:
    構文:
  • {戻り値for要素in反復可能オブジェクトif条件}
  • 集合解析式は括弧{}
  • を用いる.
  • はすぐに1つのセット
  • を返す.
  • 集合解析式で計算された結果タイプは、hash可能なタイプ
           :
        1,{(x, x + 1) for x in range(10)}    {(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)}
    
  • でなければならない.
    辞書解析:
    構文:
  • {戻り値for要素in反復可能オブジェクトif条件}
  • 大かっこ{}
  • を使用
  • key:valueキー値ペア形式を使用します.辞書はセット
  • ではないためです.
  • はすぐに辞書
  • を返します.
    ディクショナリ解析アクション:
    {x:(x + 1) for x in range(10)}

    まとめ:
    反復プロトコル:
  • 反復プロトコル:オブジェクトはnext()メソッドを提供する必要があります.これは反復の次の要素または次の要素を返すか、または反復を終了するためにStopIteration異常を引き起こすかのいずれかです.
  • 反復可能オブジェクト:反復プロトコルが実装されたオブジェクト
  • プロトコルは、反復可能なオブジェクトが反復可能な反復プロトコルであり、Pythonの内蔵ツール(forループ、min、max関数など)が反復プロトコルを使用してオブジェクトにアクセスします.

  • 例:1 Python言語ではforループループリストを使用できます.リストは反復可能オブジェクトfor i in[i for i in range(5)]:print(i)です.
    ジェネレータ:ジェネレータは1回しか巡回できません!
    Pythonはジェネレータを使用しますが、ジェネレータは不活性評価、遅延計算などの特性を持っており、必要に応じて結果が発生するのではなく、すぐに結果が発生することを意味します.たとえば、リスト解析式はすぐにリストを返し、ジェネレータ式はジェネレータオブジェクトを返し、forループ反復を使用する場合にのみ計算結果を取得します.
  • ジェネレータ関数:return文ではなくyield文を使用して結果を返す一般的な関数定義.yield文は一度に結果を返し、各結果の真ん中に関数の状態を掛けて、次回離れた場所から実行を続行します.
  • ジェネレータ式:リスト解析式と同様ですが、ジェネレータは結果リストを一度に構築するのではなく、必要に応じて結果を生成するオブジェクトを返します.