Python: forとwhileの使い方(繰り返し・ループ処理)

アイキャッチ画像 Python

プログラムの中には何回も繰り返される処理が含まれていることがよくあります。
その都度、同じコードを何度も書くよりも、繰り返し処理を行うと効率よくコードを書くことができます。繰り返し処理を行う方法はいくつかありますが、その時々によって繰り返し処理の方法を使い分けます。基本的にはforループとwhileループの二通りがあげられます。

forループ

もし繰り返し処理を行いたい回数が事前に分かっているのであれば、forループが使えます。繰り返されるコードのことをループのボディと呼び、繰り返される処理のことをイテレーション(反復)と呼びます。

ボディはfor文の中では4マス分インデントされます。以下のコードを実行してみてください。

for counter in range(1,4):
    print(counter)
    print("go!")

この繰り返し処理の例では1から3のカウントとそれぞれの後に”go!”の文字がプリントされています。ループ変数が繰り返しの回数を記録します。ここでのループ変数はcounterという変数です。range(1,4)の部分は1,2,3という値が入ったリストのようなものです。その値を順番にループ変数であるcounterに代入しています。

ここでのボディはprint(counter)とprint(“go!”)の部分です。

リストを使ったforループ

リストに含まれた値に同じ処理を繰り返すためにfor文を使う場合は、上の例で使用したrange()関数を使用する必要はありません。

Pythonでは単純にループ変数にリストの値を順番に代入することでループ処理を行わせることもできます。

red_team = ["Taro", "Takashi", "Mayumi", "Hiroko"]
print("The Red Team members are:")
for player in red_team:
    print(player)

上記のコードを実行してみてください。

この例ではred_teamというリストに含まれた名前を順番にfor文を使って出力しています。ループ変数とrange()関数を使った場合とほとんど同じですね。

whileループ

Pythonにおけるもう一つの繰り返し処理を行う方法はwhileを使ったループ処理です。

これはプログラマーが繰り返し処理が何回行われるかわからないせいで、for文を使えない時などに使用されます。さっそく使い方を見ていきましょう。次のコードを実行してみてください。

answer = input("Should I keep going? (y/n)")
while answer == "y":
    answer = input("Should I keep going? (y/n)")

yかnを入力するように促す文言を出力したあとに、ユーザーからの入力を待ちます。
ユーザーがyを入力している限りは同じ文言を出力し続けます。y以外を入力すると処理が終了します。

※最後にnを入力して終了していますが、今回の場合はy以外(nじゃなくても構わない)を入力すると終了します。普通のプログラムではyかn以外を入力した場合には別の文言を表示するか、そもそもyかnしか入力できないように強制したりします。このことを例外処理と呼びます。これについては今回は省略しています。

ループコンディション

whileループにはループコンディションと呼ばれるブール式があり、それがTrueのときのみwhile文のボディが実行されます。ループコンディションがFalseになったとき、whileループは終了します。

無限ループ

whileループにはプログラムが実行されている間、ずっと行うように設定されている場合もあります。これを無限ループとよび、ゲーム用のプログラムなどで多く使われています。無限ループをつくるためには、ループコンディションにTrueを与えます。

while True:
    print("There's no stopping me now!")

これを実行すると、実行されている間ずっとThere’s no stopping me now!が出力され続けます。(※以下の緊急エスケープを確認してから実行してください)

最悪の場合、無限ループによってコンピューターが反応しなくなる場合もあります。

緊急エスケープ

時には意図せず、無限ループを生み出してしまうこともあります。どんなに繰り返してもループコンディションがFalseにならない場合に起こります。

Pythonのシェルウィンドウ上では無限ループはControl + Cを押すことによって止めることができます。

number = 1
while number < 10:
    print(number)

上記コードはnumber変数がずっと1のままなので、number < 10のループコンディションがずっとTrueであるため、無限ループを起こします。以下のようにするとnumberの値が繰り返す度にかわるので、9回目でループが終了します。

