ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
yield とは何か
Python の yield は関数をジェネレータ関数に変える文です。通常の関数は呼ぶと最後まで実行して戻り値を返しますが、yield を含む関数は呼んでも本体を実行せず、ジェネレータオブジェクトを返します。next() や for ループで反復するたびに、yield 文まで実行 → 値を返して一時停止 → 次の next で続きから再開、を繰り返します。
def counter():
print("start")
yield 1
print("middle")
yield 2
print("end")
yield 3
g = counter() # 関数本体はまだ実行されない
print(type(g)) #
print(next(g)) # → start 1
print(next(g)) # → middle 2
print(next(g)) # → end 3
print(next(g)) # → StopIteration 例外
return vs yield
| 項目 | return | yield |
|---|---|---|
| 関数の実行 | 呼出時に即実行 | 呼出時はオブジェクトのみ生成 |
| 戻り値 | 1 つの値 | 反復ごとに 1 つずつ無限/有限の値列 |
| 関数終了 | return で完全終了 | yield 後も停止状態で次の呼出を待つ |
| 状態保持 | しない | ローカル変数を保持 |
| メモリ | 戻り値分 | 1 要素分のみ (省メモリ) |
メモリ効率: 無限数列 / 大量データ
# ✗ 1 億要素のリスト → メモリを大量消費
def squares_list(n):
return [i * i for i in range(n)]
# ✓ ジェネレータ → 1 要素分のメモリのみ
def squares_gen(n):
for i in range(n):
yield i * i
# 利用例 (両方とも同じ for で書ける)
for x in squares_gen(100_000_000):
if x > 10_000:
break
# 無限数列も書ける (リストでは不可能)
def naturals():
n = 0
while True:
n += 1
yield n
import itertools
first_10 = list(itertools.islice(naturals(), 10))
print(first_10) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
yield from: ジェネレータ委譲
def inner():
yield 1
yield 2
yield 3
def outer():
yield 0
yield from inner() # inner の値を全てそのまま渡す
yield 4
print(list(outer())) # [0, 1, 2, 3, 4]
# 同等の冗長な書き方
def outer_long():
yield 0
for v in inner():
yield v
yield 4
# yield from は値だけでなく send() / throw() / return 値も中継する点で
# 単純な for-yield より強力
ジェネレータ式
# リスト内包 (角括弧) → リストを即座に作る
xs = [x * 2 for x in range(1_000_000)] # 全要素をメモリに展開
# ジェネレータ式 (丸括弧) → ジェネレータを返す
gen = (x * 2 for x in range(1_000_000)) # 1 要素分のみ
total = sum(gen) # 反復しながら計算
# 関数の引数として渡すと括弧省略可能
total = sum(x * 2 for x in range(1_000_000))
max_val = max(len(line) for line in open("data.txt"))
コルーチンとしての yield (send / throw)
yield は式でもあります。gen.send(value) でジェネレータに値を送り込めます:
def echo():
while True:
received = yield # ここで止まる、send で値が来る
print(f"got: {received}")
g = echo()
next(g) # ジェネレータを yield 位置まで進める (priming)
g.send("hello") # → got: hello
g.send("world") # → got: world
# 累積平均コルーチン
def averager():
total = 0
count = 0
avg = None
while True:
value = yield avg
total += value
count += 1
avg = total / count
a = averager()
next(a)
print(a.send(10)) # 10.0
print(a.send(20)) # 15.0
print(a.send(30)) # 20.0
この機構は asyncio 登場前 (Python 3.4 以前) の非同期処理の基礎でした。現在は async/await の方が読みやすいため、コルーチン目的では yield をあまり使いません。
非同期ジェネレータ (Python 3.6+)
import asyncio
async def fetch_pages(urls):
for url in urls:
# async I/O で取得
await asyncio.sleep(0.1)
yield f"page of {url}"
async def main():
urls = ["a", "b", "c"]
async for page in fetch_pages(urls):
print(page)
asyncio.run(main())
他言語の yield との比較
| 言語 | 構文 | 特徴 |
|---|---|---|
| Python | yield value | 関数全体がジェネレータ化、双方向通信可 |
| C# / Unity | yield return value; | IEnumerable |
| JavaScript | function* gen() { yield value; } | function* 構文で明示、Iterator プロトコル |
| Ruby | yield value | ブロックへ値を渡す (Python と意味が異なる) |
| Kotlin | yield(value) in sequence | sequence ビルダ内のみ |
典型的なユースケース
- ファイル行を 1 行ずつ処理:
for line in open("huge.csv")自体がジェネレータ - DB クエリのストリーミング:
cursorをジェネレータでラップ - ツリー走査: 再帰的に
yield fromで深さ優先列挙 - パイプライン処理: gen1 → gen2 → gen3 の連鎖で省メモリな ETL
- ページネーション: API の next_page を辿ってフラットに列挙
FAQ
Q: ジェネレータは何回でもループできる?
A: 1 回のみ。使い切ったら再度生成し直す必要があります。複数回反復したいなら list 化するか、iterable クラス (__iter__ 実装) にします。
Q: return value をジェネレータ内で使うと?
A: Python 3.3+ では StopIteration(value) を発生させます。yield from で値を受け取れます。
Q: yield と await の関係
A: 内部実装的には親戚 (どちらもコルーチン)。await は asyncio の文脈、yield はジェネレータの文脈、と使い分けます。
Q: ジェネレータをデバッグしにくい
A: 一度 list(gen) で展開してから print するのが基本。または print を yield 直前に挟む。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Laravel キャッシュクリア完全ガイド(cache:clear / config:clear / 2026-05-18 07:42:07
- プロジェクトの作成と削除 2026-05-18 07:42:07
- インストール直後にNetbeansが反応しない 2026-05-18 07:42:07
- 動画やチャンネルの検索 2026-05-18 07:42:07
- APIキー取得方法 2026-05-18 07:42:07
- チャンネル情報の取得 2026-05-18 07:42:07
- API 入門 — Web API(REST / GraphQL / gRPC / 2026-05-18 07:42:07
- インストール(eclipseプラグイン) 2026-05-18 07:42:07
- Laravel「Dotenv values containing spaces must be surrounded 2026-05-18 07:42:07
- エラー一覧 2026-05-18 07:42:07
- curl: (51) SSL: certificate subject name '~' does not match 2026-05-18 07:42:07
- インストール方法(Windows版) 2026-05-18 07:42:07
- JSONから配列に変換 2026-05-18 07:42:07
- 処理を一定時間待つ 2026-05-18 07:42:07
- A non well formed numeric value encountered 2026-05-18 07:42:07
コメントを削除してもよろしいでしょうか?