4. 繰り返し処理で効率アップ

目次

この講座で使用する 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 ループをイメージで表すと、このようなイメージです。ボタンを押して試してみてください!

ループ 【0 / 3
1
# 繰り返しの番号を使う
2
for i in range(3):
3
    print(f"{i + 1}回目: Hello")
コンソール出力
0
1
2

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}")

4.2 range 関数で連続した数字を扱う

前回学んだ for 文では、range 関数を使って繰り返す回数を指定しました。この range 関数には、より細かい指定ができる機能があります。

range 関数の基本形

range 関数には 3 つの使い方があります。

  1. range(stop): 0 から始めて止まる数の手前まで
  2. range(start, stop): 開始する数から止まる数の手前まで
  3. 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

逆順に使う

逆順に使う

# 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
# 時間切れ!

このプログラムの動作は、このような流れです。

  1. count が 0 より大きい間繰り返す
  2. count を表示して1減らす
  3. 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 文を書くときは、無限ループにならないように注意しましょう。もし無限ループになってしまった場合は、落ち着いて Google Colab を開いているブラウザのタブを閉じて強制終了させましょう。

無限ループの例

# 無限ループの例 (実行しないでください!)
count = 1
while count > 0:
    print(count)  # count が減らないので永遠に続く

# 正しい例
count = 1
while count > 0:
    print(count)
    # count を減らして必ず終わるようにする
    count -= 1

4.4 break, continue で繰り返しをコントロール

繰り返し処理をしていると、「ここで終了したい」「この回はスキップしたい」といったタイミングがあります。そんなときに使うのが breakcontinue です。

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: という書き方です。

テストの点数の計算

# 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 二重ループで表や表組みを作る

「ループの中にループを入れる」ことを「二重ループ」と呼びます。これを使うと、表やパターンなど、縦と横の二次元的なデータを扱うことができます。

二重ループの基本

二重ループの例

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 座標などの三次元の座標を扱うときは、三重ループを使うことも普通にあります。

ただ、あまり深いループを作ると、計算が重くなりやすかったり、インデントのネスト(入れ子)が深くなり過ぎたりして、プログラムが読みにくくなってしまうことがあるので注意しましょう。

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'と入力:")

適切な無限ループの使い方

意図的に無限ループを使う場合は、適切に終了条件を設けると良いです。

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)

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 での制御
  • リストとの組み合わせ
  • 二重ループの使い方
  • 無限ループの注意点