number = 1
while number < 10:
    print(number)
    number += 1

入れ子構造のループ(多重ループ)

ループのボディにはさらに別のループを含ませることもできます。この入れ子になっているループのことを、多重ループ・入れ子ループ・ネストループなどと呼びます。

Pythonではどの種類のループでも他のループの中に入れることができます。たとえばwhileループの中に別のwhileループやforループを入れることもできますし、逆も然りです。以下の例では外側のループが一回繰り返されるたびに、内側のループが10回実行されます。

answer = input("Launch another spacerocket? (y/n)")
while answer == "y":
    for count in range(10, 0, -1):
        print(count)
    print("LIFT OFF!")
    answer = input("Launch another spacerocket? (y/n)")

range(10, 0, -1)は10~1までの数値を含むリストで、10から1ずつカウントダウンしていくことを意味しています。

最後のanswer = input(“Launch another spacerocket? (y/n)”)がないと、無限ループに陥ってしまうので、一回内側のループが終わるたびに、answerの値を更新して、yである間はずっと繰り返し、y以外で終了させるようにしています。

リストのリスト

多重ループはリストの値としてリストが含まれている際の処理を行うときなどによく利用されます。以下のコードを実行してみてください。

teams = [["Red Team", "Takesi", "Mayumi", "Yuki"],
         ["Blue Team", "Nobuo", "Miki", "Shigeru"],
         ["Green team", "Kosuke", "Rio", "Akira"]]

for team in teams:
    for name in team:
        print(name)
    print("\n")

上の例は3つのチームメンバーの名前をそれぞれ出力しています。コードが実行されているとき、外側のループのループ変数であるteamはteamsに含まれる最初のリストである[“Red Team”, “Takeshi”, “Mayumi”, “Yuki”]を取り出しています。

その後、内側のループのループ変数nameには順番にteamの中身が代入されていきます。内側のループが終わるたびに、print(“\n”)で空白行を一行いれています。

エスケープコマンド(break・continue)

コーディング中にはループを早急に抜け出したかったり、現在のボディのイテレーション(反復)を放棄して、次の行に移りたい場合などもあります。このようなときに利用できる二つのコマンドがあります。breakcontinueです。

break

breakコマンドは完全にループを放棄させ、ループ後のコードを実行するようにさせます。以下のコードを実行してみてください。

sensor_readings = [3, 5, 4, -1, 6, 7]
total = 0

for sensor_reading in sensor_readings:
    if sensor_reading < 0:
        print("負の値が見つかりました")
        break
    print("sensor_readingの値は" + str(sensor_reading) + "です")
    total = total + sensor_reading
print("ここまでの合計: " +str(total))

この例ではループ変数sensor_readingの値がマイナスになったときにbreakを利用して、ループを抜け出すようにしています。

その後の6と7に関してはループを既に抜け出しているので、実行されていませんね。

continue

continueコマンドは現在の反復のみを抜け出すコマンドです。その回の反復をスキップさせたあと、次の反復に移ります。次のコードを実行してみてください。

readings = [3, 5, 4, -1, 6, 7]
total = 0

for reading in readings:
    if reading < 0:
        print("負の値が見つかりました")
        continue
    print("readingの値は" + str(reading) + "です")
    total = total + reading
print("ここまでの合計: " +str(total))

breakの場合と違い、負の値が検出されたあともループが続いています。

今回はforとwhileを利用した基本的なループのさせ方から、入れ子構造の多重ループについて、break・continueの違いなどを解説しました。ループを活用してコードをより簡潔に、効率的に書けるようにしましょう!

コメント

プロフィール

プロフィール
コードラボJP

大学卒業後SEに就職、現在は退職しフリーランスとして活動中。
『初心者でも挫折せずに一人でプログラミングを学べる』をモットーに、コードラボJPを開設
お問い合わせ等はcodelabsjp@gmail.comまで

コードラボJPをフォローする
タイトルとURLをコピーしました