Python の勉強 スロットゲーム編 〜その11:for、while による繰り返しを途中で飛ばす、離脱する、他。VS Code のデバッグも!〜

プログラミング

forwhile について基本的な使い方は前回、勉強しました。しかし例外的な対応が必要になるのが世の常です。

continue で繰り返しを途中で飛ばしてみる

continue」を使うと forwhile で処理を繰り返している途中で、次のループまで飛ばすことができます。簡単な例として「0 〜 10 を表示するプログラムの途中、3 だけをすっ飛ばす」処理を書いてみましょう。

for r in range(5):
    print('-- start --')
    if r == 3:          # r が 3 の場合は continue を実行する
        continue        # continue の後、プログラムがどう進むかデバッグで確認しましょう
    print(r)
    print('-- end --')

print('fin...')
n = 0
while n < 5:
    print('-- start --')
    if n == 3:          # r が 3 の場合は continue を実行する
        n += 1          # これを忘れると無限ループになっちゃうよ!
        continue        # continue の後、プログラムがどう進むかデバッグで確認しましょう
    print(n)
    n += 1
    print('-- end --')

## 「n += 1」を 2 回も書くのは無駄……
## でも、1 回で済ませようとするとプログラムが分かりづらくなる。
## こういう場合は、多少無駄があっても分かりやすい方を選択しましょう
# n = -1
# while n < 4:
#     print('-- start --')
#     n += 1
#     if n == 3:          # r が 3 の場合は continue を実行する
#         continue        # continue の後、プログラムがどう進むかデバッグで確認しましょう
#     print(n)
#     print('-- end --')

print('fin...')

break で全部、すっ飛ばしてみる

break」を使うと、続く処理をすっとばしてループの外に出ることができます。先程のプログラムにある「continue」を「break」に書き換えて見ましょう。

for r in range(5):
    print('-- start --')
    if r == 3:          # r が 3 の場合は break を実行する
        break           # break の後、プログラムがどう進むかデバッグで確認しましょう
    print(r)
    print('-- end --')

print('fin...')
n = 0
while n < 5:
    print('-- start --')
    if n == 3:          # r が 3 の場合は break を実行する
        n += 1          #
        break           # break の後、プログラムがどう進むかデバッグで確認しましょう
    print(n)
    n += 1
    print('-- end --')

print('fin...')

VS Code でデバッグして確認する

Python の拡張機能を入れてあるので、今のままでデバッグできるようになっています。デバッグするとプログラムの流れが分かりやすいので、確認の際には重宝します。
VS Code では以下の手順で実行します。

  1. プログラムを止めたい行にブレークポイントを設定する(復数可)
  2. アクティブバーの「」ボタンをクリックしてデバッグを開始する([F5] 押下でも可)
  3. ブレークポイントで止まったら次のアクションを選択する
    • 次のブレークポイントまで処理を進める。次のブレークポイントがない場合は最後まで処理を進める
    • 現在の行を実行して次の行へ進む
    • 現在の行を実行して次の行へ進む。ただし現在の行が関数呼び出しである場合、その内部へ進む
    • 現在の関数の外へ進む。ただし関数の内部にいない場合は、「続行」と同様
「1. ブレークポイントを設定する」様子
「2. デバッグを開始する」様子
「3. ブレークポイント」で止まった様子

画面下部では、デバッグ実行のため、普段のプログラム実行時とは違ったコマンドが表示されています。

デバッグ実行して「continue」の動きを確認する様子

実は else も使えるよ!

if」で登場した「else」ですが、実は「for」「while」でも使えます。これは Python 独特の仕組みだと思います。今回のスロットゲーム中では使用していませんし、私自身がコレを目にした記憶もありません……。この機会に頭の片隅においておきましょう。
continue」「break」を併用した場合に、どの様な挙動になるのかは是非、デバッグにて確認してみてください。

print('---------- normal')
for r in range(5):
    print(r)
else:
    print('else 1')
    print('else 2')

print('---------- with continue')
for r in range(5):
    if r == 3:
        continue
    print(r)
else:
    print('else 1')
    print('else 2')

print('---------- with break')
for r in range(5):
    if r == 3:
        break
    print(r)
else:
    print('else 1')             # break の場合だけ実行されない!
    print('else 2')             # break の場合だけ実行されない!
print('---------- normal')
n = 0
while n < 5:
    print(n)
    n += 1
else:
    print('else 1')
    print('else 2')

print('---------- with continue')
n = 0
while n < 5:
    if n == 3:
        n += 1
        continue
    print(n)
    n += 1
else:
    print('else 1')
    print('else 2')

print('---------- with break')
n = 0
while n < 5:
    if n == 3:
        break
    print(n)
    n += 1
else:
    print('else 1')             # break の場合だけ実行されない!
    print('else 2')             # break の場合だけ実行されない!

ブレークポイントは任意の個数、設定することができます。デバッグで「続行」を使用すると、次のブレークポイントまで進みます。23 行目のブレークポイントで止まることなく処理が終了していることからも、「break」を実行すると「else」は処理されないことが分かります。

「continue」「break」「else」の挙動を確認する様子

コメント

タイトルとURLをコピーしました