08 / 90

Day 08: ループ、ループ不変条件、関数の入力と出力

新しい内容:テキストに対する for ループ、ループが正しい理由を説明する初心者向けのループ不変条件、入力と戻り値が明示された関数。各活動は Day 04〜07 の短い想起(間隔をあけた復習)から始め、予測・観察・回復の証拠を記録する。小さな変更は使い捨ての Git リポジトリで管理する。

自律学習と Python 480 分(8 時間の集中学習)
01 120 分

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") の出力を予測する。

独立習得基準

実行前に書いたトレース表が実際の行と一致し、初期化・各反復後・終了時の不変条件を述べ、空文字列の場合と 2 コードポイントの分解形の場合を正しく予測している。

出典リソースと来歴

linking Copyright Al Sweigart; edition-specific reuse terms unverified linking only; no reproduction

Automate the Boring Stuff with Python, 3rd edition

著者・提供機関: Al Sweigart | オリジナル出所URL ↗

該当セクション・タイムスタンプ: 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)
The Python Tutorial ↗ compared_alternative [PSF License Version 2]

Guided Python syntax but assumes programming familiarity; paired with the beginner text rather than used as its replacement.

MIT OCW 6.0001 ↗ compared_alternative [CC BY-NC-SA 4.0]

Lectures and problem sets teach a broader CS1 course; the book offers shorter text-first entry and an answer appendix.

linking PSF License Version 2

The Python Tutorial: More Control Flow Tools

著者・提供機関: Python Software Foundation | オリジナル出所URL ↗

該当セクション・タイムスタンプ: 第 4.2〜4.10 節(for、range、関数の定義)

検証バージョンと日付: Python 3.12 ドキュメント(確認日: 2026-10-30)

選定理由:

Python の反復処理、関数、コンテナを確認するための一次資料。

ソース前提知識:

Day 01〜06 の Python の式とファイルシステムの基礎

安全フォールバック(オフライン回復性):

必要な動作はすべて教材内で説明しているため、オフラインでも完了できます。

比較対象候補リソースと選定評価 (2)
The Python Language Reference: Compound statements ↗ compared_alternative [PSF License Version 2]

同じ構文を文法レベルで定義するリファレンスです。段階を追って学べる構成のため、チュートリアルの章を選びました。

同じ制御フローを講義のペースで扱う教材です。本カリキュラムではターミナルでの演習を通じて概念を扱っているため、採用を見送りました。

02 120 分

関数:明示的な入力、戻り値、契約

エージェント支援の演習:まず自分の予測と実際の出力を記録すること。その後に限り AI エージェントに説明やレビューを頼んでよく、受けた支援は証拠に必ず記録する。

前提条件

今日の活動 1。回復先:数える処理の不変条件は活動 1、小さな def の書き方は Day 06 活動 2。

学習目標

数えるループを、明示的な入力(text、target)と整数の戻り値を持つ関数にまとめ、その契約を文書化し、return と print を区別する。

手順

参照資料: この活動に割り当てられた既存の読解・練習時間内で、Automate the Boring Stuff with Python, 3rd edition の Chapter 4; Practice Questions; Appendix B answers を参照し、ローカル課題とのつながりを一つ自分の言葉で説明する。既存の演習と合格基準は維持し、外部資料が開けない場合は本コース独自の説明を使う。間隔をあけた復習のウォームアップ: a = [1]; b = a; a.append(2) の後に b に何が入っているか(Day 05)を記憶から書き、確かめる。

新しい考え方: 関数の契約とは、どんな入力を期待し、何を返し、何を変えないかを述べたもの。count_char は text(文字列)と target(ちょうど 1 コードポイント)を受け取り、int を返し、入力を変更しない。return は呼び出し元に値を渡す。print は文字を表示するだけで、その関数は None を返す。

1. count_char の 7 つの出力を予測してから実行する。
2. shout の例の 2 行を予測してから実行する。

def count_char(text, target):
    """Return how many code points in text are equal to target (one code point)."""
    total = 0
    for ch in text:
        if ch == target:
            total += 1
    return total
print(count_char("", "a"))
print(count_char("aaaa", "a"))
print(count_char("猫猫犬", "猫"))
print(count_char("café", "e"))
print(count_char("cafe\u0301", "e"))
original = "été"
print(count_char(original, "é"), original)
print(count_char("abc", "ab"))
def shout(text):
    print(text.upper())
result = shout("hi")
print(result)

演習と予測記録

