4. 繰り返し処理で効率アップ
目次
- 4.1 for 文で決まった回数繰り返す
- 4.2 range 関数で連続した数字を扱う
- 4.3 while 文で条件が変わるまで繰り返す
- 4.4 break, continue で繰り返しをコントロール
- 4.5 リストと for 文でまとめて処理する
- 4.6 二重ループで表や表組みを作る
- 4.7 無限ループに注意しよう
- Ex.1 1 から 100 までの合計を求めるプログラム
- Ex.2 1 から 10 までの数字で掛け算表を表示するプログラム
この講座で使用する Google Colab の URL
4. 繰り返し処理で効率アップ (Google Colab)
演習課題
Ex.4. 繰り返し処理で効率アップ (Google Colab)
この講座で使用する Python, Jupyter Notebook のファイルと実行環境
Lesson 4: high-school-python-code (GitHub)
4.1 for 文で決まった回数繰り返す
私たちの日常生活には、「同じことを繰り返す」場面がたくさんあります。例えばこんなものです。
- 腕立て伏せを 10 回する
- クラスの全員にプリントを配る
- 商品の合計金額を計算する
プログラミングでも同様に、同じ処理を繰り返すことがよくあります。この「繰り返し」を行うための基本的な方法が for
文です。
for 文の基本
単純な繰り返し
単純な繰り返し
for i in range(5):
print("こんにちは")
# 実行結果
# こんにちは
# こんにちは
# こんにちは
# こんにちは
# こんにちは
繰り返しの番号を使う
繰り返しの番号を使う
for i in range(3):
print(f"{i + 1}回目:こんにちは")
# 実行結果
# 1回目:こんにちは
# 2回目:こんにちは
# 3回目:こんにちは
for ループのイメージ
for ループをイメージで表すと、このようなイメージです。ボタンを押して試してみてください!
for 文のいろいろな使い方
for 文は、先ほど見たような純粋な使い方以外にも、これらのような使い方ができます。
1. 文字列の一文字ずつ処理
文字列の一文字ずつ処理
# 文字列の各文字を表示
word = "Python"
for char in word:
print(char)
# 実行結果
# P
# y
# t
# h
# o
# n
2. 数値の範囲を指定する
数値の範囲を指定する
# 1 から 5 までを表示
for i in range(1, 6):
print(f"数字:{i}")
# 2 ずつ増やす
for i in range(0, 10, 2):
print(f"偶数:{i}")
3. 合計値を計算する
合計値を計算する
# 1 から 10 までの合計値を計算
total = 0
for i in range(1, 11):
total = total + i
print(f"合計:{total}") # 55
# テストの平均点を計算
scores = [85, 92, 78, 90, 88]
sum = 0
for score in scores:
sum = sum + score
average = sum / len(scores)
print(f"平均点:{average}")
Q: for文でよくある間違いは?
A: 以下の点に注意しましょう:
- インデントを忘れる
- range(n) を意図した回数とズレた書き方で使う
- カウンター変数の値を変更しようとする(for 文の中で書かなくても自動的に変更されます)
4.2 range 関数で連続した数字を扱う
前回学んだ for 文では、range 関数を使って繰り返す回数を指定しました。この range 関数には、より細かい指定ができる機能があります。
range 関数の基本形
range 関数には 3 つの使い方があります。
- range(stop): 0 から始めて止まる数の手前まで
- range(start, stop): 開始する数から止まる数の手前まで
- range(start, stop, step): 開始する数から止まる数の手前まで、指定した間隔で
1. range(stop) - 最も基本的な使い方
range(stop) の使い方
print("5 回繰り返し:")
for i in range(5):
print(i)
# 5 回繰り返し:
# 0
# 1
# 2
# 3
# 4
2. range(start, stop) - 開始値を指定
range(start, stop) の使い方
print("1 から 5 まで表示:")
for i in range(1, 6):
print(i)
# 1 から 5 まで表示:
# 1
# 2
# 3
# 4
# 5
3. range(start, stop, step) - 間隔も指定
range(start, stop, step) の使い方
# 0 から 8 まで 2 ずつ増やす
print("偶数の表示:")
for i in range(0, 10, 2):
print(i)
# 偶数の表示:
# 0
# 2
# 4
# 6
# 8
range 関数の注意点
- 最後の数(stop)は含まれません
- step には 0 以外の整数を指定します
- マイナスの step で逆順にできます
range(1, 6)
: 1, 2, 3, 4, 5range(5)
: 0, 1, 2, 3, 4range(0, 10, 2)
: 0, 2, 4, 6, 8range(5, 0, -1)
: 5, 4, 3, 2, 1
逆順に使う
逆順に使う
# 5 から 1 まで表示
for i in range(5, 0, -1):
print(i)
# 5 から 1 まで表示:
# 5
# 4
# 3
# 2
# 1
4.3 while 文で条件が変わるまで繰り返す
先ほど学んだ for 文は「決まった回数」の繰り返しでした。でも実際のプログラムでは、「条件を満たすまで」繰り返したいことがあります。例えば、
- 正しいパスワードが入力されるまで確認を繰り返す
- ゲームオーバーになるまでプレイを続ける
- 目標金額に達するまで貯金を続ける
などです。このような「条件が満たされる間、繰り返す」処理を行うのが while
文です。
while 文の基本
基本的な書き方
while 文の基本形
while 条件:
繰り返したい処理
カウントダウンの例
カウントダウンタイマー
count = 5
while count > 0:
print(count)
count = count - 1
print("時間切れ!")
# 実行結果
# 5
# 4
# 3
# 2
# 1
# 時間切れ!
このプログラムの動作は、このような流れです。
- count が 0 より大きい間繰り返す
- count を表示して1減らす
- count が 0 になったら終了
具体的な例
幾つかの例を見てみましょう。
1. パスワード入力
パスワード入力
# 正しいパスワードが入力されるまで繰り返す
password = ""
attempts = 0 # 試行回数
while password != "secret":
attempts += 1
password = input(f"パスワードを入力してください({attempts}回目):")
if attempts >= 3: # 3回まで
print("回数の上限を超えました")
break
if password == "secret":
print("ログイン成功!")
2. 数当てゲーム
数当てゲーム
import random
# 1 から 100 までのランダムな数を当てるゲーム
target = random.randint(1, 100)
guess = 0
tries = 0
print("1 から 100 までの数を当ててください")
while guess != target:
tries += 1
guess = int(input(f"{tries}回目の予想:"))
if guess > target:
print("もっと小さい数です")
elif guess < target:
print("もっと大きい数です")
print(f"正解!{tries}回で当てました!")
3. 合計値の計算
合計値の計算
# 合計が 100 を超えるまで数を足していく
total = 0
count = 0
while total <= 100:
count += 1
total += count
print(f"現在の合計: {total}")
print(f"{count}回で合計が{total}になりました")
while 文で気をつけること
- 条件が必ず「いつか」False になるようにする
- 条件を変更する処理を忘れない
- 無限ループに注意
while 文を書くときは、無限ループにならないように注意しましょう。もし無限ループになってしまった場合は、落ち着いて Google Colab を開いているブラウザのタブを閉じて強制終了させましょう。
無限ループの例
# 無限ループの例 (実行しないでください!)
count = 1
while count > 0:
print(count) # count が減らないので永遠に続く
# 正しい例
count = 1
while count > 0:
print(count)
# count を減らして必ず終わるようにする
count -= 1
4.4 break, continue で繰り返しをコントロール
繰り返し処理をしていると、「ここで終了したい」「この回はスキップしたい」といったタイミングがあります。そんなときに使うのが break
と continue
です。
break: 繰り返しを途中で終了
break は、繰り返しを途中で終了させるためのキーワードです。
基本的な使い方
この例では、break を書いているので、わざと while True
で無限ループにしています。
yes, no で終了を制御
while True:
answer = input("続けますか?(y/n):")
if answer == "n":
print("終了します")
break
print("続けます")
print("プログラムを終了しました")
for 文や while 文でも、if 文と同じように else を使えます。for 文での else は、break されずに正常に終了した場合に実行されます。
数当てゲームの例
target = 7
for i in range(5):
guess = int(input(f"1 から 10 の数を当ててください(残り {5 - i} 回):"))
if guess == target:
print("正解!おめでとう!")
break
print("違います")
else: # for ループが正常に (break されずに) 終了した場合
print("ゲームオーバー")
# while 文でも同様に else が使えます
count = 5
while count > 0:
guess = int(input(f"1 から 10 の数を当ててください(残り {count} 回):"))
count -= 1
if guess == target:
print("正解!おめでとう!")
break
print("違います")
else: # while ループが正常に (break されずに) 終了した場合
print("ゲームオーバー")
continue: 次の繰り返しにスキップ
continue は、現在の繰り返しをスキップして次の繰り返しに進むためのキーワードです。その回だけ飛ばすので注意しましょう。
基本的な使い方
3 の倍数をスキップする
for i in range(1, 6):
if i % 3 == 0:
print(f"{i} はスキップします")
continue
print(f"数字: {i}")
# 実行結果
# 数字: 1
# 数字: 2
# 3 はスキップします
# 数字: 4
# 数字: 5
ここでも、条件を満たしたタイミングで break で抜けるので、while True
で無限ループにしています。
正しい点数が入力されるまで繰り返す
while True:
score = int(input("テストの点数を入力してください (0 〜 100):"))
# 範囲外の値はスキップ
if score < 0 or score > 100:
print("0 から 100 の間で入力してください")
# continue で次回のループに移動
continue
# 正しい値が入力された
print(f"入力された点数:{score}")
break
4.5 リストと for 文でまとめて処理する
ここでは、次回の内容の予習をします。私たちの身の回りには、「データの並び」がたくさんあります。
- クラスの生徒の名前一覧
- テストの点数一覧
などです。このような「データの並び」をプログラムで扱うのが「リスト」で、for 文を使うと、リストの中身を順番に処理することができます。
リストと for 文の基本
点数の集計例
リストの中身のそれぞれについての for 文は、for item in items:
という書き方です。
この item
の部分は、items
の中身のそれぞれを指します。必ずしもこの名前を使う必要はありません。
for i in items:
や for x in items:
, for apple in items:
など、名前はなんでも大丈夫です。ただし、省略し過ぎた名前や関係ない名前などをつけると、プログラムが読みにくくなってしまうことがあるので気をつけましょう。
テストの点数の計算
# 5 教科の点数
scores = [85, 92, 78, 90, 88]
# 合計点を計算
total = 0
for score in scores:
total += score
# 平均点を計算
# len 関数は、 str 型の場合は文字数でしたが、 list 型の場合は要素数です
average = total / len(scores)
print(f"点数:{scores}")
print(f"合計:{total}")
print(f"平均:{average}")
# 合格した教科の数を数える (80 点以上)
pass_count = 0
for score in scores:
if score >= 80:
pass_count += 1
print(f"合格した教科:{pass_count}教科")
名前の検索
名前の検索
names = ["山田", "田中", "佐藤", "鈴木", "高橋"]
# 「田中」 さんを探す
for name in names:
if name == "田中":
print("田中さんが見つかりました!")
break
else:
print("田中さんは見つかりませんでした")
# 「山」 のつく名前を探す
print("\n「山」のつく名前:")
for name in names:
if "山" in name:
print(name)
for 文でリストを扱う基本的なやり方はこのような感じです。この次のレッスン 5 で、さらに詳しく見ていきましょう。
4.6 二重ループで表や表組みを作る
「ループの中にループを入れる」ことを「二重ループ」と呼びます。これを使うと、表やパターンなど、縦と横の二次元的なデータを扱うことができます。
二重ループの基本
二重ループの動作の仕組み
- 外側のループが 1 回実行されるごとに
- 内側のループが最初から最後まで実行される
- その後、外側のループの次の回に進む
二重ループの例
for i in range(3): # 外側: 3 回
for j in range(2): # 内側: 2 回
print(f"i={i}, j={j}")
# 実行結果
# i=0, j=0
# i=0, j=1
# i=1, j=0
# i=1, j=1
# i=2, j=0
# i=2, j=1
では、いくつかの例を見てみましょう。
1. 簡単な掛け算表
掛け算表
for i in range(1, 4): # 外側のループ(行)
for j in range(1, 4): # 内側のループ(列)
# end=" " を指定することで、改行する代わりにスペースを入れます
print(f"{i}×{j}={i*j}", end=" ")
# 行の終わりで改行
print()
# 実行結果
# 1×1=1 1×2=2 1×3=3
# 2×1=2 2×2=4 2×3=6
# 3×1=3 3×2=6 3×3=9
2. 星のピラミッド
星のピラミッド
for i in range(1, 6): # 行数を制御
for j in range(i): # 各行の ★ の数を制御
print("★", end="")
# 行の終わりで改行
print()
# 実行結果
# ★
# ★★
# ★★★
# ★★★★
# ★★★★★
3. 座席表の作成
トレイリングカンマ: リストなどの要素を複数行で書くとき、最後の要素の後ろにもカンマをつけることができます。これをつけておくと、後から要素を追加するときにカンマの付け忘れでエラーが起こることを防ぎやすくなります。
座席表の作成
# トレイリングカンマを付けています
seats = [
["山田", "田中", "佐藤"],
["鈴木", "高橋", "伊藤"],
["渡辺", "山本", "中村"],
]
print("=== 座席表 ===")
for i in range(len(seats)):
print(f"列{i + 1}:", end=" ")
for j in range(len(seats[i])):
print(f"{seats[i][j]}", end=" ")
# 改行
print()
# 実行結果
# === 座席表 ===
# 列1: 山田 田中 佐藤
# 列2: 鈴木 高橋 伊藤
# 列3: 渡辺 山本 中村
4. パターン描画
市松模様を描く
size = 5
# 偶数なら ■, 奇数なら □ を描く
for i in range(size):
for j in range(size):
if (i + j) % 2 == 0:
print("■", end="")
else:
print("□", end="")
# 改行
print()
# 実行結果
# ■□■□■
# □■□■□
# ■□■□■
# □■□■□
# ■□■□■
二重ループだけではなく、三重ループや四重ループなども作ることができます。
例えば、X 座標、Y 座標、Z 座標などの三次元の座標を扱うときは、三重ループを使うことも普通にあります。
ただ、あまり深いループを作ると、計算が重くなりやすかったり、インデントのネスト(入れ子)が深くなり過ぎたりして、プログラムが読みにくくなってしまうことがあるので注意しましょう。
Q: 二重ループでよく混乱するポイントは?
A: 以下の点に注意しましょう:
- 外側と内側のループ変数の役割を明確にする
- 改行のタイミングを意識する
- インデントを正しく付ける
- print のオプション
end=""
の使い方を理解する
4.7 無限ループに注意しよう
プログラミングをしていると、「プログラムが永遠に終わらない」状態に陥ることがあります。これを「無限ループ」と呼びます。特に while 文を使うときは注意が必要です。
無限ループとは
危険な例(無限ループ)
このプログラムは、count が常に 0 より大きく、増え続けるので、決して終了条件を満たさないため、無限ループに陥ります。
無限ループの例
count = 1
# count が 0 より大きい間はループが続く
while count > 0:
print(count)
# count が増え続けるので永遠に終わらない
count += 1
安全な例(proper な終了条件)
proper な終了条件は、ループの中でいつかは終了条件を満たすようになるものです。
安全な例(proper な終了条件)
count = 1
# count が 5 まで増えたら終了
while count <= 5:
print(count)
count += 1
print("ループが正常に終了しました")
無限ループが起きやすいパターン
1. 条件の間違い
条件の間違い: 間違った例
total = 0
while total < 100:
print(total)
# マイナスになり続けて終わらない
total -= 10
条件の間違い: 正しい例
total = 0
while total < 100:
print(total)
# 100 に近づく
total += 10
2. 条件の更新忘れ
条件の更新忘れ: 間違った例
answer = ""
while answer != "exit":
print("現在実行中...")
# answer の値を更新し忘れている
条件の更新忘れ: 正しい例
answer = ""
while answer != "exit":
print("現在実行中...")
answer = input("終了するには'exit'と入力:")
無限ループを防ぐチェックリスト: これらのことに気をつけましょう。
- while の条件が最終的に False になることを確認
- ループ内で条件の値が適切に変更されているか確認
- 緊急時の脱出手段(break など)を用意
- テスト時は小さな値で動作確認
適切な無限ループの使い方
意図的に無限ループを使う場合は、適切に終了条件を設けると良いです。
1. 終了条件を設ける
メニュー選択プログラム
while True:
print("\n=== メニュー ===")
print("1: 新規作成")
print("2: 編集")
print("3: 終了")
choice = input("選択してください:")
if choice == "1":
print("新規作成します")
elif choice == "2":
print("編集を開始します")
elif choice == "3":
print("プログラムを終了します")
break # ここで適切に終了
else:
print("正しい選択肢を入力してください")
2. 最大繰り返し回数を設定する
最大試行回数付きのパスワード入力
max_attempts = 3
attempts = 0
password = ""
while attempts < max_attempts:
password = input("パスワードを入力:")
attempts += 1
if password == "secret":
print("ログイン成功!")
break
remaining = max_attempts - attempts
print(f"パスワードが違います。残り{remaining}回")
if attempts >= max_attempts:
print("ログインに失敗しました")
3. タイムアウトを設定する
タイムアウトの設定
import time
start_time = time.time()
# 10 秒でタイムアウト
timeout = 10
while True:
current_time = time.time()
if current_time - start_time > timeout:
print("タイムアウトしました")
break
# 何らかの処理
print("処理中...")
# 1 秒待機
time.sleep(1)
もし無限ループに陥ったら: このように落ち着いて対処しましょう。
-
Google Colab の場合:
- 「ランタイム」メニューから「ランタイムを中断」を選択
- またはブラウザの画面を閉じる
-
ローカル環境で Python を実行している場合:
- Windows の場合:
Ctrl + C
を押す - Mac の場合:
Command + C
を押す - または実行中のプログラムを強制終了する
- Windows の場合:
Ex.1 1 から 100 までの合計を求めるプログラム
1 から 100 までの合計を求めるプログラム
# 方法 1: for ループを使う
total = 0
for i in range(1, 101):
total += i
print(f"1から100までの合計:{total}")
# 方法 2: while ループを使う
total = 0
num = 1
while num <= 100:
total += num
num += 1
print(f"1から100までの合計:{total}")
チャレンジ:
- 偶数だけの合計を求めてみよう
- 3 の倍数だけの合計を求めてみよう
- 入力された数までの合計を求めてみよう
Ex.2 1 から 10 までの数字で掛け算表を表示するプログラム
1 から 10 までの数字で掛け算表を表示するプログラム
# 見やすい九九表を作成
print(" ", end="")
for i in range(1, 11):
print(f"{i:4}", end="")
print("\n" + "-" * 50)
for i in range(1, 11):
print(f"{i:2} |", end="")
for j in range(1, 11):
print(f"{i*j:4}", end="")
print() # 改行
"""
出力例:
1 2 3 4 5 6 7 8 9 10
--------------------------------------------------
1 | 1 2 3 4 5 6 7 8 9 10
2 | 2 4 6 8 10 12 14 16 18 20
...
"""
チャレンジ:
- 表の範囲を変更できるようにしてみよう
- 縦と横に線を引いて見やすくしてみよう
- 3 の段だけ色を変えてみよう (print 文のオプションで)s
まとめ
この章で学んだこと:
- for 文で決まった回数の繰り返し
- while 文で条件付きの繰り返し
- break / continue での制御
- リストとの組み合わせ
- 二重ループの使い方
- 無限ループの注意点