while文とは、繰り返し処理の1つで、指定された条件式がTrueの間は処理が繰り返し実行されます。そして、条件式がFalseになった時にwhile文は終了します。
この記事では、Pythonにおけるwhile文の使い方を初心者向けに解説しております。while文の定義方法、while True、break、else、while notの使い方など、while文についてはこれだけを読んでおけば良いよう、徹底的に解説しています。
発売数9,000本突破を記念して、今だけ期間限定で87%オフの大セール中!!!
Pythonにおけるwhile文の記述方法
while文とは、for文と同様、繰り返し処理の1つです。
条件式を指定し、その条件式がTrueの間はWhile文のブロック内の処理が繰り返し実行されますが、条件式がFalseになった時にwhile文は終了します。
記述方法は以下のとおりです。
while文に含まれる処理は、インデント(字下げ)して記述します(通常、インデントには半角スペース4つが使われます。)。処理が複数行ある場合も、全てインデントします。
インデントが終わると、while文の一連の処理は終わります。また条件式の後には、必ず :(コロン)を付けてください。
for文とwhile文は同じ繰り返し処理ですが、次の点が異なります。
- for文は回数を指定して、指定した回数分の繰り返し処理を行います。
- 一方でwhile文は、条件を指定して、その条件がTrueの間は繰り返し処理を行い、Falseになれば繰り返し処理を抜けます。
for文の詳しい説明は、「図解!Python for ループ文の徹底解説」を参照ください。
それではwhile文の例を見ていきましょう。
変数iに0を初期値として代入し、while文の条件としてiが3未満を指定しています。そして、printでiの値を表示し、iに1を加算しています。
1 2 3 4 | i = 0 while i < 3: print(i) i = i + 1 |
1
2
iが3になるまでは、指定された条件がTrueですので繰り返し処理を行う事になります。従ってprintで表示されるiの値は、0から2までになります。
while文の条件式で複数条件(and/or)の指定
while文の条件式は、andやorも使って複数の条件を指定することができます。
ここではwhile文でandを使う例を見てみましょう。
変数aに0を、変数iに12を初期値として代入し、while文の条件としてaが5未満、かつ、iが7以上を指定しています。
そして繰り返し処理の中で、printを用いてaとiの値を表示し、その後でaに1を加算し、iから2を引いています。
1 2 3 4 5 6 7 | a = 0 i = 12 while a < 5 and i >= 7: print("a = " + str(a)) print("i = " + str(i)) a = a + 1 i = i - 2 |
i = 12
a = 1
i = 10
a = 2
i = 8
変数aが0、1、2、変数iが12、10、8までは指定された条件がTrueなので、繰り返し処理を行っています。
そして変数aが3、変数iが6になった時点で、変数iの値が7未満になり条件がFalseになって処理が終わっています。
ポイント
発売数9,000本突破を記念して、今だけ期間限定で87%オフの大セール中!!!
while文の中でif文の利用
while文の繰り返し処理の中では、if文(elif/else)も利用することができます。if文の詳しい説明は、「図解!Python if文の徹底解説」を参照ください。
変数aに0を代入し、while文でaに1を加算し、変数aの内容をprintで出力しながら、5になるまで繰り返し処理をします。
この処理の途中、if文で変数aを2で割った余りが0、つまり2の倍数になった場合、printで変数aの値と「: 2の倍数」と出力します。
またelifで変数aを3で割った余りが0、つまり3の倍数になった場合、printで変数aの値と「: 3の倍数」と出力します。
上記以外(else)の場合は、変数aの値と「: 2・3の倍数以外」と出力します。
1 2 3 4 5 6 7 8 9 | a = 0 while a < 5: a = a + 1 if a % 2 == 0: print(str(a) + ": 2の倍数") elif a % 3 ==0: print(str(a) + ": 3の倍数") else: print(str(a) + ": 2・3の倍数以外") |
2: 2の倍数
3: 3の倍数
4: 2の倍数
5: 2・3の倍数以外
変数aの値が1の場合「1: 2・3の倍数以外」、変数aの値が2の場合「1: 2の倍数以外」、変数aの値が3の場合「1: 3の倍数以外」と思い通りに表示されました。
ポイント
breakでwhile文のループを抜ける方法
while文の繰り返し処理の途中で特定の条件を満たした場合、繰り返し処理を抜けたい時には、breakを使います。
変数aに0を代入し、while文でaに1を加算し、変数aの内容をprint()で出力しながら、10になるまで繰り返し処理をします。
この処理の途中、if文で変数aを3で割った余りが0、つまり3の倍数になった場合、処理を中止するようbreakを挿入します。
1 2 3 4 5 6 | a = 0 while a < 10: a = a + 1 if a % 3 == 0: break print(a) |
2
すると処理結果として、1、2と表示され、3になった時点でループを抜けていることがわかります
発売数9,000本突破を記念して、今だけ期間限定で87%オフの大セール中!!!
while文で繰り返し処理をスキップする方法(continue)
一方で、while文において、ある特定の条件を満たした場合、その要素の処理をスキップし、次の要素の処理へ移りたい時には、continueを使います。
先ほどのbreakと同じ例を使って、今度はcontinueの動作を確認していきましょう。
変数aに0を代入し、while文でaに1を加算し、変数aの内容をprint()で出力しながら、10になるまで繰り返し処理をします。
この処理の途中、if文で変数aを3で割った余りが0、つまり3の倍数になった場合、処理をスキップするようcontinueを挿入します。
1 2 3 4 5 6 | a = 0 while a < 10: a = a + 1 if a % 3 == 0: continue print(a) |
2
4
5
7
8
10
すると処理結果として、1、2、4、5、7、8、10と表示され、3の倍数になった時点でprint()の処理がスキップされ、次の繰り返し処理に移っていることがわかります。
do whileはwhile Trueとbreakで実現
他のプログラミング言語ではdo whileという構文があり、例えばC言語では以下のように記述します。
この構文では、処理は必ず1回は実行し、最後にwhile文の条件式で判定を行い、条件を満たしていれば、繰り返し処理を実行するというものです。
但し、Pythonではこのdo whileという構文が無く、必ず1回は処理を実行したい場合、while Trueとbreakを組み合わせるなど、別の方法を使って記述することになります。
while Trueとwhileの条件文にTrueを記述すると、条件が常にTrueになり、無限に繰り返し処理が続くことになります。そこで、実行したい処理に続けてif文とbreakを記述します。すると、if文の条件判定の前に処理があるので、必ず1回は実行されることになります。
例えば、次のようなwhile文があるとします。
1 2 3 4 | a = 0 while a < 3: print("aは{0}です。".format(a)) a = a + 1 |
aは1です。
aは2です。
ここでは、変数aが0から2まで処理が繰り返されています。ここで使われているprint、formatの詳しい説明は、「PythonにおけるPrint、Formatの使い方」を参照ください。
次に、変数aに代入する値を3に変更すると、while文の処理はスキップされ、処理結果には何も表示されません。
1 2 3 4 | a = 3 while a < 3: print("aは{0}です。".format(a)) a = a + 1 |
ここで、最低でも1回は処理を実行したい場合は、while Trueとif文を組み合わせて、次のように記述します。
1 2 3 4 5 6 | a = 3 while True: print("aは{0}です。".format(a)) a = a + 1 if a >= 3: break |
すると、最初の1回は処理が実行され、その後にif文の条件である変数aが3以上になり、breakでwhileのループを抜けています。
ポイント
繰り返し処理後に特定の処理を実行する方法(while else)
while文のよる繰り返し処理が全て実行された後に特定の処理を行いたい場合はelseを利用します。
通常はbreakと合わせて利用し、while文の繰り返し処理が全て実行された場合には特定の処理が実行され、while文の処理がbreakにより抜けた場合は、特定の処理は実行しないというように使います。
elseの記述方法は、次のとおりです。
while文の後にelseを記述します。else文に含まれる処理は、インデント(字下げ)して記述します(通常、インデントには半角スペース4つが使われます。)。処理が複数行ある場合も、全てインデントします。またelseの後には、必ず :(コロン)を付けてください。
また前と同様の例で、今度はelseを付けてみましょう。
変数aに0を代入し、while文でaに1を加算し、変数aの内容をprint()で出力しながら、10になるまで繰り返し処理をします。この処理の途中、if文で変数aを3で割った余りが0、つまり3の倍数になった場合、処理を中止するようbreakを挿入します。
今度はwhile文にはelseが付いており、breakでループが中断されなければ、print("elseの処理です。")の処理が実行されるようになっています。
1 2 3 4 5 6 7 8 | a = 0 while a < 10: a = a + 1 if a % 3 == 0: break print(a) else: print("elseの処理です。") |
2
すると処理結果として、1、2と表示され、"elseの処理です。"は表示されませんでした。3になった時点でbreakによりループを抜けているので、elseの処理は実行されませんでした。
次にwhileの条件式をa < 2に変更し、3の倍数でbreakが行われる前に、whileの繰り返し処理が終わるようにしてみます。
1 2 3 4 5 6 7 8 | a = 0 while a < 2: a = a + 1 if a % 3 == 0: break print(a) else: print("elseの処理です。") |
2
elseの処理です。
すると今度は、"elseの処理です。"も表示されました。breakが実行される前にwhileの繰り返し処理が終わっているので、elseの処理が実行されました。
ポイント
while not で条件を満たすまで繰り返し
whileの条件文には否定のnotも利用することができます。この場合、notで否定された条件を満たすまで繰り返し処理を行います。
それでは、whileの条件文にnotを利用した例を見ていきましょう。
次のコードでは、input()で文字の入力を促し、入力された値を変数nameに格納します。変数min_lengthには4を代入し、while文でnameにアルファベットが5文字以上入力されるまで繰り返し処理をします。
条件が満たされるまでwhileの中のinput()で入力を求められます。アルファベットが5文字以上入力されるとwhileの繰り返し処理が終わり、print()で入力結果を表示しています。
1 2 3 4 5 | min_length = 4 name = input("アルファベットを5文字以上入力してください:") while not(len(name) > min_length and name.isalpha()): name = input("アルファベットを5文字以上入力してください:") print("あなたは、{0} と入力しました。".format(name)) |
これを実行すると、次のinput()の処理で入力を求められます。ここでは、「test」と入力しました。
1 | name = input("アルファベットを5文字以上入力してください:") |
すると次の箇所で再度入力を求められます。ここではアルファベット5文字以上の入力条件を満たすまで処理が繰り返されます。ここでは「testtest」と入力しました。
1 2 | while not(len(name) > min_length and name.isalpha()): name = input("アルファベットを5文字以上入力してください:") |
そして、次のprint()が実行され、先ほどの入力内容が表示されました。
1 | print("あなたは、{0} と入力しました。".format(name)) |
ポイント
また参考までに、先ほどのコードは次のようにwhile Trueとbreakを使っても書き換えることができます。こちらの方がinput()の記述を1回で済ませることができます。
1 2 3 4 5 6 | min_length = 4 while True: name = input("アルファベットを5文字以上入力してください:") if len(name) > min_length and name.isalpha(): break print("あなたは、{0} と入力しました。".format(name)) |
関連記事です。
Pythonに関する重要なトピック全般について学んでいきたいと考えておられる方には、次のリンクをお勧めします。