count_char の 7 回の呼び出し(空のテキスト、繰り返す文字、Unicode、合成済みと分解形の "é"、変わらない元の文字列、2 文字の target)と shout の例について予測を記録する。そのうえで count_char の契約(入力、出力、決して変えないもの)を自分の言葉で書く。

独立習得基準

9 つの予測をすべて実行前に書き、違いを説明している。契約には 2 つの入力、target の前提条件、int の出力、変更しない保証が含まれる。shout の結果が None になる理由を説明できる。

出典リソースと来歴

linking Copyright Al Sweigart; edition-specific reuse terms unverified linking only; no reproduction

Automate the Boring Stuff with Python, 3rd edition

著者・提供機関: Al Sweigart | オリジナル出所URL ↗

該当セクション・タイムスタンプ: Chapter 4; 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)
The Python Tutorial ↗ compared_alternative [PSF License Version 2]

Guided Python syntax but assumes programming familiarity; paired with the beginner text rather than used as its replacement.

MIT OCW 6.0001 ↗ compared_alternative [CC BY-NC-SA 4.0]

Lectures and problem sets teach a broader CS1 course; the book offers shorter text-first entry and an answer appendix.

linking PSF License Version 2

The Python Tutorial: More Control Flow Tools

著者・提供機関: Python Software Foundation | オリジナル出所URL ↗

該当セクション・タイムスタンプ: 第 4.2〜4.10 節(for、range、関数の定義)。データ構造は同じチュートリアルの第 5 章

検証バージョンと日付: Python 3.12 ドキュメント(確認日: 2026-10-30)

選定理由:

Python の反復処理、関数、コンテナを確認するための一次資料。

ソース前提知識:

Day 01〜06 の Python の式とファイルシステムの基礎

安全フォールバック(オフライン回復性):

必要な動作はすべて教材内で説明しているため、オフラインでも完了できます。

比較対象候補リソースと選定評価 (2)
The Python Language Reference: Compound statements ↗ compared_alternative [PSF License Version 2]

同じ構文を文法レベルで定義するリファレンスです。段階を追って学べる構成のため、チュートリアルの章を選びました。

同じ制御フローを講義のペースで扱う教材です。本カリキュラムではターミナルでの演習を通じて概念を扱っているため、採用を見送りました。

03 120 分

2 変数の不変条件と、小さなコミット・安全な復元

エージェント支援の演習:まず自分の予測と実際の出力を記録すること。その後に限り AI エージェントに説明やレビューを頼んでよく、受けた支援は証拠に必ず記録する。

前提条件

今日の活動 1〜2、Git がインストール済みであること。回復先:git diff と git restore は Day 07 活動 3。

学習目標

2 つのループ変数と明示した不変条件で longest_run(text, target) を実装し、使い捨てリポジトリに記録したうえで、不要な未コミットの編集を確認し、git restore で安全に破棄する。

手順

間隔をあけた復習: Git の部分は Day 07 の復元手順を Python ファイルで繰り返すので、コマンドには見覚えがあるはず。

2 変数の不変条件: 各反復の後、run は直前に訪れた文字で終わる target の連続の長さで、best はこれまでに訪れた範囲での最長の連続である。

1. 実行前に 4 つの出力を予測し、"aabaaa" のトレース表(ch / run / best)を書く。

def longest_run(text, target):
    best = 0
    run = 0
    for ch in text:
        if ch == target:
            run += 1
        else:
            run = 0
        if run > best:
            best = run
    return best
print(longest_run("", "a"))
print(longest_run("baaab", "a"))
print(longest_run("aabaaa", "a"))
print(longest_run("猫猫犬猫", "猫"))

2. 新しい一時ディレクトリで関数をコミットし、不要なデバッグ行を追加して確認し、復元する。出力はすべて先に予測する:

cd "$(mktemp -d)"
git init -q
git config user.name "Learner"
git config user.email "[email protected]"
cat > stats.py <<'EOF'
def longest_run(text, target):
    best = 0
    run = 0
    for ch in text:
        if ch == target:
            run += 1
        else:
            run = 0
        if run > best:
            best = run
    return best
print(longest_run("猫猫犬猫", "猫"))
EOF
git add stats.py
git commit -q -m "Add longest_run"
python3 stats.py
printf 'print("debug", longest_run("", "a"))\n' >> stats.py
python3 stats.py
git diff --stat
git restore stats.py
git status --short
python3 stats.py
git log --format=%s

演習と予測記録

