パソナについて
記事検索

【Python入門】whileで書くループ処理 - サンプルを元に徹底解説

この記事ではPython入門者に向けて、実際に動くサンプルコードを元にwhile文について徹底解説していきます。

【Python入門】whileで書くループ処理 - サンプルを元に徹底解説

この記事ではPython入門者に向けて、実際に動くサンプルコードを元にwhile文について徹底解説していきます。

スキルアップ

2023/02/22 UP

Pythonにはループ処理としてwhile文とfor文があります。ある程度処理の回数が決まっているfor文に対し、while文は「条件がある状態になるまで処理を実施する」種類のループ処理になります。

一般的なwhile文の特徴に加え、Pythonにはdo while文がサポートされていないなど、独自の仕様があります。ループ処理はプログラミングの基本となる構文なので、今後Pythonの学習を進める上で避けては通れません。入門段階でwhile文の構造と動作についてしっかりと理解を深めておきましょう。

この記事ではPython入門者に向けて、実際に動くサンプルコードを元にwhile文について徹底解説していきます。

Pythonのwhile文とは

Pythonのwhile文も、一般的なプログラミング言語におけるwhileと同様に、条件式を設定し、条件式が真となる場合は処理を反復して実行する命令です。

Pythonのwhile文の書き方は以下のような形になります。

while 反復条件となる条件式:
    繰り返し行なう処理

whileの条件式の最後は必ず:で閉じ、繰り返し行なう処理はインデントします。条件式にはループ処理を繰り返したい場合に「真(true)」となる条件を記述します。Pythonはインデントによってブロックを表現するため、インデントを挿入する習慣を身に着けておきましょう。

それでは実際のコードを見てみましょう。次のサンプルコードはwhile文の基本形に則ったコードになっています。変数iが10未満である場合、現在のiの値を出力し、1を加えて処理の先頭へ戻り、再度処理を実行します。10回処理を繰り返し、変数iが10になった時点で処理は終了します。

i = 0
while i < 10:
    print(i)
    i += 1

while文は「条件式が真(true)となる場合は処理を反復する」という命令なので、条件が常にtrueであれば、指定された処理を永遠に反復し続ける無限ループになりますので注意しましょう。このサンプルでは、i += 1 の行を削除すると、iが永遠に0のままなので、無限ループとなります。

なおこの性質を利用して、「while True」という記述を行なうことで意図的に無限ループを作り出すテクニックもあります。しかし無限ループはエラーの原因となるため、必ず終了条件と一緒に運用するように注意しましょう。

do whileはない

Pythonには、C言語系のプログラミング言語がサポートしているdo whileはありません。ただし、同じような処理の書き方は可能です。

次のサンプルコードでは、do whileの「まず実行してから反復の継続条件の判定を行なう」という挙動を再現するため、前項で紹介した無限ループの記述方法を用い、whileの最初で変数iの現在の値を出力してから1を加算して処理を反復しています。

反復の継続条件の判定は、ネストしたifでiを監視し、10以上になった場合はbreakで処理を抜けることで再現します。

i = 0
while True:
    print(i)
    if i >= 10:
        break
    i += 1

Pythonのwhile文の書き方

それではPythonのwhile文の基礎を理解したところで、実働するコードを見ながら記述方法を解説していきます。while文の書き方と特徴が掴めたら、実際に自分で手を動かし、記述してみましょう。

while文の基本形

while文の条件式では、単純な比較演算だけでなく、配列や辞書を参照することができます。次のサンプルコードでは、dataという配列の値を参照して出力し、data[i]の中に0が出現したら処理を終了します。

ここでは配列dataの4番目の値が0のため、出力は5,2,1となります。

data = [5, 2, 1, 0, 3]
i = 0
while data[i] != 0:
    print(data[i])
    i += 1

複数条件でwhile

while文の条件式は複数の条件を設定することが可能です。andやorのような論理演算子を用いて複数の条件式を評価し、反復の継続を判断します。

次のサンプルコードでは、dataという配列の値を参照して出力し、data[i]の中に0か2が出現したら処理を終了します。

ここでは配列データの2番目の値が2のため、出力は5のみとなります。

data = [5, 2, 1, 0, 3]
i = 0
while data[i] != 0 and data[i] != 2:
    print(data[i])
    i += 1

breakでwhileを終了する

breakは記述された時点で処理を終了してループを抜ける命令です。無限ループの終了条件などに使用し、whileを適切に停止させます。break以降に記述されている処理は実行されません。

次のサンプルコードでは、dataという配列の値を出力し、値が6以上の場合はbreakでループを抜ける処理を行ないます。

ここでは、配列dataの5番目の値が6のため、出力は5,2,1,4,6となります。

