別の繰り返し方法:while文の使い方#

はじめに#

前回の記事では、for文を使った繰り返し処理について学びました。for文は、リストや文字列などの要素を一つずつ処理したり、range関数を使って一定回数の処理を行ったりするのに便利です。

しかし、プログラミングでは「条件を満たす間だけ処理を繰り返したい」という場面がよくあります。例えば、「ユーザーが正しい値を入力するまで質問を繰り返す」「商品の残数がなくなるまで処理を続ける」といった場合です。このような条件付きの繰り返し処理には、「while文」が適しています。

この記事では、while文の基本的な使い方から応用例まで詳しく説明します。

while文の基本#

while文は「~の間、繰り返す」という意味で、指定した条件が真(True)である限り、処理を繰り返し実行します。基本的な形は次のとおりです。

while 条件式:
    繰り返し実行する処理

条件式が真(True)である間、インデントされた処理ブロックが繰り返し実行されます。条件式が偽(False)になると、ループを抜けて次の処理に進みます。

簡単な例で見てみましょう。

>
# 基本的なwhile文 - 特定の条件が満たされるまで繰り返す例
total = 0
count = 1

# 合計が50以下の間、数字を足し続ける
while total <= 50:
    total += count  # total = total + count と同じ
    print(f"数字 {count} を足しました。合計は {total} になりました。")
    count += 1      # count = count + 1 と同じ

print(f"合計が50を超えたのでループを終了します。最終的な合計: {total}")
数字 1 を足しました。合計は 1 になりました。
数字 2 を足しました。合計は 3 になりました。
数字 3 を足しました。合計は 6 になりました。
数字 4 を足しました。合計は 10 になりました。
数字 5 を足しました。合計は 15 になりました。
数字 6 を足しました。合計は 21 になりました。
数字 7 を足しました。合計は 28 になりました。
数字 8 を足しました。合計は 36 になりました。
数字 9 を足しました。合計は 45 になりました。
数字 10 を足しました。合計は 55 になりました。
合計が50を超えたのでループを終了します。最終的な合計: 55

この例では、合計が50を超えるまでループが続きます。数字を足し続け、合計が50を超えるとループが終了し、プログラムが終了します。

カウンタ変数を使ったwhile文#

while文でもfor文と同様に、カウンタ変数を使って一定回数の繰り返しを行うことができます。

>
# カウンタを使ったwhile文
i = 0

while i < 5:
    print(f"i の値は {i}")
    i += 1
i の値は 0
i の値は 1
i の値は 2
i の値は 3
i の値は 4

この例は、for文のfor i in range(5):を使った場合と同じ結果になります。

>
# for文と同じ結果
for i in range(5):
    print(f"i の値は {i}")
i の値は 0
i の値は 1
i の値は 2
i の値は 3
i の値は 4

このように、どちらの方法でも書けますがfor文の方がコードがシンプルになります。while文の場合は、カウンタ変数の初期化、条件のチェック、変数の更新をすべて自分で明示的に書く必要があります。

for文とwhile文の違い#

for文とwhile文の主な違いは以下の通りです。

  1. 繰り返し回数
    • for文:繰り返し回数が事前に決まっている場合に適している
    • while文:条件次第で繰り返し回数が変わる場合に適している
  2. 条件のチェックのタイミング
    • for文:イテラブル(リストなど)のすべての要素を処理するまで繰り返す
    • while文:各繰り返しの前に条件を評価し、真である限り繰り返す

簡単に言えば、「何回繰り返すか事前にわかっている」場合はfor文、「条件を満たす間は繰り返す」場合はwhile文が適しています。

条件による繰り返し#

while文の強みは、特定の条件が満たされる間だけ処理を繰り返すことです。例えば、ある数を2で割り続け、奇数になるまでの過程を表示するプログラムを考えてみましょう。

>
# ある数を2で割り続け、奇数になるまでの過程
number = 100

print(f"開始値: {number}")
while number % 2 == 0:  # numberが偶数である間
    number = number // 2
    print(f"2で割った結果: {number}")

print(f"最終結果: {number}(奇数)")
開始値: 100
2で割った結果: 50
2で割った結果: 25
最終結果: 25(奇数)

この例では、numberが偶数である間(2で割った余りが0の間)、numberを2で割り続けています。最終的にnumberが奇数になると、条件式が偽になってループが終了します。

ユーザー入力による繰り返し#

while文は、ユーザーからの入力に基づいて処理を繰り返すのに適しています。例えば、ユーザーが正しい値を入力するまで入力を求め続けるプログラムを考えてみましょう。

>
# ユーザーからの入力を検証する例
is_valid = False

# ユーザーが正しい値を入力するまでループ
while not is_valid:
    try:
        age = int(input("あなたの年齢を入力してください: "))

        if age <= 0:
            print("年齢は正の整数で入力してください")
        else:
            is_valid = True  # 年齢が正の整数なら、is_validをTrueにしてループを終了

    except ValueError:
        print("数値を入力してください")

print(f"入力された年齢: {age}")

実行例:

あなたの年齢を入力してください: abc
数値を入力してください
あなたの年齢を入力してください: -5
年齢は正の整数で入力してください
あなたの年齢を入力してください: 25
入力された年齢: 25

この例では、ユーザーが正しい年齢(正の整数)を入力するまで、入力を促し続けます。数値以外が入力された場合や、負の数が入力された場合はエラーメッセージを表示し、再入力を求めます。

注意点:無限ループの回避#

while文を使う際の最大の注意点は、意図しない無限ループを作らないことです。無限ループになる主な原因は次の2つです。

  1. 条件が常に真になる: 条件式が常にTrueになってしまうと、ループは永遠に続きます。
  2. 条件を変更する処理が欠けている: while文の中で、条件に使っている変数を適切に更新していないと、条件が変わらず無限ループになります。

例えば、次のコードは無限ループになってしまいます。

>
# 無限ループになるコード例(実行しないでください)
# count = 1
# while count <= 5:
#     print(f"カウント: {count}")
#     # count += 1  # この行をコメントアウトすると無限ループになる

このコードでは、count += 1の行がコメントアウトされているため、countの値が常に1のままで、条件count <= 5は常に真になります。これにより、ループが永遠に続くことになります。

もし誤って無限ループを実行してしまった場合は、Google Colabでは「ランタイム」→「ランタイムを中断」を選択して実行を停止できます。

まとめ#

この記事では、Pythonのwhile文について学びました。

  • while文は、条件が真である間、処理を繰り返し実行する
  • for文とwhile文の主な違いは、繰り返し回数が事前に決まっているか、条件によって決まるかという点
  • while文を使って、ユーザー入力に基づいた処理や、データを検証する処理を実装できる
  • 無限ループを避けるために、条件が最終的に偽になるようにする必要がある

while文は、条件によって処理を繰り返したい場合に非常に便利です。特に、繰り返し回数が事前にわからない場合(ユーザー入力、ファイル処理など)に活用できます。ただし、無限ループには注意し、確実にループを終了する条件を設けるようにしましょう。