longest_run("aabaaa", "a") のトレース表、4 回の呼び出し(空文字列と "猫猫犬猫" を含む)の予測と観察、そしてデバッグ行が現れること・差分の要約・git restore 後にクリーンな status と変わらない出力に戻ることを示す Git の記録を提出する。

独立習得基準

トレース表が参考の行と一致し、4 回の呼び出しを正しく予測するか食い違いを説明し、Git の記録が参考出力と一致して、コミット履歴に触れずに不要な編集を取り除いたことを示している。

出典リソースと来歴

linking PSF License Version 2

The Python Tutorial: More Control Flow Tools

著者・提供機関: Python Software Foundation | オリジナル出所URL ↗

該当セクション・タイムスタンプ: 第 4.2〜4.10 節(for、range、関数の定義)。データ構造は同じチュートリアルの第 5 章

検証バージョンと日付: Python 3.12 ドキュメント(確認日: 2026-10-30)

選定理由:

Python の反復処理、関数、コンテナを確認するための一次資料。

ソース前提知識:

Day 01〜06 の Python の式とファイルシステムの基礎

安全フォールバック(オフライン回復性):

必要な動作はすべて教材内で説明しているため、オフラインでも完了できます。

比較対象候補リソースと選定評価 (2)
The Python Language Reference: Compound statements ↗ compared_alternative [PSF License Version 2]

同じ構文を文法レベルで定義するリファレンスです。段階を追って学べる構成のため、チュートリアルの章を選びました。

同じ制御フローを講義のペースで扱う教材です。本カリキュラムではターミナルでの演習を通じて概念を扱っているため、採用を見送りました。

04 120 分

独立チェック:ループを予測し、関数を書く

独立習得チェック:証拠を提出するまで AI の支援も参考解答も使わない。受けた支援は正直に申告する。

前提条件

今日の活動 1〜3 を証拠付きで終えていること。回復先:活動 1(不変条件)、活動 2(契約)、Day 07(条件)。

学習目標

支援なしで分岐を含むループをトレースし、空・繰り返し・Unicode のテキストをコードポイント単位で正しく扱う count_in(text, chars) を、不変条件を明示して実装する。

手順

間隔をあけた復習: ループ内の分岐は Day 06 の条件の再利用である。証拠を提出するまで参考解答を開かず、AI も使わない。

1. このループが出力する数を予測してから実行する。文字列が空だった場合の結果も予測する。

total = 0
for ch in "a猫a":
    if ch != "a":
        total += 10
    else:
        total += 1
print(total)

2. count_in(text, chars) を実装する:text のコードポイントのうち chars のどこかに現れるものの数を返す(1 文字の ch について、式 ch in chars は ch が chars に含まれるとき True)。不変条件をコメントか文で書いてから、count_in("", "aeiou")、count_in("banana", "an")、count_in("naïve", "aeiouï")、count_in("cafe\u0301", "é")、count_in("猫と犬", "猫犬") を予測し、テストする。

演習と予測記録

ループの予測(空でない場合と空の場合)、不変条件付きの count_in のコード、5 つの予測と 5 つの実測結果、そして count_in("cafe\u0301", "é") が 0 になる理由を 1 文で提出する。

独立習得基準

支援なしで:ループの予測(空の場合を含む)が正しく、count_in が 5 ケースすべてに合格し、不変条件を正しく述べ、分解形アクセントのケースをコードポイントの単位で説明している。

出典リソースと来歴

linking PSF License Version 2

The Python Tutorial: More Control Flow Tools

著者・提供機関: Python Software Foundation | オリジナル出所URL ↗

該当セクション・タイムスタンプ: 第 4.2〜4.10 節(for、range、関数の定義)

検証バージョンと日付: Python 3.12 ドキュメント(確認日: 2026-10-30)

選定理由:

Python の反復処理、関数、コンテナを確認するための一次資料。

ソース前提知識:

Day 01〜06 の Python の式とファイルシステムの基礎

安全フォールバック(オフライン回復性):

必要な動作はすべて教材内で説明しているため、オフラインでも完了できます。

比較対象候補リソースと選定評価 (2)
The Python Language Reference: Compound statements ↗ compared_alternative [PSF License Version 2]

同じ構文を文法レベルで定義するリファレンスです。段階を追って学べる構成のため、チュートリアルの章を選びました。

同じ制御フローを講義のペースで扱う教材です。本カリキュラムではターミナルでの演習を通じて概念を扱っているため、採用を見送りました。