プログラミング

Python超入門④ while文とfor文で処理を繰り返そう

Pythonのwhile、for、range、break、continueを使い、同じ処理を安全に繰り返します。

同じ表示を10回したいとき、print() を10行書くこともできます。でも、100回だったら……ちょっと大変ですよね。

そんなときに使うのが繰り返し(ループ)です。今回のゴールは、文法を丸暗記することより、「次の1周で何が変わるか」を自分で追えるようになること。1から100まで足すプログラムを、少しずつ組み立てます。

準備:繰り返す処理と、終わる条件を考える

この記事ではPython 3を使います。各コード欄は別々に実行してください。print()、変数、if文がまだ曖昧なら、変数の回とif文の回が先です。

ループを書く前に、次の2つを日本語で決めると整理できます。

  • 何を繰り返す? 数字を表示する、点数を足す、入力を受け取る、など
  • いつ終わる? 5回終わったら、データがなくなったら、終了の文字が入ったら、など

while は条件を確認しながら続ける書き方。for は値の集まりから1つずつ取り出して処理する書き方です。順番に見ていきましょう。

1. while文を、1周ずつ追ってみよう

動くコードを先に見る

count = 1

while count <= 3:
    print(count)
    count += 1

print("おしまい")
1
2
3
おしまい

count <= 3 は「countが3以下か」という条件です。正しければ True、正しくなければ False になります。

while の行の末尾にある : はコロンです。その下の字下げされた2行が、繰り返す処理になります。字下げはインデントといい、この記事では半角スペース4個でそろえます。

なぜ3回で止まる?

条件を調べるときのcount count <= 3 表示する値 1を足した後
1 True 1 2
2 True 2 3
3 True 3 4
4 False 表示しない ループの外へ進む

while は、条件確認 → 中の処理 → 条件確認という順に動きます。3を表示した後にも条件を確認するので、そこで4は入れないと分かるんですね。

最後の print("おしまい") は字下げされていません。だからループの外にあり、終了後に1回だけ動きます。while の基本動作はPythonの言語リファレンスで確認できます。

count += 1は、どう読む?

この例の整数では、count += 1 は count = count + 1 と同じ結果になります。

まず右側で「今のcountに1を足す」。次に、その結果をcountへ入れ直します。「1 = 1 + 1のようで変だな」と感じたら、= は数学の等号ではなく代入だったことを思い出してください。

2. 止まらないループを防ごう

先ほどの例から count += 1 を消すと、countはずっと1です。条件が変わらず、同じ処理が終わらない無限ループになります。

この失敗を確かめるために、実際に無限ループを動かす必要はありません。コードを読むときに、次を確認しましょう。

  1. 条件の中で使っている変数はどれか
  2. その変数は、ループの中で変わるか
  3. 変わった結果、いつか条件がFalseになるか

ターミナルで誤って止まらなくなった場合は、通常 Ctrl + C で中断できます。ブラウザ上の学習環境なら「停止」ボタンを使ってください。

また、条件が最初からFalseなら1回も動きません。

count = 5

while count <= 3:
    print(count)

print("条件に合わなかったので終了")

表示されるのは最後の文章だけです。「必ず1回は動く」わけではない点も覚えておきましょう。

3. 回数が決まっているならforとrange

1から3まで表示する

for number in range(1, 4):
    print(number)
1
2
3

range(1, 4) は、1から始まり、4の手前までの整数を順番に扱うためのものです。for が次の値を取り出すたび、number が1、2、3と変わります。

while の例と違って、number += 1 を自分で書く必要はありません。

「最後の数字は含まない」が大事

書き方 取り出される値
range(3) 0、1、2
range(1, 4) 1、2、3
range(2, 9, 2) 2、4、6、8
range(3, 0, -1) 3、2、1

3つ目の引数は、次の値へ進む幅です。引数(ひきすう)は、かっこの中へ渡す値のこと。例えば range(2, 9, 2) なら、開始2、終了の手前9、進む幅2を指定しています。

