Python / LESSON 05 / PY05

Python:繰り返し(for / while / range)

1学習の目的

2基礎解説

やりたいこと書き方意味
回数を決めて繰り返すfor i in range(5):0,1,2,3,4 の5回
リストを1つずつ処理for item in items:要素を先頭から順に取り出す
条件が続く間くり返すwhile 条件:条件がFalseになるまで繰り返す
抜ける/飛ばすbreak / continueループ中断/その周回だけスキップ
✅ 覚えるべき重要ポイント
  1. range(5)0,1,2,3,45は含まないのが最重要。1〜5が欲しいなら range(1, 6)
  2. 第3引数で刻み幅を指定できる。range(2, 11, 2) → 2,4,6,8,10。
  3. リストは for item in items: で直接取り出すのがPythonらしい書き方。range(len(items)) は基本使わない。
  4. whileはカウンタの更新を忘れると無限ループになる。count -= 1 をループ内に必ず書く。止めるときは Ctrl+C。
  5. 合計を出すときはループの前に入れ物を用意する。total = 0 → ループ内で total += x。初期化忘れは定番のエラー。

現場使用例:CSVの全行を1行ずつ処理、売上リストの合計・平均を集計、条件に合うデータだけ抽出、APIが成功するまで再試行 while not ok:

items = ["りんご", "みかん", "ぶどう"]

for item in items:
    print(f"{item}を処理しました")

# 回数を指定して繰り返す+合計を積み上げる
total = 0
for i in range(1, 6):
    total += i
print(f"1〜5の合計:{total}")   # 15

# 条件が満たされる間くり返す
count = 3
while count > 0:
    print(f"あと{count}回")
    count -= 1   # ← これを忘れると無限ループ

3基本ドリル(10問)

PY05-D01 range を使って 0 から 4 までの数字を1行ずつ出力せよ。 コーディング★☆☆無料
期待される結果

0〜4が1行ずつ5行

ヒント

for i in range(5): の中で print(i)。

模範解答
for i in range(5):
    print(i)
解説

forの最小形。range(5)は「5個ぶん」であって「5まで」ではない点をここで体に入れる。

PY05-D02 range(1, 5) が生成する数はどれか。
A. 1, 2, 3, 4 B. 1, 2, 3, 4, 5 C. 0, 1, 2, 3, 4 D. 1 と 5 だけ
選択★☆☆無料
期待される結果

解答 == A

ヒント

開始は含む、終了は含まない。

模範解答
A
解説

range(開始, 終了) は「開始以上・終了未満」。1〜5が欲しければ range(1, 6) と書く。この1つズレるミスは最頻出のバグ原因。

PY05-D03 animals = ["犬", "猫", "鳥"] の各要素を「犬が好きです」の形式で1行ずつ出力せよ。 コーディング★☆☆無料
期待される結果

3行「○が好きです」

ヒント

for animal in animals: で1つずつ取り出せる。

模範解答
animals = ["犬", "猫", "鳥"]
for animal in animals:
    print(f"{animal}が好きです")
解説

リストの要素を直接取り出す形。インデックス番号を経由しないので短く、間違いにくい。

PY05-D04 1から10までの合計を求めるコードを完成させよ。 穴埋め★☆☆無料
コード
total = 0
for i in range(1, 11):
    total ____ i
print(total)
期待される結果

出力 == 55

ヒント

total に i を足し込む。「+=」を使う。

模範解答
total += i
解説

「ループの外で初期化 → ループ内で積み上げ」は集計処理の基本形。total = 0 をループの中に書くと毎回リセットされてしまう。

PY05-D05 count = 1while count <= 3:  print(count) と書いた場合どうなるか。
A. 1,2,3が出る B. 1が無限に出続ける C. 何も出ない D. エラーになる
選択★☆☆無料
期待される結果

解答 == B

ヒント

countの値はどこかで変化しているか?

模範解答
B
解説

count が1のまま変わらないので条件が永遠にTrue=無限ループ。whileを書いたらカウンタ更新を書くとセットで覚える。

PY05-D06 2 から 10 までの偶数(2, 4, 6, 8, 10)を1行ずつ出力せよ。ifは使わず range だけで書くこと。 コーディング★★☆無料
期待される結果

