J - 1.09.for文・break・continue 解説 /

実行時間制限: 0 msec / メモリ制限: 0 KB

前のページ | 次のページ

キーポイント

  • for 文は繰り返し処理でよくあるパターンを while 文より短く書くための構文
  • 列の中身が順に変数に代入される
for 変数 in 列:
    処理
  • N 回の繰り返し処理は以下の for 文で書くのが一般的
for i in range(N):
    処理
  • break を使うとループを途中で抜けることができる
  • continue を使うと後の処理を飛ばして次のループへ進むことができる

for 文

for 文は列の中身を順に処理するための構文です。
for 文を使うことで「N 回処理する」というような繰り返し処理でよくあるパターンを while 文より短く書くことができます。

3 回繰り返すプログラムを while 文と for 文で書くと次のようになります。

j = 0
while j < 3:
    print("Hello while:", j)
    j += 1

for i in range(3):
    print("Hello for:", i)
実行結果
Hello while: 0
Hello while: 1
Hello while: 2
Hello for: 0
Hello for: 1
Hello for: 2

for 文は次のように書きます。

for 変数 in 列:
    処理

列として代表的なものにはリストや文字列が存在しますが、詳しくは後の節で紹介します。

N 回の繰り返し処理

N 回処理をする」というような繰り返し処理をしたいときは、range() を使うと楽です。range(a, b) と書くことで、(a, a+1, a+2, \dots , b-1) という数列が生成されます。

for i in range(0, 5):
    print(i)
実行結果
0
1
2
3
4

range(a, b)a0 のときに省略することができ、range(b) と書くことができます。よって、次の二つの書き方は同じ意味になります。

for i in range(0, 5):
    print(i)

for i in range(5):
    print(i)
実行結果
0
1
2
3
4
0
1
2
3
4

つまり、「N 回の繰り返し処理」を書きたいときは次のように書けば良いです。

for i in range(N):
    処理

break と continue

while 文と for 文を制御する命令として、breakcontinue があります。

break

break はループを途中で抜けるための命令です。

# break がなければこのループは i == 4 まで繰り返す
for i in range(5):
    if i == 3:
        print("ぬける")
        break  # i == 3 の時点でループから抜ける

    print(i)

print("終了")
実行結果
0
1
2
ぬける
終了

上のプログラムでは、if 文で i == 3 が真になったとき break 文を実行することで for ループを抜け、終了 と表示しています。

continue

continue は後の処理をとばして次のループへ進むための命令です。

for i in range(5):
    if i == 3:
        print("とばす")
        continue  # i == 3 のとき これより後の処理を飛ばす

    print(i)

print("終了")
実行結果
0
1
2
とばす
4
終了

上のプログラムでは、if 文で i == 3 が真になったとき continue 文を実行することで continue より下の部分を飛ばし、次のループに進みます。

細かい話

細かい話なので、飛ばして問題を解いても良いです。

2 ずつ増やす

上では range(a, b) という書き方のみ紹介しましたが、実は range(a, b, c) という書き方もできこれによりいくつずつ増やすかを決めることができます(c を省略したときのデフォルトは 1 なので、これまでの書き方では全て 1 ずつ増えていました)。
よって、次のように書くことで 2 ずつ増やすことができます。

for i in range(0, 10, 2):
    print(i)
実行結果
0
2
4
6
8

同様にして、より多く飛ばしてループすることもできます。

なお、いくつずつ増やすかを決めるときは a がたとえ 0 だとしても省略できないことに注意してください。つまり、上のコードで range(10, 2) と書くと異なる挙動になってしまいます。

逆順ループ

5 から 0 までの数を出力したい場合は以下のようにします。

for i in range(5, -1, -1):
    print(i)
実行結果
5
4
3
2
1
0

0 まで出力したい場合に二つ目の引数を -1 にする必要があることに注意してください。range(5) としたときに(5 までではなく)4 までしか出力されなかったのと同様に、0 まで出力したい場合はひとつ次の -1 を指定する必要があります。
また、もちろん三つ目の引数に -2 などを指定することでより多く飛ばして逆順ループすることもできます。

より一般的に、range(N) を逆順にするときは range(N - 1, -1, -1) と書くことになります。

N = 5

print("昇順")
for i in range(N):
    print(i)

print("降順")
for i in range(N - 1, -1, -1):
    print(i)
実行結果
昇順
0
1
2
3
4
降順
4
3
2
1
0

for-else, while-else

Python では for 文と while 文に else 節を書くことができます。
これは、ループが break 文で終了した場合は実行されず、そうでないとき(ループが最後まで回ったとき)に実行されます。

break しない場合

for i in range(5):
    print(i)
else:
    print("ループが最後まで回りました。")

print("終了")
実行結果
0
1
2
3
4
ループが最後まで回りました。
終了

break する場合

for i in range(5):
    if i == 3:
        print("ぬける")
        break  # i == 3 の時点でループから抜ける

    print(i)
else:
    print("ループが最後まで回りました。")

print("終了")
実行結果
0
1
2
ぬける
終了

問題

リンク先の問題を解いてください。