Python で Do-While ループをエミュレートする方法
公開: 2022-08-31このチュートリアルでは、 Pythonでdo-while ループをエミュレートする方法を学習します。
どのプログラミング言語でも、ループは、ループ条件に応じて、特定のアクションを繰り返し実行するのに役立ちます。 Python はwhileおよびforループ構造をサポートしていますが、 do-whileループをネイティブにサポートしていません。
ただし、do-while ループのしくみを理解すれば、既存のループと Python のループ制御ステートメントを使用して、do-while ループをエミュレートできます。
次の数分間で、これを行う方法を学習します。 さぁ、始めよう!
Do-While ループ コンストラクトとは

C や C++ などの言語でプログラミングしたことがあれば、おそらく do-while ループ構造に出くわしたことでしょう。
do-while ループでは、ループ本体 (中かっこで区切られたブロック内) の一連のステートメントが最初に実行され、次にループ条件がチェックされます。
次の C サンプルは、Geekflare のオンライン C コンパイラで、ブラウザから直接実行できます。
次のコード スニペットを検討してください。
//do_while_example1 #include <stdio.h> int main() { int count = 1; printf("Do-While loop: \n"); do{ printf("Loop runs..."); }while(count<0); return 0; }
これが出力です。
Output Do-While loop: Loop runs...
上記の例では:
-
count
の値は 1 で、ループ条件はcount < 0
です。 ただし、ループ条件が最初はFalse
であっても、ループは 1 回実行されます。 - これは、最初にループ条件が
True
の場合にのみ実行されるwhileループとは対照的です。
//while_example1 #include <stdio.h> int main() { int count = 1; printf("While loop: \n"); while(count<0){ printf("Loop runs..."); } return 0; }
前述のように、ループ条件count < 0
は最初はFalse
で、 count
変数は 1 に初期化されます。したがって、上記のコードをコンパイルして実行すると、while ループ本体のステートメントが実行されないことがわかります。
Output While loop: //loop body does not run!
While と Do-While: 違いの概要
while ループと do-while ループの違いを詳しく見てみましょう。

次の例を検討してください。
//do_while_example2 #include <stdio.h> int main() { int count = 1; printf("Do-while loop: \n"); do{ printf("%d\n",count); count++; }while(count<5); return 0; }
上記のコード セルでは、次のようになります。
-
count
変数は 1 に初期化されます。 - do-while ループを使用します。
-
count
変数は、ループを通過するたびに 1 ずつインクリメントされ、ループ条件はcount < 5
に設定されます。
以下は、実行がどのように行われるかを視覚的に説明したものです。do-while ループがどのように機能し、ループ条件を 4 回チェックするかです。

Output Do-while loop: 1 2 3 4
代わりに while ループを使用すると、このようになります。
//while_example2 #include <stdio.h> int main() { int count = 1; printf("While loop: \n"); while(count<5){ printf("%d\n",count); count++; }; return 0; }
次の図は、while ループの実行を説明しています。 この例では、while ループはループ条件を 5 回チェックします。

Output While loop: 1 2 3 4
上記の while ループと do-while ループの出力は同じですが、いくつかの微妙な違いがあります。
while ループでは、条件のチェックが最初に行われ、その後にループ本体が続きます。 したがって、ループをK回実行する場合は、ループ条件がTrue
である場合に正確に K回実行する必要があります。 反復回数K+1で、条件はFalse
になり、制御はループから抜け出します。
一方、do-while ループを使用する場合: K がループを通過した後でのみ、K回目のループ条件がチェックされます。
では、なぜこのわずかな改善が役立つのでしょうか?
ループ条件が計算コストが高いとします。たとえば、再帰関数の呼び出し、複雑な数学演算などが含まれます。
このような場合、ループ本体を K 回繰り返す場合は、代わりに do-while ループを使用すると効果的です。
While と Do-While のまとめ

学んだ主な違いを表にまとめましょう。
ループ中 | Do-While ループ |
ループ条件のチェック: ループ本体の実行前 | ループ条件のチェック: ループ本体の実行後 |
条件が最初にFalse の場合、ループ本体は実行されません。 | 条件が最初にFalse の場合、ループ本体は1 回だけ実行されます。 |
ループ条件は、ループを K 回通過するために K 回チェックされます。 | ループ条件は、ループを K 回通過するたびに K-1 回チェックされます。 |
while ループを使用する場合 – 条件が True である限り、ループを実行する必要があります – 入力制御ループの場合 – ループ条件の計算コストが高くない場合 | do-while ループを使用する場合 – ループは、最初の False ループ条件に対して少なくとも 1 回実行する必要があります – 出口制御ループの場合 – ループ条件の計算コストが高い場合 |
Python での Do-While ループ動作のエミュレート
前のセクションから、do-while ループをエミュレートするための次の 2 つの条件があります。

