for ループと初心者向けのループ不変条件
エージェント支援の演習:まず自分の予測と実際の出力を記録すること。その後に限り AI エージェントに説明やレビューを頼んでよく、受けた支援は証拠に必ず記録する。
前提条件
Day 07(独立チェックを含む)を修了していること。回復先:Day 07(値と条件)。Day 07 のループ予告は任意の予備知識。
学習目標
文字列に対する for ループを 1 コードポイントずつトレースし、ループ前・各反復後・終了時に成り立つループ不変条件を、空文字列や Unicode 文字列の場合も含めて述べる。
手順
参照資料: この活動に割り当てられた既存の読解・練習時間内で、Automate the Boring Stuff with Python, 3rd edition の Chapter 3; Practice Questions; Appendix B answers を参照し、ローカル課題とのつながりを一つ自分の言葉で説明する。既存の演習と合格基準は維持し、外部資料が開けない場合は本コース独自の説明を使う。間隔をあけた復習のウォームアップ(10 分): bool("")、bool(" ")、"0" == 0 を記憶から予測し、確かめる。昨日の復習のおかげですぐ答えられるはずで、時間がかかるものが見直すべき点である。
新しい考え方: for ループは各要素について本体を 1 回ずつ実行する。文字列の場合、要素は Unicode のコードポイント 1 つ。ループ不変条件とは、最初の反復の前に成り立ち、各反復の後も成り立ち続ける、変数についての文である。数える処理の不変条件は「total は、これまでに訪れた文字のうち一致したものの数に等しい」。
1. 実行前に、visited / total / 不変条件は成り立つか? の列でトレース表を埋める。
2. コードを実行する。同じ列が出力されるので表と照合できる。
3. 2 つ目のコードで、空文字列の場合(本体は 0 回実行)とコードポイントにまつわる意外な結果を確かめる。
text = "été"
target = "é"
total = 0
visited = ""
for ch in text:
if ch == target:
total += 1
visited += ch
print(repr(visited), total, total == visited.count(target))
print("final", total, visited == text)
text = ""
total = 0
for ch in text:
total += 1
print("final", total)
print(len("é"), len("e\u0301"), "é" == "e\u0301")
演習と予測記録
実行前に text = "été"、target = "é" の完全なトレース表を書く。次に 3 つの時点の不変条件を述べる:ループ前(total = 0、まだ何も訪れていない)、各反復後、終了時(visited == text なので total が答え)。最後に空文字列の場合と len("e\u0301") の出力を予測する。
ループ前は何も訪れておらず total は 0 なので、不変条件はすでに成り立つ。各反復で visited に 1 文字加わり、その文字が一致したときだけ total に 1 を足すので、不変条件は成り立ち続ける。1 コードポイント(U+00E9)で書いた "é" は、"e" に結合用アクセント(U+0301)を続けた 2 コードポイントの文字列とは別物である。
最初のコードの出力:
'é' 1 True
'ét' 1 True
'été' 2 True
final 2 True
解いたトレース:開始時 visited = ""、total = 0(何もない中に一致は 0 なので不変条件は真)。1 回目:ch = "é" は一致、total = 1、visited = "é"。2 回目:ch = "t" は一致しない、total は 1 のまま、visited = "ét"。3 回目:ch = "é" は一致、total = 2、visited = "été"。終了時は visited が text と等しいので、不変条件から total はテキスト全体の一致数 2 である。
2 つ目のコードの出力:
final 0
1 2 False
空のテキストでは本体が一度も実行されず、total は 0 のままで、終了時も不変条件は成り立つ。Python はコードポイントを数えるので len("e\u0301") は 2 であり、分解形は 1 コードポイントの "é" と等しくない。
実行前に書いたトレース表が実際の行と一致し、初期化・各反復後・終了時の不変条件を述べ、空文字列の場合と 2 コードポイントの分解形の場合を正しく予測している。
出典リソースと来歴
Automate the Boring Stuff with Python, 3rd edition
該当セクション・タイムスタンプ: Chapter 3; Practice Questions; Appendix B answers
検証バージョンと日付: Public edition checked 2026-11-01; moving pages may change
Beginner teaching and answer-keyed practice before checking exact semantics in the Python reference; selected chapters only, not the book's entire automation stack.
No prior programming required for Chapter 1; later chapters assume its basic Python concepts.
Use the original localized explanations, exercises and checks already present in this activity; no external account or purchase is required for that fallback.
比較対象候補リソースと選定評価 (2)
Guided Python syntax but assumes programming familiarity; paired with the beginner text rather than used as its replacement.
Lectures and problem sets teach a broader CS1 course; the book offers shorter text-first entry and an answer appendix.
The Python Tutorial: More Control Flow Tools
該当セクション・タイムスタンプ: 第 4.2〜4.10 節(for、range、関数の定義)
検証バージョンと日付: Python 3.12 ドキュメント(確認日: 2026-10-30)
Python の反復処理、関数、コンテナを確認するための一次資料。
Day 01〜06 の Python の式とファイルシステムの基礎
必要な動作はすべて教材内で説明しているため、オフラインでも完了できます。
比較対象候補リソースと選定評価 (2)
同じ構文を文法レベルで定義するリファレンスです。段階を追って学べる構成のため、チュートリアルの章を選びました。
同じ制御フローを講義のペースで扱う教材です。本カリキュラムではターミナルでの演習を通じて概念を扱っているため、採用を見送りました。