pythonリストの導出と生成器の表現の使用


シーケンス
シーケンスとは、データのセットを指し、格納タイプによって容器のシーケンスと平たいシーケンスに分けられ、変更されたかどうかによって可変のシーケンスと可変のシーケンスに分けられます。
容器系列と平たい系列
コンテナシーケンスは、リスト、tuple、collection.dequeを含むオブジェクトの参照を格納する。
フラットシーケンスは、str、bytes、bytearray、memoryview、array.arrayを含むオブジェクトの値を格納します。
フラットシーケンスの値は文字、バイト、数値という基本的なタイプです。
非可変シーケンスと可変シーケンス
可変シーケンスではなく、tuple、str、bytesを含みます。
可変シーケンスは、list、bytearray、array、collection.deque、memoryviewを含む。
次の図の左側は親類で、右側はサブクラスです。可変シーケンスは可変シーケンスから継承されないことが分かります。可変方法を拡張しました。

リストの導出
Python言語の魅力は簡潔さにあり、これは最も一般的な作成リストから反映されます。例えば、文字列「a b c」を新しいリスト「a」「b」「c」に変換したいです。

symbols = "abc"
codes = []
for symbol in symbols:
 codes.append(symbol)
print(codes) # ["a", "b", "c"]
forループとリストアプリの方法を使いました。実際にはapped方法を使わなくてもいいです。直接:

symbols = "abc"
codes = [symbol for symbol in symbols]
これをリストガイドと呼び、さらにPythonicの書き方です。
編纂効率も閲読性も、リスト導出がより優れており、リスト構築のショートカットといえる。ただし、濫用してはいけません。共通の原則は、リストから導き出されたコードが2行を超えたら、アプリを使うことを考えます。これは規定ではなく、完全に自分の好みで選ぶことができます。
デカルト積とは、複数のシーケンスの中の要素のすべての組み合わせを指します。リストで導いてデカルト積を実現します。

colors = ["black", "white"]
sizes = ["S", "M", "L"]
tshirts = [(color, size) for color in colors for size in sizes]
一行のコードができました。Life is shot、use Python、list coprehension is wonderful、amzing。
この行のコードには2つのforサイクルがあります。

for color in colors:
 for size in sizes:
運転結果は:

[('black', 'S'), ('black', 'M'), ('black', 'L'), ('white', 'S'), ('white', 'M'), ('white', 'L')]
もし順番を変えたら:

[(color, size) for color in colors for size in sizes]
等価:

for size in sizes:
 for color in colors:
運転結果は違っています。2番目の要素を観察します。

[('black', 'S'), ('white', 'S'), ('black', 'M'), ('white', 'M'), ('black', 'L'), ('white', 'L')]
ジェネレータ式
一般的にジェネレータに接触するときは、yieldのキーワードを話しますが、複雑なように見えますが、簡単です。ジェネレータはリストガイドのように、他の種類のシーケンスを生成するためのものです。例えば、タプル:

symbols = "abc"
codes = (symbol for symbol in symbols)
その文法はとても簡単で、リストから導いた中かっこ[]を小かっこ()に置き換えればいいです。
文法は似ていますが、本質的には大きな違いがあります。ジェネレータ式でデカルト積を実現してみます。どのような変化があるか見てください。

colors = ["black", "white"]
sizes = ["S", "M", "L"]
tshirts = ((color, size) for color in colors for size in sizes)
運転結果は:

<generator object <genexpr> at 0x000001FD57D2DB30>
generator objectは、結果としてジェネレータオブジェクトです。ここでの結果は、繰り返しのたびに要素を一つずつ作り出すので、作成済みのタプルではありません。リストの導出によって、新しいリストのすべての要素が一気に生成されます。
ジェネレータ表式の結果を繰り返して出力します。

for tshirt in tshirts:
 print(tshirt)

('black', 'S')
('white', 'S')
('black', 'M')
('white', 'M')
('black', 'L')
('white', 'L')
ジェネレータ表式は、プログラムの性能を向上させます。例えば、2つの要素がそれぞれ1000個あるリストのデカルト積を計算します。ジェネレータ式は、forループを実行するオーバーヘッドを省きます。つまり、100万個の要素を含むリストです。
yieldの役割はreturnと同じです。後から話します。
Tips
この小節の内容は『流暢なPython』を見た時に記録した知識点です。
  • Python標準ライブラリ用Cは、豊富なシーケンスタイプを実現しています。
  • リスト導出とは、a = [x for x in something]という書き方を指す。
  • 生成器表現は、リスト外の他のタイプのシーケンスを生成するために使用され、リスト導出との違いは、四角括弧を円括弧に変換するだけであり、b = tuple(x for x in something)のように。
  • array.array('I', x for x in something)、array構造方法の最初のパラメータは、配列内の数字の記憶方式を指定している。
  • for tshirt in [c, s for c in colors for s in sizes]、リスト導出はこのリストを一度に生成し、メモリに記憶し、リソースを占用する。for tshirt in ('%s %s' for c in colors for s in sizes)、生成器式は循環時に要素を一つずつ出力し、余分なメモリ占有を回避し、forサイクルを実行するオーバーヘッドを省きました。
  • 結び目
    本論文ではまずシーケンスの概念を紹介し,次いでPythonの一般的な乱れ動作――リスト導出を実証し,最後に,生成器式という一見複雑で簡単な文法を引き出した。リストは可変です。可変の双子の兄弟がいます。元のグループです。
    参考資料:
    『流暢なPython』
    以上がpythonリストの導出と生成器表現の使用の詳細です。pythonリストの導出とジェネレータ表現に関する詳細は他の関連記事に注目してください。