- ループ本体のステートメントは、ループ条件が
True
であるかFalse
であるかに関係なく、少なくとも 1 回実行する必要があります。 - ループ本体でステートメントを実行した後、条件をチェックする必要があります。 条件が
False
の場合、コントロールはループから抜け出す必要があります: コントロールを終了します。
Python の無限ループと Break ステートメント

以下に示すように、Python で無限 while ループを定義できます。
while True: pass # Instead of True, you can have any condition that is always True while always-True-condition: pass
break
ステートメントを使用して、ループ本体から抜け出し、ループ本体の外側の最初のステートメントに制御を移すことができます。
while <condition>: if <some-condition>: break
C での最初の do-while ループの例では、ループを継続する条件はcount < 0
です。 したがって、ループから抜け出す条件は、カウント値が 0 または 0 より大きい ( count >= 0
) ことです。
Python での do-while ループのエミュレーションは次のとおりです。
count = 1 while True: print("Loop runs...") if(count >= 0): break
Python の Do-While ループの例

前のセクションの例に戻り、do while ループをエミュレートして Python で書き直します。
#1 。 例に戻りましょう: count
が 5 未満の場合にcount
変数の値を出力します。
ループ本体が少なくとも 1 回実行されるように、無限ループを定義する方法はわかっています。
カウントが 5 未満である限り、ループは継続する必要があります。 したがって、カウントが 5 に達したら、ループから抜け出す必要があります。 したがって、 count == 5
は終了制御条件です。
まとめると、次のようになります。
count = 1 while True: print(f"Count is {count}") count += 1 if count==5: break
Output Count is 1 Count is 2 Count is 3 Count is 4
#2 。 数当てゲームを Python の do-while コンストラクトとして書き直すこともできます。
数当てゲームでは、事前定義された秘密の番号に対してユーザーの推測を検証します。 ユーザーは、 max_guesses
など、許可されている特定の最大試行回数内で秘密の番号を推測する必要があります。
コードは、推測が正しいか間違っているかに関係なく、ユーザーに入力を促す必要があります。 これは、無限 while ループを使用して行うことができます。
では、いつループから抜け出す必要があるのでしょうか?
次のいずれかが発生した場合、コントロールはループから抜け出す必要があります。
- ユーザーが数字を推測した場合
- ユーザーがまだ数字を推測していないが、利用可能な推測の数を使い果たした場合。 ユーザーによる誤った推測の数 =
max_guesses
。
以下のコード セルは、その方法を示しています。
import random low, high = 5,50 secret_number = random.choice(range(low,high)) max_guesses = 10 num_guesses = 0 while True: guess = int(input("\nGuess a number:")) num_guesses += 1 conditions = [num_guesses==max_guesses,guess==secret_number] if any(conditions): break
ループから抜け出す代わりに、上記の各条件に遭遇したときに説明的なprint()
ステートメントを追加して、ループから抜け出すことができます。
import random low, high = 5,50 secret_number = random.choice(range(low,high)) print(secret_number) max_guesses = 10 num_guesses = 0 while True: guess = int(input("\nGuess a number:")) num_guesses += 1 if guess==secret_number: print("Congrats, you guessed it right!") break if num_guesses==max_guesses: print("Sorry, you have no more guesses left!") break
2 つの出力例を以下に示します。
この出力例では、ユーザーが秘密の番号を正しく推測すると、break ステートメントがループから抜け出します。
# Sample output when secret_number = 43 and user gets it right! Guess a number:4 Guess a number:3 Guess a number:43 Congrats, you guessed it right!
ユーザーが利用可能な推測の最大数に達したが、秘密の番号を正しく推測できなかった場合の別の出力例を次に示します。
# Sample output when secret_number = 33 and user fails to guess it right! Guess a number:3 Guess a number:15 Guess a number:21 Guess a number:50 Guess a number:17 Guess a number:6 Guess a number:18 Guess a number:5 Guess a number:12 Guess a number:43 Sorry, you have no more guesses left!
結論
このチュートリアルが、Python で do-while ループをエミュレートする方法を理解するのに役立つことを願っています。
主なポイントは次のとおりです。
- 無限ループを使用して、ループ本体が少なくとも 1 回実行されるようにします。 while True などの簡単な無限ループにすることも、 while <condition>のようにして、条件が常に True になるようにすることもできます。
- ループ内の終了条件を確認し、 breakステートメントを使用して、特定の条件下でループから抜け出します。
次に、Python で for ループと enumerate() 関数を使用する方法を学びます。