2,4,6,8,10が1行ずつ

ヒント

range(開始, 終了, 刻み幅) の第3引数を使う。

模範解答
for i in range(2, 11, 2):
    print(i)
解説

刻み幅を使えばifは不要。range(10, 0, -1) と書けば逆順のカウントダウンもできる。

PY05-D07 3, 2, 1 とカウントダウンするコードを完成させよ。 穴埋め★★☆無料
コード
count = 3
while count > 0:
    print(count)
    ____
期待される結果

3,2,1が1行ずつ

ヒント

count を1ずつ減らす。

模範解答
count -= 1
解説

D05で見た無限ループを防ぐ1行。whileはこの更新行があって初めて終われる。

PY05-D08 ループの中で continue が実行されると何が起きるか。
A. ループを完全に抜ける B. その周回の残りを飛ばして次の周回へ進む C. ループを最初からやり直す D. プログラムが終了する
選択★★☆無料
期待される結果

解答 == B

ヒント

break との違いを考える。

模範解答
B
解説

break は「ループごと脱出」、continue は「今回だけスキップ」。continue は「不正なデータの行を飛ばす」処理でよく使う。

PY05-D09 1 から順に数を出力し、5 になったら出力せずにループを抜けよ(1, 2, 3, 4 が出力される)。 コーディング★★☆無料
期待される結果

1,2,3,4が1行ずつ

ヒント

if で 5 を判定して break。break を print より先に書く。

模範解答
for i in range(1, 11):
    if i == 5:
        break
    print(i)
解説

「見つかったら即終了」は検索処理の基本形。break を print の後に書くと5まで出てしまうので、順序が意味を持つ。

PY05-D10 items = ["書類", "印鑑", "封筒"] を「1. 書類」のように1から始まる番号付きで出力せよ。 コーディング★★☆無料
期待される結果

1. 書類 / 2. 印鑑 / 3. 封筒

ヒント

enumerate(items, 1) で「番号と要素」を同時に取り出せる。

模範解答
items = ["書類", "印鑑", "封筒"]
for i, item in enumerate(items, 1):
    print(f"{i}. {item}")
解説

enumerate は「番号を振りながら回す」専用の道具。第2引数で開始番号を指定できる(省略すると0始まり)。

4実践シナリオ(5問)

PY05-S01 【売上集計】sales = [12000, 8500, 23000, 4500, 17800] の合計と平均を求め、2行で出力せよ。
「合計:65,800円」「平均:13,160円」(平均は小数点なしの整数表示)
コーディング★★☆無料
期待される結果

出力2行が完全一致

ヒント

total = 0 で初期化してから足し込む。平均は total / len(sales)。表示は {x:,.0f}。

模範解答
sales = [12000, 8500, 23000, 4500, 17800]

total = 0
for s in sales:
    total += s

average = total / len(sales)

print(f"合計:{total:,}円")
print(f"平均:{average:,.0f}円")
解説

集計処理の最頻出パターン。len() は要素数を返す関数。実務ではこの形で日次・月次の集計スクリプトを書く。

PY05-S02 【九九の段】n = 7 のとき、7の段を「7 × 1 = 7」の形式で1〜9まで9行出力せよ。 コーディング★★☆無料
期待される結果

9行。1行目 7 × 1 = 7、9行目 7 × 9 = 63

ヒント

range(1, 10) で回し、f-stringの中で n * i を計算する。

模範解答
n = 7
for i in range(1, 10):
    print(f"{n} × {i} = {n * i}")
解説

f-stringの {} の中には式も書ける。計算結果を別の変数に入れなくてよいので、こういう表形式の出力が短く書ける。

PY05-S03 【条件付き抽出】scores = [82, 45, 91, 67, 38, 75] のうち60点以上のものだけを「合格:82点」の形式で出力し、最後に「合格者数:4人」と出力せよ。 コーディング★★☆無料
期待される結果

合格4件を出力後、最終行 合格者数:4人

ヒント

ループの中に if を入れる。カウンタ count = 0 をループの前に用意する。

