Python:繰り返し(for / while / range)
1学習の目的
- for と while を使い分けて、同じ処理を何度も自動で繰り返せるようになる。手作業でコピペしていた処理が数行で書けるようになる。
- 「合計を出す」「条件に合うものだけ抜き出す」「番号を振る」といった集計処理を組み立てられるようになる。実務の自動化スクリプトはほぼ繰り返しでできている。
2基礎解説
| やりたいこと | 書き方 | 意味 |
|---|---|---|
| 回数を決めて繰り返す | for i in range(5): | 0,1,2,3,4 の5回 |
| リストを1つずつ処理 | for item in items: | 要素を先頭から順に取り出す |
| 条件が続く間くり返す | while 条件: | 条件がFalseになるまで繰り返す |
| 抜ける/飛ばす | break / continue | ループ中断/その周回だけスキップ |
- range(5) は 0,1,2,3,4。5は含まないのが最重要。1〜5が欲しいなら range(1, 6)。
- 第3引数で刻み幅を指定できる。range(2, 11, 2) → 2,4,6,8,10。
- リストは for item in items: で直接取り出すのがPythonらしい書き方。range(len(items)) は基本使わない。
- whileはカウンタの更新を忘れると無限ループになる。count -= 1 をループ内に必ず書く。止めるときは Ctrl+C。
- 合計を出すときはループの前に入れ物を用意する。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問)
0〜4が1行ずつ5行
for i in range(5): の中で print(i)。
for i in range(5):
print(i)
forの最小形。range(5)は「5個ぶん」であって「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つズレるミスは最頻出のバグ原因。
3行「○が好きです」
for animal in animals: で1つずつ取り出せる。
animals = ["犬", "猫", "鳥"]
for animal in animals:
print(f"{animal}が好きです")
リストの要素を直接取り出す形。インデックス番号を経由しないので短く、間違いにくい。
total = 0
for i in range(1, 11):
total ____ i
print(total)
出力 == 55
total に i を足し込む。「+=」を使う。
total += i
「ループの外で初期化 → ループ内で積み上げ」は集計処理の基本形。total = 0 をループの中に書くと毎回リセットされてしまう。
A. 1,2,3が出る B. 1が無限に出続ける C. 何も出ない D. エラーになる 選択★☆☆無料
解答 == B
countの値はどこかで変化しているか?
B
count が1のまま変わらないので条件が永遠にTrue=無限ループ。whileを書いたらカウンタ更新を書くとセットで覚える。
2,4,6,8,10が1行ずつ
range(開始, 終了, 刻み幅) の第3引数を使う。
for i in range(2, 11, 2):
print(i)
刻み幅を使えばifは不要。range(10, 0, -1) と書けば逆順のカウントダウンもできる。
count = 3
while count > 0:
print(count)
____
3,2,1が1行ずつ
count を1ずつ減らす。
count -= 1
D05で見た無限ループを防ぐ1行。whileはこの更新行があって初めて終われる。
A. ループを完全に抜ける B. その周回の残りを飛ばして次の周回へ進む C. ループを最初からやり直す D. プログラムが終了する 選択★★☆無料
解答 == B
break との違いを考える。
B
break は「ループごと脱出」、continue は「今回だけスキップ」。continue は「不正なデータの行を飛ばす」処理でよく使う。
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まで出てしまうので、順序が意味を持つ。
1. 書類 / 2. 印鑑 / 3. 封筒
enumerate(items, 1) で「番号と要素」を同時に取り出せる。
items = ["書類", "印鑑", "封筒"]
for i, item in enumerate(items, 1):
print(f"{i}. {item}")
enumerate は「番号を振りながら回す」専用の道具。第2引数で開始番号を指定できる(省略すると0始まり)。
4実践シナリオ(5問)
「合計: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() は要素数を返す関数。実務ではこの形で日次・月次の集計スクリプトを書く。
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の {} の中には式も書ける。計算結果を別の変数に入れなくてよいので、こういう表形式の出力が短く書ける。
合格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がそのままループの中で使える。データの絞り込みはすべてこの形。
出力 == 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ヶ月目」という答えが出せない。
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仕上げ課題
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を使い始められる。