range(1, 1) は1つも値を出しません。range(3, 0) も、通常の増える方向では0へ向かえないので空になります。減らしたいなら -1 を指定します。詳しい条件はrangeの公式説明へ。

4. for文は、回数を数えるだけじゃない

名前の一覧に対して、1人ずつあいさつを表示してみましょう。

names = ["Aoi", "Ren", "Mio"]

for name in names:
    print(f"こんにちは、{name}さん")
こんにちは、Aoiさん
こんにちは、Renさん
こんにちは、Mioさん

["Aoi", "Ren", "Mio"] は、複数の値を並べて持つリストです。

1周目には "Aoi"、2周目には "Ren"、3周目には "Mio" が name に入ります。もう値がなくなったら終了です。

ここまで分かると、for は「何回繰り返すか」だけの仕組みではなく、値を1つずつ処理する仕組みだと見えてきます。リスト自体の作り方は第6回で詳しく扱います。

5. breakとcontinueは、止める範囲が違う

break:ループ全体から抜ける

while True:
    command = input("続けるならEnter、終了するならq: ")

    if command == "q":
        break

    print("もう1回続けます")

print("終了しました")

while True は、条件だけを見るとずっと続きます。でも、q が入力された回は break で抜けられます。

  1. 入力を受け取る
  2. q か調べる
  3. q ならbreakで終了
  4. それ以外なら文章を表示し、次の入力へ戻る

例えばEnter、続いて q を入力すると、「もう1回続けます」は1回だけ出ます。break はプログラム全体を終了する命令ではないので、ループの後の「終了しました」は表示されます。

continue:その回の残りだけを飛ばす

for number in range(1, 6):
    if number == 3:
        continue

    print(number)
1
2
4
5

3の回では continue により、後ろの print(number) を飛ばします。ただしループ自体は続くので、次は4です。

breakはループを出る。continueは次の周へ進む。 この違いを混ぜないようにしましょう。公式チュートリアルにも説明があります。

while で continue を使う場合は、変数を更新する行まで飛ばさないよう注意が必要です。まずは上の for の例で動きをつかむのがおすすめです。

6. 小さく作ってから、1から100まで足そう

まずは1から3まで

total = 0

for number in range(1, 4):
    total += number
    print(f"{number}を足したので、合計は{total}")

print(f"最後の合計: {total}")
1を足したので、合計は1
2を足したので、合計は3
3を足したので、合計は6
最後の合計: 6

number は「今回足す数」、total は「ここまでの合計」です。役割が違うんですね。

今回足すnumber 足す前のtotal 足した後のtotal
1 0 1
2 1 3
3 3 6

total = 0 をループの中へ入れると、毎回合計が0に戻ってしまいます。準備はループの前、足し算はループの中、最終表示はループの後と分けて考えましょう。

練習問題

今の仕組みを使って、1から100までの合計を表示してください。途中経過は表示せず、最後に合計だけ出します。

模範解答

total = 0

for number in range(1, 101):
    total += number

print(total)
5050

解説

100まで含めるため、range の終了値は101です。毎周 total に数を足し、全部終わってから表示します。

1と100、2と99……を組にすると、どの組も101です。50組あるので101 × 50 = 5050。別の方法で確かめると、コードの結果にも納得できますね。

使い分けと、次の一歩

  • 入力などの条件次第で終わりが決まるなら while
  • 決まった回数なら for と range
  • リストの値を1つずつ扱うなら for
  • 途中で抜けるなら break、その回だけ飛ばすなら continue

迷ったら、まず「1周ごとに変わるものは何か」を紙に書いてみてください。複雑な式より、値の変化を3周分ほど追う方が理解につながることもあります。

前の記事:Python超入門③ if文

次の記事:Python超入門⑤ 関数

← 記事一覧へ戻る