生成AIと学ぶPython9: Pythonのループ文(while文)

for文の次は、Pythonのwhile文について説明します。

while文の基本的な構文

指定した条件が真(True)である間、繰り返し処理(ループ)を行う制御フロー文です。一般的には、以下のように利用します。

while condition:
    # code to be executed

ここで、conditionはループが続行するかどうかを決定するブール(真偽)値の条件式で、ループの各反復の開始時に評価されます。conditionが真(True)である限り、whileループの内部のコードブロックが繰り返し実行されます。conditionが偽(False)になると、ループは終了し、whileループの後のコードの実行が再開されます。

例えば、以下のコードは、1から5までの数字を印刷するシンプルなwhileループです。

i = 1
while i <= 5:
    print(i)
    i += 1

このコードでは、iが5以下である限り、iの値をprintし、iに1を加えています。iの値が5を超えると、i <= 5という条件が偽(False)になり、ループが終了します。

whileループは、繰り返しの数が予めわからない場合や、特定の状態が継続する間繰り返し処理を行いたい場合に特に有用です。しかし、無限ループを生成しないよう、ループの終了条件を適切に設定することが重要です。

while文の使用例

whileループは、特定の条件が真である間、処理を繰り返し行うために使用されます。以下にいくつかの使用例を示します。

カウンターとともに使用する

count = 0
while count < 5:
    print(count)
    count += 1  # count1ずつ増やす

この例では、countが5未満である間、countの値を表示し、その後countの値を1増やします。したがって、このコードは0から4までの整数を表示します。

ユーザー入力を待つ

user_input = ""
while user_input != "quit":
    user_input = input("Enter a command (type 'quit' to quit): ")
    print(f"You entered: {user_input}")

この例では、ユーザーが"quit"と入力するまで、ユーザーからの入力を受け付けて表示し続けます。

リストの要素を消費する

tasks = ['task1', 'task2', 'task3', 'task4']
while tasks:
    current_task = tasks.pop()
    print(f"Performing {current_task}")

この例では、tasksリストから項目がなくなるまで、tasksリストの最後の要素を取り出して表示します。

条件が満たされるまで待つ

import time

# 仮のデータ取得関数
def get_data():
    import random
    return random.randint(1, 10)

data = get_data()
while data < 8:
    print("Data is too small, waiting to fetch new data...")
    time.sleep(1)  # 1秒待つ
    data = get_data()

print(f"Got suitable data: {data}")

この例では、データが8以上になるまで、新しいデータを取得し続けます。データが8以上になったとき、ループが終了し、データが表示されます。

これらの例は、whileループがどのように動作し、どのように使えるかを示しています。ただし、無限ループを作らないように注意することが重要です。

breakとcontinueを用いたwhileのループ制御

breakcontinueという2つのステートメントを使用してループの制御を行うことができます。

breakステートメント: breakは、ループから直ちに脱出するために使用します。breakが実行されると、制御はループの直後の最初のステートメントに移ります。以下はその使用例です。

count = 0
while True:  # これは無限ループです
    print(count)
    count += 1
    if count >= 5:
        break  # count5以上になったとき、ループから抜け出します

continueステートメント: continueは、現在のイテレーションをスキップし、ループの次のイテレーションに直ちに移行するために使用します。以下はその使用例です。

count = 0
while count < 10:
    count += 1
    if count % 2 == 0:  # countが偶数の場合
        continue  # 残りのループをスキップして次のイテレーションに進みます
    print(count)

このコードは、countが10未満である間、countを1ずつ増やします。countが偶数の場合、continueステートメントが実行され、print(count)がスキップされ、次のイテレーションに直ちに進みます。したがって、このコードは1から10までの奇数を表示します。

breakcontinueは、ループの制御を細かく行うための有用なツールです。ただし、これらのステートメントは適切に使用しなければ、コードの流れを理解しづらくする可能性があります。これらを使用する際には注意が必要です。

else節とwhile文

