リスト解析式、ジェネレータ式、集合解析式、辞書解析式
5714 ワード
知識の先取り:
反復可能オブジェクト:は、forによって反復することができ、 は、後で印刷を継続することができる.はnext()関数出力 によって出力できない.
反復器(iterator): forループ出力反復器の項 を用いることができる.はnext()関数によって重点を出力することができます:反復器は必ず反復可能なオブジェクトですが、反復可能なオブジェクトは必ずしも反復器ではありません!ポイント:ジェネレータオブジェクトは必ず反復器ですが、反復器は必ずしもジェネレータオブジェクトではありません.検証方法:
ジェネレータとリストの解析比較:
計算方法:ジェネレータ式遅延計算、不活性評価 リスト解析式は直ちに計算され、 に戻る.
メモリ使用量:戻り値自体から言えば、ジェネレータ式はメモリを節約し、ジェネレータオブジェクト を返す.でリスト解析式が直接計算され、新しいリスト が戻る.
計算速度:単従計算時間、ジェネレータ式消費時間が短く、リスト解析式消費時間が である.しかし、ジェネレータ自体は、値、すなわち計算結果を返すことなく、1つのジェネレータオブジェクト のみを返す.リスト解析式は、計算後の新しいリスト を返す.
1,リスト解析List:
構文:[戻り値for要素in反復可能オブジェクトif条件判定] は中括弧[]を使用し、内部はforループであり、if条件文は オプションである.はすぐに新しいリスト を返します. if条件判断は論理要素演算子:and,or,not を用いることができる.
定義と初期化:リスト解析式は構文糖ですコンパイラは最適化され、簡略化によって効率に影響を与えることはなく、最適化によって効率が向上する プログラマーの作業量を減らし、エラーを減らす はコードを簡略化したが、可読性は 向上した.
リスト解析アクション: 10以内の偶数 を取得する.例2:sortedはネストされたリスト を返すリストである.の下の各辞書は単独であるため、5つの要素 ではない.
ジェネレータ式:
構文:(戻り値for要素in反復可能オブジェクトif条件) ジェネレータ式小括弧で包む アクセントジェネレータ式はジェネレータオブジェクトを返します!ジェネレータは反復可能オブジェクト である.ジェネレータと反復器は異なるオブジェクトですが、反復可能なオブジェクトです!
リスト解析式との違い:ジェネレータ表現式は、オンデマンド計算(または不活性評価、遅延計算) である.リスト解析式は、即時戻り値 である.最初から最後まで歩き終え、再び を反復することはできません.
ジェネレータ操作:
集合解析:
構文:{戻り値for要素in反復可能オブジェクトif条件} 集合解析式は括弧{} を用いる.はすぐに1つのセット を返す.集合解析式で計算された結果タイプは、hash可能なタイプ でなければならない.
辞書解析:
構文:{戻り値for要素in反復可能オブジェクトif条件} 大かっこ{} を使用 key:valueキー値ペア形式を使用します.辞書はセット ではないためです.はすぐに辞書 を返します.
ディクショナリ解析アクション:
まとめ:
反復プロトコル:反復プロトコル:オブジェクトは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文は一度に結果を返し、各結果の真ん中に関数の状態を掛けて、次回離れた場所から実行を続行します. ジェネレータ式:リスト解析式と同様ですが、ジェネレータは結果リストを一度に構築するのではなく、必要に応じて結果を生成するオブジェクトを返します.
反復可能オブジェクト:
反復器(iterator):
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,リスト解析List:
構文:
定義と初期化:リスト解析式は構文糖です
リスト解析アクション:
# [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() !
# nums = [sorted(range(10))]
# len(nums) 1
# [{x:y} for x in 'abcde' for y in range(3)]
ジェネレータ式:
構文:
リスト解析式との違い:
ジェネレータ操作:
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]: []
集合解析:
構文:
:
1,{(x, x + 1) for x in range(10)} {(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)}
辞書解析:
構文:
ディクショナリ解析アクション:
{x:(x + 1) for x in range(10)}
まとめ:
反復プロトコル:
例:1 Python言語ではforループループリストを使用できます.リストは反復可能オブジェクトfor i in[i for i in range(5)]:print(i)です.
ジェネレータ:ジェネレータは1回しか巡回できません!
Pythonはジェネレータを使用しますが、ジェネレータは不活性評価、遅延計算などの特性を持っており、必要に応じて結果が発生するのではなく、すぐに結果が発生することを意味します.たとえば、リスト解析式はすぐにリストを返し、ジェネレータ式はジェネレータオブジェクトを返し、forループ反復を使用する場合にのみ計算結果を取得します.