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です。条件が変わらず、同じ処理が終わらない無限ループになります。
この失敗を確かめるために、実際に無限ループを動かす必要はありません。コードを読むときに、次を確認しましょう。
- 条件の中で使っている変数はどれか
- その変数は、ループの中で変わるか
- 変わった結果、いつか条件が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 で抜けられます。
- 入力を受け取る
qか調べるqならbreakで終了- それ以外なら文章を表示し、次の入力へ戻る
例えば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超入門⑤ 関数