0Pricing
Python Academy · レッスン

ジェネレーター式

ジェネレーター式で遅延シーケンスを作成し、メモリを効率的に使います。

「ジェネレーター式」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

はじめに

ジェネレーター式は遅延評価される内包表記です。リストをメモリ上に作成せず、値を 1 つずつ生成します。

ジェネレーター式の構文

(expression for item in iterable) は丸括弧を使います。リストではなく、ジェネレーターオブジェクトを返します。
gen = (x**2 for x in range(5))
print(gen)  # generator object
print(next(gen))  # 0
print(next(gen))  # 1

メモリ効率

ジェネレーターは一度に 1 つの値だけを保持します。sum(x**2 for x in range(10**7)) は、リストと比べて O(1) のメモリを使用します。
total = sum(x**2 for x in range(100))
print(total)

ジェネレーターの消費

ジェネレーターは一度だけ消費できます。最後まで処理すると StopIteration が送出され、残りの値はなくなります。
gen = (x for x in range(3))
for val in gen:
    print(val)
# gen is now exhausted

関数引数としてのジェネレーター

ジェネレーターが唯一の引数である場合は、余分な丸括弧を省略できます。sum(x**2 for x in range(10)) のように記述します。
print(sum(x**2 for x in range(10)))
print(max(len(w) for w in ['cat', 'elephant', 'ant']))

ジェネレーターの連結

ジェネレーターは遅延評価のまま連結できます。evens = (x for x in range(100) if x%2==0); big = (x for x in evens if x>50) のように記述します。
evens = (x for x in range(100) if x % 2 == 0)
big_evens = (x for x in evens if x > 50)
print(list(big_evens))

リストやタプルへの変換

list(gen) または tuple(gen) は、すべての値を実体化します。ランダムアクセスや複数回の走査が必要な場合に使用します。
gen = (x**2 for x in range(5))
print(list(gen))

ジェネレーター式とリスト内包表記

1 回だけ反復する場合やデータセットが大きい場合はジェネレーターを使用します。len()、インデックス指定、複数回の走査が必要な場合はリストを使用します。
import sys
lst = [x**2 for x in range(1000)]
gen = (x**2 for x in range(1000))
print(sys.getsizeof(lst), sys.getsizeof(gen))

無限ジェネレーター

itertools.count(0) は無限カウンターです。islice と組み合わせて、必要な分だけ取得します。
import itertools
first10 = list(itertools.islice(itertools.count(0), 10))
print(first10)

ジェネレーターでの any() と all()

any(x>5 for x in lst) は短絡評価を行い、最初に True になった時点で停止します。all() は最初に False になった時点で停止します。非常に効率的です。
nums = [1, 3, 7, 2]
print(any(x > 5 for x in nums))
print(all(x > 0 for x in nums))

パイプライン

変換を遅延評価のまま連結します。data → filter → transform → aggregate の各ステップがジェネレーターとなり、必要になるまで何も実行されません。
data = range(1000)
filtered = (x for x in data if x % 7 == 0)
transformed = (x * 2 for x in filtered)
print(sum(transformed))

理解度チェック

ジェネレーター式がリスト内包表記より優れている、メモリ上の主な利点は何ですか。

まとめ

ジェネレーター式は (expr for x in it) の形です。遅延評価により、メモリ使用量は O(1) になります。一度だけ消費されます。sum、any、all、max と組み合わせて使用します。複数回の走査が必要な場合はリストに変換します。

次へ進みましょう

すばらしいです。次のレッスンに進んで、スキルをさらに深めましょう。

よくある質問

「ジェネレーター式」レッスンは無料ですか?

はい。「ジェネレーター式」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「ジェネレーター式」で何を学びますか?

ジェネレーター式で遅延シーケンスを作成し、メモリを効率的に使います。 ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「ジェネレーター式」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. リスト内包表記
  2. 集合内包表記と辞書内包表記
  3. ジェネレーター式
  4. yield キーワード
← Python Academyに戻る