whileループでは、オプショナルなelse節を使用することができます。else節はwhileループが正常に(つまり、breakステートメントによる強制終了なしに)終了したときに実行されます。以下にその使用例を示します。


count = 0
while count < 5:
    print(count)
    count += 1
else:
    print("Loop finished normally")

このコードは、countが5未満である間、countの値を表示し、その後countの値を1増やします。ループが正常に終了したとき(つまり、countが5になったとき)、"Loop finished normally"と表示します。

しかし、breakステートメントがループを強制終了した場合、else節は実行されません。以下にその使用例を示します。

count = 0
while count < 5:
    if count == 3:
        break
    print(count)
    count += 1
else:
    print("Loop finished normally")

このコードでは、countが3になったときにbreakステートメントが実行され、ループが強制終了します。その結果、"Loop finished normally"というメッセージは表示されません。

このelse節の特性は、特にループ内で何らかの条件を探していて、その条件が見つからなかったときに何かを実行したい場合などに有用です。ただし、その用途は限定的であり、またelse節の挙動が直感的でないため、この機能を理解していない他の開発者にとってはコードを理解しづらくする可能性があります。そのため、使用する際には注意が必要です。

while文における無限ループとその回避方法

whileループでは、条件が常に真(True)であるとループが終わらない、いわゆる無限ループが発生する可能性があります。無限ループはプログラムを無効にする可能性があるため、注意が必要です。

無限ループの一例は次のようなものです

while True:
    print("This is an infinite loop!")

上記のコードは条件が常に真(True)であるため、"This is an infinite loop!"というメッセージが無限に表示されます。

無限ループを避けるための一般的な戦略は次のとおりです

  1. ループ条件を正確に設定する:ループの終了条件が適切に設定されていることを確認してください。例えば、while count < 5:というループでは、countが5以上になった時点でループが終了するようにする必要があります。

  2. ループ変数を更新する:ループの終了条件に関連する変数(上記の例ではcount)がループ内で適切に更新されていることを確認してください。count += 1とすることで、countが各イテレーションで1ずつ増加し、最終的にはループが終了します。

  3. breakステートメントを使用するbreakステートメントを使用して、特定の条件が満たされたときにループから強制的に脱出することができます。ただし、この機能は注意して使用する必要があります。適切に使用しないと、コードの流れを理解しづらくする可能性があります。

以上のような注意点を守って、適切な条件設定と変数の更新を行うことで、無限ループを避けることができます。

while文とfor文の比較

Pythonのwhileループとforループは、両者ともに反復的な操作を行うための構造を提供しますが、それぞれが最適となる使用状況は異なります。

forループ

forループは、「ある範囲にわたって」、「あるコレクションの全ての要素に対して」あるいは「ある反復可能オブジェクトの全ての要素に対して」処理を行いたい場合に通常使用されます。

# リストの全要素に対する操作
for element in [1, 2, 3, 4, 5]:
    print(element)

# 範囲にわたる操作
for i in range(5):
    print(i)

whileループ

一方、whileループは、「ある条件が真である限り」続けたい処理を行うために使用されます。これは、反復回数が事前に定かでない場合や、特定の状態や結果が達成されるまで処理を続けたい場合などに有用です。

# 条件が真である限り続ける操作
count = 0
while count < 5:
    print(count)
    count += 1

forループとwhileループの違い

  • forループは、反復回数が事前に決まっている(または反復可能な要素が存在する)場合に適しています。これに対して、whileループは、終了条件が満たされるまでループを続けるべき状況で有効です。

  • forループは、コレクションや反復可能オブジェクトの各要素を操作するために便利です。whileループは、特定の条件(たとえば、ある変数が特定の値以下であること)が真である間、処理を続ける必要がある場合に使用します。

どちらのループ構造を使用するかは、目的と要件によります。場合によっては、forループとwhileループを組み合わせて使用することもあります。

この記事が気に入ったらサポートをしてみませんか?