繰り返し¶
1. 繰り返しの基本構文¶
while文¶
プログラムで 同じ処理を何度も実行 する場面はよくあります。例えば、「Hello, World! を5回表示する」処理を考えてみましょう。
print("Hello, World!")
print("Hello, World!")
print("Hello, World!")
print("Hello, World!")
print("Hello, World!")
このコードでは、同じ処理を何度も手で書いている ため、可読性やメンテナンス性が低くなります。
もし 100回 繰り返したい場合、print()
を100行コピーしないといけません。
print("Hello, World!")
print("Hello, World!")
print("Hello, World!")
# ...
# (省略) 100回続く
# ...
print("Hello, World!")
これは 保守が大変 です。 例えば、「Hello, Python! に変更しよう」と思ったら、100行すべて書き換える必要があります!繰り返し処理を使えば、たった数行で100回の処理を実装できます!
プログラム:
count = 0
while count < 100:
print("Hello, World!")
count += 1
出力:
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
~~ (省略)100回続く ~~
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
無限ループ¶
while
文を使うと、繰り返し処理を簡潔に書けますが、カウンタ変数の制御を忘れると「無限ループ」になってしまう ことがあります。無限ループとは、プログラムが永遠に繰り返し処理を続けてしまう 状態のことです。たとえば、次のコードを実行すると、止まらなくなる ので注意が必要です。
プログラム:
count = 0
while count < 5:
print("Hello, World!")
# count += 1 がない! (カウンタの更新を忘れている)
出力:
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
~~ (省略)パソコンが動く限り続く ~~
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
IOPub data rate exceeded.
The notebook server will temporarily stop sending output
to the client in order to avoid crashing it.
To change this limit, set the config variable
`--NotebookApp.iopub_data_rate_limit`.
Current values:
NotebookApp.iopub_data_rate_limit=1000000.0 (bytes/sec)
NotebookApp.rate_limit_window=3.0 (secs)
上記のコードは、
- ✅ count += 1 がないため、count の値は ずっと 0 のまま です。
- ✅ そのため、while count < 5 の条件が ずっと True のまま になり、プログラムが止まらない!
間違えて無限ループを実行してしまった場合、 プログラムを強制終了する 必要があります。
- 🔹 ターミナルやコマンドプロンプトで実行している場合
- Ctrl + C を押すと、Pythonの実行を強制停止できます。
- 🔹 Jupyter Notebook を使っている場合
- 「■(停止ボタン)」 を押すと実行が止まります。
無限ループはバグの原因 になることが多いですが、 逆に、特定の状況では意図的に使うこともあります。
while True: # 条件を「常にTrue」にすることで無限ループを作る
user_input = input("何か入力してください(qで終了):")
if user_input == "q": # "q" を入力するとループ終了
print("終了します")
break # ループを抜ける
- ✅ while True で 無限ループを作成
- ✅ break を使い、特定の条件でループを抜ける
状態による繰り返し¶
これまでの while
文では、カウンタ変数を使って一定回数の繰り返しを行いましたが、
実際のプログラムでは 「特定の条件が満たされるまで繰り返す」 という処理がよく使われます。
このような「状態」による繰り返しを実装するには、ブール値(True
/ False
)の変数を条件式に利用 します。
1. 状態を表す変数を使った繰り返し
次のコードは、「ユーザーが "exit" を入力するまで繰り返す」例です。
プログラム:
running = True
while running:
user_input = input("コマンドを入力してください(exit で終了):")
if user_input == "exit":
running = False
else:
print(f"あなたの入力: {user_input}")
print("プログラムを終了しました。")
出力:
コマンドを入力してください(exit で終了):go
あなたの入力: go
コマンドを入力してください(exit で終了):think
あなたの入力: think
コマンドを入力してください(exit で終了):feel
あなたの入力: feel
コマンドを入力してください(exit で終了):exit
プログラムを終了しました。
- ✅ running という変数が
True
の間、ループが続く - ✅ exit を入力すると
running = False
になり、ループが終了
2. 数値を使った条件による繰り返し
特定の条件を満たすまで繰り返す例として、ユーザーが10以上の数値を入力するまで繰り返す プログラムを作成できます。
プログラム:
valid = False
while not valid:
number = int(input("10以上の数値を入力してください: "))
if number >= 10:
valid = True
print(f"正しい入力: {number}")
else:
print("10以上の数値を入力してください!")
出力:
10以上の数値を入力してください: 1
10以上の数値を入力してください!
10以上の数値を入力してください: 199
正しい入力: 199
- ✅
valid = False
の間は繰り返す - ✅ 10以上の数値が入力されると
valid = True
に変わり、ループが終了
繰り返しによるリストの作成¶
プログラムでは 「データをリストに蓄積する」 という処理がよくあります。 例えば、学校のテストの点数を記録し、あとで集計するといったケースが考えられます。
while
文を使って、ユーザーから 複数のテストの点数を入力 し、それをリストに保存する方法を学びましょう。
1. テストの点数をリストに追加する
次のプログラムでは、while
文を使って 複数のテストの点数をリストに格納 し、最後に合計点と平均点を計算します。
プログラム
scores = []
count = 0
while count < 5:
score = int(input(f"{count + 1}つ目のテストの点数を入力してください: "))
if 0 <= score <= 100:
scores.append(score)
count += 1
else:
print("点数は0〜100の範囲で入力してください!")
print(f"入力された点数: {scores}")
print(f"合計点: {sum(scores)}")
print(f"平均点: {sum(scores) / len(scores)}")
出力:
1つ目のテストの点数を入力してください: 78
2つ目のテストの点数を入力してください: 90
3つ目のテストの点数を入力してください: 59
4つ目のテストの点数を入力してください: 87
5つ目のテストの点数を入力してください: 70
入力された点数: [78, 90, 59, 87, 70]
合計点: 384
平均点: 76.8
- ✅ 点数をリスト (
scores
) に保存する - ✅ 5回の入力が終わったら、合計点と平均点を計算
- ✅ 0〜100の範囲外の点数は受け付けないようにチェック
2. 入力を続けるか選べるようにする
次に、「何人分の点数を入力するかわからない場合」に対応する方法を紹介します。
while True
を使って、ユーザーが終了を選ぶまで繰り返し入力 できるようにします。
プログラム:
scores = []
while True:
score = input("テストの点数を入力してください(終了するには 'exit' と入力): ")
if score.lower() == "exit":
break
score = int(score)
if 0 <= score <= 100:
scores.append(score)
else:
print("点数は0〜100の範囲で入力してください!")
if scores:
print(f"入力された点数: {scores}")
print(f"合計点: {sum(scores)}")
print(f"平均点: {sum(scores) / len(scores)}")
else:
print("点数が入力されませんでした。")
出力:
テストの点数を入力してください(終了するには 'exit' と入力): 80
テストの点数を入力してください(終了するには 'exit' と入力): 90
テストの点数を入力してください(終了するには 'exit' と入力): exit
入力された点数: [80, 90]
合計点: 170
平均点: 85.0
- ✅
while True
を使って、何度でも点数を入力できるようにする - ✅
break
を使って、exit が入力されたらループを抜ける - ✅ 点数が1つも入力されなかった場合の対策もする
繰り返しによるリストの要素の利用¶
リストに保存されたデータは、繰り返し処理を使うことで 1つずつ取り出して利用 できます。 例えば、テストの点数を使って 合格・不合格を判定 するプログラムを作成してみましょう。
while
を使ってリストの要素を順番に処理
リストの各要素に while
ループを使ってアクセス する方法です。
プログラム:
scores = [85, 42, 90, 78, 30]
index = 0
while index < len(scores):
score = scores[index]
if score >= 50:
print(f"{score} 点: 合格")
else:
print(f"{score} 点: 不合格")
index += 1
出力:
85 点: 合格
42 点: 不合格
90 点: 合格
78 点: 合格
30 点: 不合格
2. for文¶
for文による繰り返し¶
1. while文の問題点とfor文のメリット
前回、while
を使ってリストの要素を順番に処理しましたが、
while
には以下のような問題点があります。
🔴 無限ループのリスク: → インデックスの更新を忘れると、無限ループになってしまう
🔴 IndexErrorの可能性: → インデックスがリストの長さを超えるとエラーになる
一方、for文 を使うと、これらの問題を簡単に回避 できます。
2. for を使った安全な繰り返し
for
文は リストの要素を自動的に順番に取り出す ため、
- ✅ 無限ループにならない
- ✅ インデックスの管理が不要で、
IndexError
を防げる
次の例では、while
の代わりに for
を使って、テストの点数を処理します。
プログラム:
scores = [85, 42, 90, 78, 30]
for score in scores:
if score >= 50:
print(f"{score} 点: 合格")
else:
print(f"{score} 点: 不合格")
出力:
85 点: 合格
42 点: 不合格
90 点: 合格
78 点: 合格
30 点: 不合格
3. for 文のポイント
- ✅ リストの要素を1つずつ自動的に取り出す
- ✅
while
のようにインデックスを管理する必要がない - ✅ リストの要素がなくなったら自動で終了
for文の基本構造¶
for文で繰り返す回数は、リストの要素数で決まります。そして、繰り返しのたびにリストの要素を先頭から順に取得し、変数に代入します。
in
はリストだけではなく、タプルやディクショナリ、セットなどのほかのコンテナでも利用可能です。リストは格納する要素に順序を持ちますが、セットなどの順序の情報を持たないコンテナの場合、代入される要素に順序は保証されません。
for文による決まった回数の繰り返し¶
for
文を使って決まった回数だけ繰り返す場合、range()
関数を使います。
range()
は、指定した範囲の数字を順番に生成し、その数字を for
文で繰り返し処理することができます。
🔹 range()の基本構造
range(開始, 終了, ステップ)
- 開始:繰り返しを始める数字(省略すると0)
- 終了:繰り返しを終了する数字(この数字は含まれません)
- ステップ:数字を増やす間隔(省略すると1)
🔹 具体例:0から4までの5回繰り返し
プログラム:
for i in range(5):
print(i)
出力:
0
1
2
3
4
- ✅
range(5)
は 0 から 4 までの数字を生成 - ✅ 繰り返しの回数は5回
🔹 具体例:2から6までの繰り返し
プログラム:
for i in range(2, 7):
print(i)
出力:
2
3
4
5
6
- ✅
range(2, 7)
は 2 から 6 までの数字を生成 - ✅ 終了値(7)は含まれないことに注意
🔹 具体例:2ずつ増加する場合
プログラム:
for i in range(0, 10, 2):
print(i)
出力:
0
2
4
6
8
- ✅
range(0, 10, 2)
は 0 から 10 の間を2ずつ増加 - ✅ ステップを使うことで、繰り返し間隔を調整できる
while文とfor文の使い分け¶
while
文と for
文は、どちらも繰り返し処理に使いますが、その使い方には違いがあります。それぞれの特徴を理解することで、適切な場面で使い分けることができます。
🔹 while文
while
文は、繰り返す条件が成り立っている限り繰り返しを続ける制御構文です。
繰り返しの回数が事前に決まっていない場合に便利です。繰り返しの条件式を明示的に記述する必要があります。
特徴:
- 条件が満たされる限り繰り返す(条件が真である間)
- 繰り返し回数が事前に分からない場合に適している
- 条件を正しく管理しないと無限ループになる可能性がある
例:
counter = 0
while counter < 5:
print(counter)
counter += 1
この場合、counter
が5未満の間は繰り返し、条件が満たされなくなった時点で終了します。
🔹 for文
for
文は、指定された回数だけ繰り返す場合に使います。特に、リストや範囲を反復したい場合に便利です。事前に繰り返し回数や範囲が分かっている場合に最適です。
特徴:
- 回数や範囲が事前に分かっている場合に使う
- 繰り返しの回数が決まっている、または反復対象が決まっている場合に適している
- 無限ループや条件ミスのリスクが少ない
例:
for i in range(5):
print(i)
range(5)
は 0 から 4 までの数を生成するので、5回の繰り返しが確実に行われます。
🔹 使い分けのポイント
特徴 | while文 | for文 |
---|---|---|
繰り返し回数 | 事前に決まっていない | 事前に決まっている、または範囲が決まっている |
繰り返し条件 | 条件式を指定(繰り返す条件が必要) | 反復する対象(リストや範囲)を指定 |
無限ループのリスク | 条件の設定を間違えると無限ループになる可能性 | 無限ループになることはない |
使用例 | 条件が変化するまで繰り返す | 決まった回数、またはリストや範囲を反復 |
3. 繰り返しの制御¶
繰り返しの強制終了¶
break
文は、繰り返し処理を途中で強制的に終了させるためのものです。while
や for
ループを途中で終了させたい場合に使用します。例えば、特定の条件が満たされたときにループを止めたいときに便利です。
次のコード例では、テストの点数リストから最初に合格(60点以上)した学生を見つけた時点で、繰り返しを終了します。
プログラム:
scores = [55, 40, 65, 72, 50, 38, 91]
for score in scores:
if score >= 60:
print(f"合格: {score}点")
break
else:
print(f"不合格: {score}点")
出力:
不合格: 55点
不合格: 40点
合格: 65点
このコードでは、点数が60点以上の学生が現れた時にbreak
を使って、ループを強制的に終了します。つまり、最初の合格者が見つかると、それ以降の点数のチェックは行われず、繰り返しが終了します。
繰り返しのスキップ¶
continue
文は、繰り返しの現在のループをスキップして、次のループに進むために使用します。条件を満たした場合に、処理を飛ばして次の繰り返しに移行することができます。
以下のコードでは、点数が60点未満の学生をスキップして、次の学生の点数をチェックします。
プログラム:
scores = [55, 40, 65, 72, 50, 38, 91]
for score in scores:
if score < 60:
# print(f"不合格: {score}点(スキップ)")
continue
print(f"合格: {score}点")
出力:
合格: 65点
合格: 72点
合格: 91点
このコードでは、continue
を使って、60点未満の学生(不合格の学生)に対しては処理をスキップし、60点以上の学生だけに「合格」を表示します。
break
文とcontinue
文¶
break
は、繰り返し処理を途中で完全に終了させます。
continue
は、現在の繰り返しをスキップして、次の繰り返しに進むことができます。
これらの制御文を適切に使い分けることで、より柔軟で効率的な繰り返し処理を実装できます。
この章のまとめ¶
この章では、Pythonにおける繰り返し処理(ループ)について学びました。以下のポイントを押さえておきましょう。
1. 繰り返しの基本構造
while
文を使うことで、条件が満たされている限り繰り返し処理を実行できます。無限ループや状態に基づく繰り返し、リスト作成などにも活用できます。for
文では、イテラブル(リスト、タプルなど)の要素を一つずつ取り出して処理します。range()
関数を使うことで、決まった回数の繰り返しも簡単に実現できます。
2. for文とwhile文の使い分け
while
文は繰り返しを行う条件が変わるまで処理を繰り返す場合に便利で、動的な条件に基づく繰り返しに適しています。for
文はあらかじめ繰り返し回数やイテラブル(リストなど)が決まっている場合に適しており、要素を順番に処理する際に使用します。
3. 繰り返しの制御
break
文は繰り返し処理を途中で終了させるために使用し、特定の条件が満たされたときにループを停止します。continue
文は現在の繰り返しをスキップし、次の繰り返しに進むことができます。
繰り返し処理を理解することで、より効率的にデータの処理や反復作業を自動化することが可能になります。
練習問題¶
問題1: while文を使ったカウントダウン
1から10までの数字をカウントダウンするプログラムをwhile
文を使って作成してください。
問題2: 無限ループとbreak
while
文を使って、ユーザーから「終了」と入力されるまで繰り返し入力を受け付けるプログラムを作成してください。もしユーザーが「終了」と入力した場合、break
文を使ってループを終了させてください。
問題3: for
文によるリストの合計
以下のリストに含まれる全ての数字の合計をfor
文を使って計算するプログラムを作成してください。
numbers = [3, 5, 7, 10, 15]
問題4: range()
を使った繰り返し
range()
を使って、1から20までの数字の中で偶数だけを出力するプログラムを作成してください。
問題5: 繰り返しによるリストの作成とスキップ
1から10までの数字をリストに格納するプログラムを作成してください。ただし、3と6はリストに追加せず、continue
文を使ってスキップしてください。