模範解答
scores = [82, 45, 91, 67, 38, 75]

count = 0
for score in scores:
    if score >= 60:
        print(f"合格:{score}点")
        count += 1

print(f"合格者数:{count}人")
解説

繰り返し+条件分岐の組み合わせ。PY04で学んだifがそのままループの中で使える。データの絞り込みはすべてこの形。

PY05-S04 【貯金シミュレーション】毎月30,000円ずつ貯金する。残高が500,000円以上になるのは何ヶ月目かを while で求め、「17ヶ月目に達成(残高510,000円)」の形式で出力せよ。 コーディング★★★無料
期待される結果

出力 == 17ヶ月目に達成(残高510,000円)

ヒント

balance = 0, month = 0 から始め、条件は balance < 500000。ループ内で残高と月数の両方を更新する。

模範解答
balance = 0
month = 0

while balance < 500000:
    balance += 30000
    month += 1

print(f"{month}ヶ月目に達成(残高{balance:,}円)")
解説

繰り返す回数が事前にわからないのでforではなくwhileを使う。これがforとwhileの使い分けの本質。割り算だと16.67ヶ月となり「17ヶ月目」という答えが出せない。

PY05-S05 【FizzBuzz】1から20までを1行ずつ出力せよ。ただし3の倍数なら数字の代わりに「Fizz」、5の倍数なら「Buzz」、3と5の両方の倍数なら「FizzBuzz」と出力すること。 コーディング★★★無料
期待される結果

20行。3行目 Fizz、5行目 Buzz、15行目 FizzBuzz

ヒント

「3と5の両方の倍数」=15の倍数。厳しい条件から先に判定する(PY04の鉄則)。

模範解答
for i in range(1, 21):
    if i % 15 == 0:
        print("FizzBuzz")
    elif i % 3 == 0:
        print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    else:
        print(i)
解説

プログラミング面接の超定番問題。3の判定を先に書くと15のときFizzしか出ない。条件は厳しい順というPY04の教訓がそのまま効いてくる。

5仕上げ課題

PY05-FINAL 【上半期 売上レポート】6ヶ月分の売上から、月別明細と集計を出力するスクリプトを書け。
sales = [128000, 95000, 143000, 87000, 156000, 112000] # 1月〜6月
target = 120000


仕様:
① 各月を「1月:128,000円」の形式で出力。目標(target)以上の月は末尾に「 ✔達成」を付ける
② 明細の後に --- の行を出す
③ 合計と平均(整数表示)を1行で出す
④ 達成した月数と、最高売上・その月を1行で出す

出力仕様(10行):
=== 上半期 売上レポート ===
1月:128,000円 ✔達成
2月:95,000円
3月:143,000円 ✔達成
4月:87,000円
5月:156,000円 ✔達成
6月:112,000円
---
合計:721,000円 / 平均:120,167円
達成月:3ヶ月 / 最高:156,000円(5月)
期待される結果

出力10行が完全一致

ヒント

enumerate(sales, 1) で月番号と金額を同時に取り出す。合計・達成数・最高額はループ前に変数を用意し、1回のループの中でまとめて更新していく。「 ✔達成」はif分岐で文字列を作り、f-stringに埋め込む。

模範解答
sales = [128000, 95000, 143000, 87000, 156000, 112000]
target = 120000

print("=== 上半期 売上レポート ===")

total = 0
achieved = 0
best = 0
best_month = 0

for i, amount in enumerate(sales, 1):
    total += amount

    if amount >= target:
        achieved += 1
        mark = " ✔達成"
    else:
        mark = ""

    if amount > best:
        best = amount
        best_month = i

    print(f"{i}月:{amount:,}円{mark}")

average = total / len(sales)

print("---")
print(f"合計:{total:,}円 / 平均:{average:,.0f}円")
print(f"達成月:{achieved}ヶ月 / 最高:{best:,}円({best_month}月)")
解説

1回のループで複数の集計を同時に進めるのがポイント。合計・件数・最大値を求めるためにループを3回まわす必要はない。実務のレポート生成スクリプトはまさにこの形で、ここが書ければ「業務を自動化する道具」としてPythonを使い始められる。