data = [5, 2, 1, 4, 6, 3]
i = 0
while data[i] != 0:
    print(data[i])
    i += 1
    if i >= 5:
        break

continueで次のwhileループへ

continueは記述された時点でループ処理の先頭へ戻り、再び処理を実行する命令です。continue以降に記述されている処理は実行されません。

次のサンプルコードでは、dataという配列の値を参照してifで監視し、2だった場合はインデックスを進めてcontinueします。2以外だった場合は値を出力してインデックスを進めます。

ここでは、配列dataの2番目の値が2のため、出力は5,1,0,3となります。

data = [5, 2, 1, 0, 3]
i = 0
while True:
    if data[i] == 2:
        i += 1
        continue
    print(data[i])
    if data[i] == 3:
        break
    i += 1

do whileのように処理する方法

前項で解説した通り、Pythonはdo whileをサポートしていません。しかし、do whileと同じ挙動の処理を記述することは可能です。

次のサンプルコードでは、whileでループ処理を開始した時、最初に変数iの現在の値を出力します。続いてネストしたif文を用いて、変数iをインデックスとして配列から抜き出した値が0と等しいか否かを判断します。0であればbreakでループ処理を終了します。0でなければiに1を加算してインデックスを進め、ループ処理の最初に戻ります。

このように処理順を変えることで、do whileと同じ挙動をさせることが可能になります。

ここでは、配列dataの4番目の値が0のため、出力は5,2,1,0となります。

data = [5, 2, 1, 0, 3]
i = 0
while True:
    print(data[i])
    if data[i] == 0:
        break
    i += 1

whileにelse処理

if文で見るelseは、while文でも使用できます。whileの条件式が真にならない場合、elseの処理を行なうようなwhile文が記述できます。処理の流れと構造としては、while文の条件式が真(true)である間はループ処理を行ない、偽(false)になった時はelseの処理を行なってループ処理を終了します。

次のサンプルでは、変数iをインデックスとしてdataという配列から値を抜き出し、値が0ではない場合は値を出力したあと、iに1を加算してインデックスを進めて処理の先頭へ戻り、再度処理を実行します。0であった場合はelseの処理に進み、999を出力して、ループ処理を終了します。

ここでは、配列dataの4番目の値が0のため、出力は5,2,1,999となります。

data = [5, 2, 1, 0, 3]
i = 0
while data[i] != 0:
    print(data[i])
    i += 1
else:
    print(999)

注意する点として、breakはelseよりも優先されます。そのため、次のようなコードの場合、breakが実行された時点で処理が終了するため、else部分は実行されません。

ここでは、配列dataの4番目の値が0でbreakしてしまうため、出力は5,2,1となります。

data = [5, 2, 1, 0, 3]
i = 0
while True:
    if data[i] == 0:
        break
    print(data[i])
    i += 1
else:
    print(999)

Python のwhile文とfor文の使い分け

Pythonのループ処理には、while文とfor文があります。どちらも条件式が真(true)になる場合は処理を繰り返す構文ですが、挙動は異なります。

使い分けのポイントについて、それぞれの特徴を見ながら理解していきましょう。

while文のほうがよい場合

while文のほうが適しているケースは、ループ処理の回数が決定していない場合です。次のサンプルコードでは、変数rにrandom関数で発生させた乱数を代入し、rが0.5よりも大きい場合は処理を中止し、それ以外はrの現在の値を表示します。

random関数を用いた乱数で条件を判断するため、何回目の処理で0.5を上回る数値が出るかはわからないので、このようなケースではwhile文を使用します。

import random
while True:
    r = random.random()
    if r > 0.5:
        break
    print(r)

for文のほうがよい場合

forは処理の回数が決まっている場合に使用します。次のサンプルでは、dataという配列を作成し、配列から1つずつ数字を抜き出して変数numに代入し、文字列を出力しています。またnumが0になった時はbreakでループ処理を終了します。

このように処理する回数が決まっているループ処理にはfor文が適しています。

data = [5, 2, 1, 0, 3]
for num in data:
    if num == 0:
        break
    print(num)

whileはPythonの基本!

whileはPythonの基本!

while文は、実際の開発では条件をTrueとして無限ループにして使用するケースも多いため、continueとbreakの使い方は特に意識してマスターしておくとよいでしょう。無限ループは放置するとエラーの原因となるため、終了条件をしっかりと設定し、breakでループを抜ける処理に処理抜けがないように記述します。

whileの処理はPythonプログラミングで随所に現れるので、whileをマスターすることはPythonでプログラミングを進めていく上で必須といえるでしょう。今回紹介したサンプルコードを動かして書き換えながら、しっかりと理解して使いこなしてください。