プログラミング演習・14章版 第5章 繰り返し処理
教材コード

繰り返し処理

「1から10まで声に出して数える」「同じ体操を5回くり返す」「名簿を上から順に 読み上げる」.わたしたちの日常には,同じことを何度もくり返す場面が たくさんあります.同じことなら1回書けば十分で,わざわざ10回も書きたくはありません. コンピュータがいちばん得意とするのも,この「決まったことを,文句も言わず, 正確に何度もくり返す」作業です.

第1章で見たプログラミングの3つの基本(順次・条件分岐・繰り返し)のうち,この章で 学ぶのは最後の繰り返し(ループ)です.Python には繰り返しの ための命令が2つあります.for と while です.回数が決まっているときは for,決まっていないときは while,と使い分ける.順番に見て いこう.

同じことを何回もくり返す:for と range

たとえば「 print("こんにちは") を3回実行したい」とします.素直に書くと こうなります.

chapter-05_code_1.py
print("こんにちは")
print("こんにちは")
print("こんにちは")

3回ならまだ書けるが,これが100回だったらどうだろう.同じ行を100回もコピーするのは 大変であるし,見間違いやすく,後から「101回にしたい」と思っても直すのがひと 苦労です.こんなときに使うのが for(フォー)です.

chapter-05_code_2.py
for kaisuu in range(3):
    print("こんにちは")

これを実行すると,次のように表示されます.

実行結果の例
こんにちは
こんにちは
こんにちは

print は1回しか書いていないのに,3回くり返されました.1行目の意味を分解して 読んでみましょう.

range(3)

「0, 1, 2」という3つの数の並びを作る命令である (range は「範囲」という意味).0から始まり,3は含まない. つまり「0以上3未満」の整数が順に出てくる.

for kaisuu in ...

その並びから値を1つずつ取り出して,変数 kaisuu に代入する,という意味です.取り出すたびに,下の字下げ された部分(ブロック)が1回実行されます.

:(コロン)

行の終わりのコロンは「ここからくり返す中身が始まるよ」 という合図です.条件分岐の if と同じく,忘れやすい記号です.

range(3) の中身が3個あるので,ブロックが3回くり返される,というわけである (図5.1).くり返す中身は,字下げ(半角スペース4つ)でそろえます.

for のくり返しの流れ:回数が残っている間,中の処理をくり返す

取り出した値を使ってみる

変数 kaisuu には,くり返すたびに 0, 1, 2 と順に値が入っています.これを 表示に使うと,くり返しのたびに中身が変わる様子がよく分かります.

chapter-05_code_4.py
for kaisuu in range(3):
    print("いま kaisuu は", kaisuu)
実行結果の例
いま kaisuu は 0
いま kaisuu は 1
いま kaisuu は 2

1回目は kaisuu が 0,2回目は 1,3回目は 2 に なっています.このように,for は「ただ同じことをくり返す」だけでなく, 取り出した値を中で使えるのが便利なところです.

range(3) が作るのは 0, 1, 2 で,3 は入らない. 「3回くり返す」のに「最後が3じゃないの?」と最初はとまどうが,0から数え 始めて3個と覚えるとよいでしょう.Python の数えはじめが0なのは,リスト(第6章)の 添字(そえじ)とそろえるためで,これから何度も出てくる.

繰り返す値を順に取り出す

知識

forはrangeが与える値を順に変数へ入れて実行します。range(3)は0、1、2の3個です。

for i in range(3):
    print(i)
そのまま演習繰り返す値を順に取り出す

実行前に、表示される行数と各行の値を予想してください。上のコードを編集欄へ開き、変更せずに実行します。その後「出力例」を開き、予想と実行結果を比べてください。入力操作はありません。各表示行の末尾には改行があります。

出力例
0
1
2
ヒントを見る

繰り返しの対象となる整数を、先頭から並べてください。指定した終了値が対象へ含まれるかも確認します。

演習の解説

iは0、1、2の順に変わり、3行を表示します。終了値3は含まれません。

虫食い繰り返す値を順に取り出す

___の1か所だけを補い、上と同じ結果が出るコードにしてください。他の行は変えません。

for i in ___(3):
    print(i)
ヒントを見る

指定した回数分の整数を用意する処理を考えます。最後の値が回数そのものになるかも確認します。

虫食いの解説
for i in range(3):
    print(i)

空欄には range が入ります。iは0、1、2の順に変わり、3行を表示します。終了値3は含まれません。

1からNまでをくり返す:range の使い方

さきほどの range(3) は 0 から始まった.しかし,ふだんわたしたちは 「1から数える」ことが多いです.range は,始まりの数と 終わりの数を指定することもできます.

chapter-05_code_6.py
# 1から5までを順に表示する
for kaisuu in range(1, 6):
    print(kaisuu)
実行結果の例
1
2
3
4
5

range(1, 6) は「1, 2, 3, 4, 5」を作ります.始まりの1は含み,終わりの6は 含まない.ここでも「最後の数は1つ手前まで」という決まりがはたらいています. 「1から5まで」と言いたいなら,終わりには5より1つ大きい6を書く,と覚えると よいでしょう.

  • range(N) は 0 から N-1 までの整数を作る(N個).

  • range(A, B) は A から B-1 まで(Bは含まない).

  • for 変数 in range(...): で,値を1つずつ取り出してくり返します.

  • くり返す中身は字下げ(半角スペース4つ)でそろえます.

九九の段を表示する

取り出した値を計算に使えば,表のようなものも作れます.3の段を表示してみましょう.

chapter-05_code_8.py
# 3の段(3×1から3×9まで)を表示する
for kaisuu in range(1, 10):
    kekka = 3 * kaisuu
    print("3 ×", kaisuu, "=", kekka)
実行結果の例
3 × 1 = 3
3 × 2 = 6
3 × 3 = 9
(…途中省略…)
3 × 9 = 27

range(1, 10) で kaisuu が 1 から 9 まで変わります.くり返しのたびに 3 * kaisuu を計算し,変数 kekka に代入して表示しています.このように, くり返しの中で毎回ちがう計算をさせられるのが for の力です.

とびとびの数でくり返す:range の3つ目の数

range には,もう1つ数を足すことができます.3つ目の数はいくつずつ 増やすか(とびの幅)を表します.たとえば「1から10までの奇数(1, 3, 5, 7, 9)を 表示したい」というときに使います.

chapter-05_code_10.py
# 1から10までを2とびで表示する(奇数)
for kaisuu in range(1, 11, 2):
    print(kaisuu)
実行結果の例
1
3
5
7
9

range(1, 11, 2) は「1から始めて,2ずつ増やしながら,11の手前まで」という 意味です.だから 1, 3, 5, 7, 9 が出てくる(次は11になるが,11は含まないので 止まる).ここまでで,range の3つの書き方が出そろった.並べて確かめて おこう.

range(5)

「0, 1, 2, 3, 4」.0から始まり,5は含まない(5個).

range(1, 6)

「1, 2, 3, 4, 5」.始まりの1は含み,6は含みません.

range(1, 11, 2)

「1, 3, 5, 7, 9」.1から2とびで,11は含みません.

どの書き方でも,共通する大事な約束は「終わりの数は含まない」という 点です.これを覚えておけば,3つの書き方はすべて同じ仲間だと分かります.

3つ目の数(とびの幅)を書き忘れると,range(1, 11) となり,1から10まで すべて(1ずつ)が出てしまう.「奇数だけ」「5とびで」のようにとばし たいときだけ3つ目の数を書く,と覚えるとよいでしょう.ふつうに1ずつでよければ2つの数だけで 十分です.

最後の値を含む範囲を指定する

知識

rangeの終了値は含みません。1から5を含めたいなら開始を1、終了を6にします。

for i in range(1, 6):
    print(i)
そのまま演習最後の値を含む範囲を指定する

実行前に、表示される行数と各行の値を予想してください。上のコードを編集欄へ開き、変更せずに実行します。その後「出力例」を開き、予想と実行結果を比べてください。入力操作はありません。各表示行の末尾には改行があります。

出力例
1
2
3
4
5
ヒントを見る

開始値と終了値を分け、実際に対象になる整数を全部書き出します。表示の行数と値の順番を予想してください。

演習の解説

1、2、3、4、5をそれぞれ別の行へ表示します。終了値を5にすると最後の5が表示されません。

虫食い最後の値を含む範囲を指定する

___の1か所だけを補い、上と同じ結果が出るコードにしてください。他の行は変えません。

for i in range(1, ___):
    print(i)
ヒントを見る

終了値は範囲に含まれません。最後に表示したい数の一つ後まで指定してください。

虫食いの解説
for i in range(1, 6):
    print(i)

空欄には 6 が入ります。1、2、3、4、5をそれぞれ別の行へ表示します。終了値を5にすると最後の5が表示されません。

くり返しの中で合計をためる

繰り返しのもっとも代表的な使い道が,集計です.たとえば 「1から10までの合計はいくつか」を計算してみましょう.手で計算すると 1 + 2 + 3 + ⋯ + 10 で大変だが,コンピュータならあっという間です.

考え方は,お皿に料理を1品ずつ足していくのに似ています.最初はお皿は 空(合計0).そこへ1を足し,次に2を足し,…と順に足していけば,最後に全部の 合計がたまっています.

chapter-05_code_12.py
# 1から10までの合計を求める
goukei = 0               # 合計を入れる箱。最初は0
for kaisuu in range(1, 11):
    goukei = goukei + kaisuu   # いまの合計に kaisuu を足す
print("合計は", goukei)
実行結果の例
合計は 55

ここでいちばん大事なのが goukei = goukei + kaisuu という行です.これを 1行ずつ追ってみましょう.

2行目

くり返しが始まる前に,goukei を 0 に しておく.これを忘れると「まだ何も入っていない箱に足す」ことになり, エラーになります.

4行目

= は「等しい」ではなく代入であった(第3章).右側の goukei + kaisuu(いまの合計+取り出した数)を計算し,その結果を あらためて goukei に入れ直しています.つまり「合計を更新する」 のです.

kaisuu が 1, 2, 3, …, 10 と変わるたびに goukei は 0→1→3→6→…→55 と増えていく.表にすると次のとおりです.

実行結果の例
kaisuu :  1   2   3   4   5  ...  10
goukei :  1   3   6  10  15  ...  55

goukei = 0 の初期化(さいしょの準備)をくり返しの外に書くのが ポイントです.もし for の中(字下げした位置)に書いてしまうと,くり返す たびに goukei が0に戻ってしまい,いつまでも合計がたまりません.「ためる箱は, くり返す前にいちど用意する」と覚えよう.

1周ごとに変数を追いかける

合計をためるしくみは,言葉で読むより1周ずつ変数の中身を書き出して追う ほうがはっきり分かります.数を小さくして「1から4までの合計」で,くり返しが1周進むたびに kaisuu と goukei がどう変わるかを,すべて書き出してみましょう.

chapter-05_code_15.py
goukei = 0
for kaisuu in range(1, 5):   # kaisuu は 1, 2, 3, 4
    goukei = goukei + kaisuu
print("合計は", goukei)
実行結果の例
合計は 10

くり返しに入る前,goukei は 0 です.ここから1周ずつ, goukei = goukei + kaisuu の右側がどう計算され,左側がどう変わるかを表に しました.

実行結果の例
何周目  kaisuu   計算(古いgoukei + kaisuu)   新しいgoukei
 1周目    1        0 + 1                          1
 2周目    2        1 + 2                          3
 3周目    3        3 + 3                          6
 4周目    4        6 + 4                         10

ここで大事なのは,ある周の「新しい goukei」が,次の周では「古い goukei」になって使われるという点です.たとえば2周目で goukei は 3 になり,その 3 が3周目の計算 3 + 3 に使われています.このように goukei は前の周の結果を受けつぎながら育っていく.4周目を終えると kaisuu の並び(1, 2, 3, 4)が尽きるので,くり返しが終わり,たまった 10 が表示されます.

goukei = goukei + kaisuu の右側と左側に同じ goukeiが 出てくるのを見て,最初はとまどうかもしれません.これは数学の方程式ではありません. 右側を先に計算し,その答えを左側へ入れ直すという代入の動きである (第3章).「いまの goukei に kaisuu を足して,新しい goukei にする」と読みかえると分かりやすい.

個数を数える(カウント)

合計と同じ仕組みで,「条件に当てはまるものが何個あるか」を数えることもできます. 合計のかわりに,毎回 1 ずつ足していくのです.点数の一覧から「合格 (60点以上)の人数」を数えてみましょう.

chapter-05_code_18.py
tensuu = [80, 55, 60, 90, 40]   # 5人の点数
ninzuu = 0                      # 合格の人数。最初は0
for ten in tensuu:
    if ten >= 60:               # 60点以上なら
        ninzuu = ninzuu + 1     # 人数を1つ増やす
print("合格者は", ninzuu, "人")
実行結果の例
合格者は 3 人

ここでは range ではなく,for ten in tensuu と書いて, リストの中身を1つずつ取り出しています.リストを for で回す方法は 第6章でくわしく学ぶが,「点数を1つずつ ten に取り出して調べる」という 流れは,いままでと同じです.くり返しの中に if(条件分岐)を入れて, 当てはまったときだけ ninzuu を増やしています.

いちばん大きい値を見つける(最大値)

合計やカウントと同じく,くり返しのたびに変数を更新する代表例が,いちばん 大きい値をさがすことです.たとえば1週間の最高気温の記録から「いちばん暑かった 日の気温」を求めてみましょう.考え方は,スポーツの記録会でこれまでの最高記録を 紙に書いておき,それを上回ったら書き直すのに似ています.

chapter-05_code_20.py
# 5日分の最高気温から、いちばん高い気温を求める
kion = [28, 31, 27, 35, 33]   # 5日分の気温
saidai = kion[0]              # とりあえず1日目を最大とする
for ki in kion:
    if ki > saidai:           # いまの最大より大きければ
        saidai = ki           # 最大を書きかえる
print("いちばん高い気温は", saidai, "度")
実行結果の例
いちばん高い気温は 35 度

ポイントは,くり返しに入る前に saidai へ最初の値 (1日目の 28)を入れておくことです.あとは1つずつ取り出した ki と くらべ,ki のほうが大きいときだけ saidai を書きかえる.1周ごとに ki と saidai がどう変わるかを,すべて書き出してみましょう.

実行結果の例
何周目  取り出したki   ki > saidai ?   書きかえ?   周のあとのsaidai
 (準備)     ―             ―             ―             28
 1周目      28        28 > 28 いいえ    しない         28
 2周目      31        31 > 28 はい      する           31
 3周目      27        27 > 31 いいえ    しない         31
 4周目      35        35 > 31 はい      する           35
 5周目      33        33 > 35 いいえ    しない         35

表を上から下へたどると,saidai が 28 から 31, そして 35 へと大きくなるときだけ書きかわり,小さい値が来たときは そのまま保たれているのが分かります.5周を終えると kion の中身が尽きてくり返しが 終わり,残った saidai(35)が答えになります.合計のときの goukei と同じく,saidai も前の周の結果を受けつぎながら育っていく変数です.

最大値の saidai を 0 で初期化すると,気温のように必ず0より大きい 値ならうまくいくが,マイナスもありうる値(冬の気温や,得点の増減など)では 正しく求められないことがあります.最初の1個を初期値にする(ここでは kion[0])のがいちばん安全です.最小値をさがすときも同じで,if の 向きを ki < saishou に変えればよいでしょう.

  • 集計の基本は「ためる箱を0で用意 → くり返しの中で足す」.

  • 合計は goukei = goukei + 値,カウントは ninzuu = ninzuu + 1.

  • 最大値は「最初の1個を初期値にし,大きいときだけ書きかえる」.

  • ためる箱の初期化は,必ずくり返しの外(前)で行います.

各回の値を合計へためる

知識

合計をためる変数はループ前に0へ初期化し、各回で前の合計へ足します。

goukei = 0
for i in range(1, 6):
    goukei = goukei + i
print(goukei)
そのまま演習各回の値を合計へためる

実行前に、表示される行数と各行の値を予想してください。上のコードを編集欄へ開き、変更せずに実行します。その後「出力例」を開き、予想と実行結果を比べてください。入力操作はありません。各表示行の末尾には改行があります。

出力例
15
ヒントを見る

各回の前と後で合計がどう変わるか表にします。表示がループの内側か外側かも確認してください。

演習の解説

合計は0→1→3→6→10→15と変わります。printをループの外へ置くため最後の15だけが表示されます。

虫食い各回の値を合計へためる

___の1か所だけを補い、上と同じ結果が出るコードにしてください。他の行は変えません。

goukei = 0
for i in range(1, 6):
    goukei = goukei ___ i
print(goukei)
ヒントを見る

前の合計を残したまま、今回の値を加える更新が必要です。毎回0へ戻さないようにします。

虫食いの解説
goukei = 0
for i in range(1, 6):
    goukei = goukei + i
print(goukei)

空欄には + が入ります。合計は0→1→3→6→10→15と変わります。printをループの外へ置くため最後の15だけが表示されます。

条件が成り立つ間くり返す:while

for は「何回くり返すか」が前もって決まっているときに使った.しかし, 世の中には何回でくり返しが終わるか分からないこともあります.たとえば 「貯金が目標の1000円に届くまで,毎日100円ずつ貯める」.これは「○日くり返す」 ではなく「目標に届くまでくり返す」という言い方のほうが自然です.

このように条件が成り立っている間ずっとくり返すのが while(ホワイル)です.

chapter-05_code_23.py
# 貯金が1000円に届くまで、100円ずつ貯める
chokin = 0               # いまの貯金
while chokin < 1000:     # 1000円未満の間くり返す
    chokin = chokin + 100
    print("いまの貯金", chokin, "円")
実行結果の例
いまの貯金 100 円
いまの貯金 200 円
(…途中省略…)
いまの貯金 1000 円

while のうしろには条件を書きます.ここでは chokin < 1000 (貯金が1000円未満)です.この条件が成り立っている間だけ,下のブロックが くり返されます.1回くり返すごとに条件をチェックし直し,成り立たなくなった (1000円に届いた)ところで,くり返しを終えて下へ抜ける(図5.2).

while のくり返しの流れ:条件が成り立つ間くり返す

無限ループに注意

while には,for にはないこわさがあります.条件が ずっと成り立ったままだと,くり返しが永遠に終わらないのです. これを無限ループといいます.

chapter-05_code_25.py
chokin = 0
while chokin < 1000:     # この条件が永遠に成り立つ!
    print("貯金中…")     # chokin を増やし忘れている

この例では,ブロックの中で chokin を増やしていません.だから chokin は ずっと 0 のまま,0 < 1000 はいつまでも成り立ち,「貯金中…」が画面に 出つづけて止まらなくなります.

while を書くときは,「くり返すたびに,条件にかかわる変数がゴールに 近づいているか」を必ず確認しましょう.さきほどの正しい例では,毎回 chokin を 100円ずつ増やしていたので,いつか1000円に届いて止まった.もしプログラムが止まら なくなったら,あわてずCtrl+C(コントロールキーを押しながらC)で強制的に 止められます.

while を1周ずつ追いかける

while は「条件をチェックする → 中身を実行する → また条件をチェックする」をくり返します.この条件チェックの場所を意識すると, いつ止まるかが分かります.カウンタ(数える変数)を自分で増やす例で,1周ずつ追って みましょう.

chapter-05_code_26.py
kaisuu = 1
while kaisuu <= 3:           # kaisuu が3以下の間くり返す
    print(kaisuu, "回目")
    kaisuu = kaisuu + 1      # カウンタを1つ増やす
print("おわり")
実行結果の例
1 回目
2 回目
3 回目
おわり

kaisuu と,条件 kaisuu <= 3 の判定が,1周ごとにどう変わるかを 書き出すと次のようになります.

実行結果の例
判定前のkaisuu   kaisuu <= 3 ?   中身を実行?   実行後のkaisuu
      1            成り立つ        する            2
      2            成り立つ        する            3
      3            成り立つ        する            4
      4          成り立たない     しない(抜ける)   4

kaisuu が 4 になった時点で条件 4 <= 3 が成り立たなく なり,中身を実行せずにくり返しを抜けて「おわり」が表示されます.条件は,中身を 実行する前に毎回チェックされることに注目してください.もし kaisuu = kaisuu + 1 の1行を書き忘れると,kaisuu はずっと 1 のままで条件が永遠に成り立ち, 前ページの無限ループになってしまう.

減らしながらくり返す:残りを追いかける

while のカウンタは,増やすだけでなく減らす使い方もよくします. たとえば「持っているお金で,1個120円のパンを買えるだけ買う」場面を考えよう. これは「お金が足りている間くり返す」という,回数の決まっていないくり返しです.

chapter-05_code_29.py
# 500円で120円のパンを買えるだけ買う
nokori = 500             # いまの残金
kaisuu = 0               # 買えた個数
while nokori >= 120:     # 120円以上ある間くり返す
    nokori = nokori - 120
    kaisuu = kaisuu + 1
    print(kaisuu, "個目を買った。残り", nokori, "円")
print("買えたのは", kaisuu, "個")
実行結果の例
1 個目を買った。残り 380 円
2 個目を買った。残り 260 円
3 個目を買った。残り 140 円
4 個目を買った。残り 20 円
買えたのは 4 個

この while では nokori(残金)が毎回減っていき, やがて条件 nokori >= 120 が成り立たなくなって止まる.条件の判定は中身を実行 する前に毎回行われます.1周ごとに nokori と判定がどう変わるかを書き 出すと次のようになります.

実行結果の例
判定前のnokori   nokori >= 120 ?   中身を実行?   実行後のnokori   kaisuu
     500           成り立つ         する            380           1
     380           成り立つ         する            260           2
     260           成り立つ         する            140           3
     140           成り立つ         する             20           4
      20         成り立たない      しない(抜ける)    20           4

nokori が 20 になった時点で 20 >= 120 が成り立た なくなり,中身を実行せずにくり返しを抜ける.このとき kaisuu は 4 の ままなので「買えたのは4個」と表示されます.増やすカウンタ(前の例の kaisuu) とちがい,今度は nokori がゴール(120円未満)に近づくように減って いく点に注目してください.増やすか減らすかはちがっても,毎回,条件にかかわる 変数を変化させるという約束は同じです.

while の条件は,増えて止まる場合と減って止まる場合の どちらもあります.大事なのは向きではなく,くり返すたびに条件にかかわる変数が 止まる方向へ動いているかです.この例で nokori = nokori - 120 を書き忘れ れば,nokori はずっと 500 のままで,やはり無限ループになります.

偶数を表示して終了する

知識

whileは毎回条件を確認します。条件がいつかFalseになるように、ブロック内で変数を更新します。

i = 2
while i <= 10:
    print(i)
    i = i + 2
そのまま演習偶数を表示して終了する

実行前に、表示される行数と各行の値を予想してください。上のコードを編集欄へ開き、変更せずに実行します。その後「出力例」を開き、予想と実行結果を比べてください。入力操作はありません。各表示行の末尾には改行があります。

出力例
2
4
6
8
10
ヒントを見る

表示の後に変数がどう更新されるか追ってください。更新した値で条件を再び調べ、最初に条件が偽になる回まで考えます。

演習の解説

2、4、6、8、10を別々の行に表示します。次にiが12になると12<=10はFalseとなり終了します。

虫食い偶数を表示して終了する

___の1か所だけを補い、上と同じ結果が出るコードにしてください。他の行は変えません。

i = 2
while i <= 10:
    print(i)
    i = i ___ 2
ヒントを見る

1回ごとに次の偶数へ進めます。更新しないと条件が変わらず、終了できません。

虫食いの解説
i = 2
while i <= 10:
    print(i)
    i = i + 2

空欄には + が入ります。2、4、6、8、10を別々の行に表示します。次にiが12になると12<=10はFalseとなり終了します。

break と continue:くり返しの流れを変える

くり返しの中で「もう終わりにしたい」「今回だけ飛ばしたい」と思うことがあります. そのための命令が break と continue です.

break:くり返しを途中でやめる

break(ブレーク)は,その場でくり返しを打ち切って,ループの外へ 抜け出します.たとえば「点数を順に見ていって,最初に不合格(60点未満)が出たらそこで 調べるのをやめる」場合です.

chapter-05_code_32.py
tensuu = [85, 70, 50, 90]   # 順に調べる点数
for ten in tensuu:
    if ten < 60:            # 不合格が見つかったら
        print(ten, "点で不合格。調査終了")
        break              # くり返しをやめる
    print(ten, "点は合格")
実行結果の例
85 点は合格
70 点は合格
50 点で不合格。調査終了

3つ目の 50 で break が実行され,4つ目の 90 は調べられずに くり返しが終わっています.「目当てのものが見つかったら,もう最後まで調べなくてよい」 というときに便利です.

continue:今回だけ飛ばして次へ

continue(コンティニュー)は,くり返しをやめるのではなく,今回の 残りの処理だけ飛ばして,次のくり返しへ進む.たとえば「1から5のうち,3だけは飛ばして 表示する」ときです.

chapter-05_code_34.py
for kaisuu in range(1, 6):
    if kaisuu == 3:        # 3のときは
        continue          # 残りを飛ばして次へ
    print(kaisuu)
実行結果の例
1
2
4
5

kaisuu が 3 のときだけ continue が実行され,その下の print が飛ばされました.だから 3 だけ表示されていません.break が 「くり返し全体を終わらせる」のに対し,continue は「今回をスキップして 次は続ける」点がちがう.

break と continue を混同しないようにしましょう. break=もうやめる(外へ抜ける),continue=今回だけ飛ばして次へ 進む,です.使いすぎるとくり返しの流れが追いにくくなるので,「ここでやめたい」 「ここだけ飛ばしたい」というはっきりした理由があるときに使います.

その回だけ飛ばす処理を確認する

知識

continueはその回の残りを飛ばし、breakはループ自体を終えます。どちらも置く位置が結果を変えます。

for i in range(1, 6):
    if i == 2:
        continue
    if i == 4:
        break
    print(i)
そのまま演習その回だけ飛ばす処理を確認する

実行前に、表示される行数と各行の値を予想してください。上のコードを編集欄へ開き、変更せずに実行します。その後「出力例」を開き、予想と実行結果を比べてください。入力操作はありません。各表示行の末尾には改行があります。

出力例
1
3
ヒントを見る

各整数について、途中で次の回へ進むか、ループ全体を終えるか、表示まで進むかを分けて予想してください。

演習の解説

1を表示し、2はcontinueで表示を飛ばします。3を表示し、4でbreakするため4と5は表示しません。

虫食いその回だけ飛ばす処理を確認する

___の1か所だけを補い、上と同じ結果が出るコードにしてください。他の行は変えません。

for i in range(1, 6):
    if i == 2:
        ___
    if i == 4:
        break
    print(i)
ヒントを見る

ある値のときだけ残りの表示を飛ばし、次の回へ進む文が必要です。ループ全体を終える文とは違います。

虫食いの解説
for i in range(1, 6):
    if i == 2:
        continue
    if i == 4:
        break
    print(i)

空欄には continue が入ります。1を表示し、2はcontinueで表示を飛ばします。3を表示し、4でbreakするため4と5は表示しません。

for と while の使い分け

最後に,2つの繰り返しの使い分けを整理しましょう.判断のポイントはひとつ, 「くり返す回数が,前もって決まっているか」です.

for(回数が決まっている)

「5回くり返す」「1から10まで」 「名簿の人数ぶん」のように,回数がはっきりしているとき. range やリストと組み合わせて使います.

while(回数が決まっていない)

「目標に届くまで」「正しい入力が あるまで」のように,いつ終わるか前もって分からず,条件で判断したい とき.

表にすると,両者のちがいは次のように整理できます.

for while
くり返す回数 前もって決まっている 決まっていない(条件しだい)
止まり方 並びを使い切ったら止まる 条件が成り立たなくなったら止まる
カウンタ range が自動で進める 自分で増やす必要がある
向く場面 「5回」「1から10まで」 「目標に届くまで」

とくにカウンタのあつかいがちがう.for は range が 変数を自動で進めてくれるが,while は自分で増やす行を書かないと止まら ない.この差が,回数の決まったくり返しで for のほうが安全な理由です.

同じ「1から5の表示」でも,両方で書けます.見くらべてみましょう.

chapter-05_code_36.py
# for で書く(回数で考える)
for kaisuu in range(1, 6):
    print(kaisuu)

# while で書く(条件で考える)
kaisuu = 1
while kaisuu <= 5:
    print(kaisuu)
    kaisuu = kaisuu + 1

どちらも 1 から 5 を表示するが,for のほうが短く,カウンタを 自分で増やす手間がありません.回数が決まっているなら forを選ぶと,書き 間違いが減り,読みやすくなります.while は「回数が決まっていないとき専用」と 考えておくとよいでしょう.

  • 回数が決まっている → for(range やリストと).

  • 回数が決まっていない(条件で終わる)→ while.

  • while は条件にかかわる変数を毎回変化させ,無限ループを防ぐ.

  • break は中断,continue は今回だけスキップ.

条件を変えながら繰り返す

知識

回数が決まった処理はfor、条件次第で続く処理はwhileが書きやすくなります。同じ結果でも終了の根拠を確認します。

i = 0
while i < 3:
    print(i)
    i = i + 1
そのまま演習条件を変えながら繰り返す

実行前に、表示される行数と各行の値を予想してください。上のコードを編集欄へ開き、変更せずに実行します。その後「出力例」を開き、予想と実行結果を比べてください。入力操作はありません。各表示行の末尾には改行があります。

出力例
0
1
2
ヒントを見る

条件を調べる、表示する、変数を更新する、という順序を繰り返して追います。最後に条件を調べるときの値も確認します。

演習の解説

0、1、2を表示し、iが3で終了します。range(3)のforと同じ表示ですが、whileでは更新を自分で書く必要があります。

虫食い条件を変えながら繰り返す

___の1か所だけを補い、上と同じ結果が出るコードにしてください。他の行は変えません。

i = 0
while i ___ 3:
    print(i)
    i = i + 1
ヒントを見る

終了の境界を含めるかを確認します。最後に表示したい値の次で条件が偽になるようにしてください。

虫食いの解説
i = 0
while i < 3:
    print(i)
    i = i + 1

空欄には < が入ります。0、1、2を表示し、iが3で終了します。range(3)のforと同じ表示ですが、whileでは更新を自分で書く必要があります。

まとめ

この章では,同じ処理を何度もくり返す繰り返し処理を学んだ.

  • for 変数 in range(回数): で,決まった回数のくり返しができます.コロンと 字下げ(半角スペース4つ)は if と同じ約束です.

  • range(N) は「0から N の手前まで」,range(A, B) は「A から B の 手前まで」.終わりの数は含まない.

  • goukei = goukei + 値 のように,くり返しの中で値をためたり数えたり できます.ためる箱は使う前に 0 にしておく.

  • while 条件: は,条件が成り立つ間くり返します.回数が分からないときに 向く.変数の更新を忘れると無限ループになるので注意します.

  • break はくり返しをうち切り,continue は今回をとばして続ける.

  • 回数が決まっていれば for,決まっていなければ while を使います.

順次・条件分岐・繰り返しの3つの基本がそろい,これでかなり多くのことがプログラムで 書けるようになりました.次の章では,この章で少しだけ使ったリストをくわしく学び, たくさんのデータをまとめてあつかえるようになろう.

合計の最終結果だけを表示する

知識

繰り返しの範囲、変数の更新、printの字下げを一緒に確認します。

goukei = 0
for i in range(1, 4):
    goukei = goukei + i
print(goukei)
そのまま演習合計の最終結果だけを表示する

実行前に、表示される行数と各行の値を予想してください。上のコードを編集欄へ開き、変更せずに実行します。その後「出力例」を開き、予想と実行結果を比べてください。入力操作はありません。各表示行の末尾には改行があります。

出力例
6
ヒントを見る

対象になる整数を順に合計へ加えます。途中の合計と、全て加えた後の合計のどちらが表示されるかを確かめてください。

演習の解説

iは1、2、3で、合計6を最後に1回だけ表示します。printを字下げすると途中の合計も表示されます。

虫食い合計の最終結果だけを表示する

___の1か所だけを補い、上と同じ結果が出るコードにしてください。他の行は変えません。

goukei = 0
for i in range(1, ___):
    goukei = goukei + i
print(goukei)
ヒントを見る

範囲の終了値は含まれません。足す値の最後と、範囲の終了指定を区別してください。

虫食いの解説
goukei = 0
for i in range(1, 4):
    goukei = goukei + i
print(goukei)

空欄には 4 が入ります。iは1、2、3で、合計6を最後に1回だけ表示します。printを字下げすると途中の合計も表示されます。

図で理解する

for の流れ
for の流れ
イテレータ
イテレータ

練習して確かめる

章末演習(10問)

ここには解答を載せていません。

  1. 章末演習章末演習 1

    0 から 2 までの整数を,小さい順に1行に1つずつ表示します。

    入力

    入力なし(input() は使わない)。

    処理条件

    • for 文と range を使い,range には引数を1つだけ渡す。
    • print はプログラム中に1回だけ書きます。print を3回並べる方法,表示する文字列をそのまま書く方法,リストを使う方法は使いません。

    出力

    • 0,1,2 をこの順に1行に1つずつ,計3行表示します。
    • 各行は数字だけとし,前後に空白を付けません。
    • 数字はすべて半角とします。指定した行以外の見出し・案内文・空行を表示しません。

    実行例

    出力:

    0
    1
    2
    
    ヒントを見る

    繰り返しの変数がどの値から始まり,どの値の手前で止まるかを先に確かめましょう。引数を1つだけ渡した range が何回繰り返すかと,そのとき変数が取る値を考えます。

  2. 章末演習章末演習 2

    キーボードから入力した名前を,同じ形で3行続けて表示します。

    入力

    • 名前を表す文字列を1行入力します。空ではなく,前後に空白を含まないものとします。
    • input() には案内文を渡さない(案内文を表示しない)。入力欄に打ち込んだ値が画面に残っても,それはプログラムの出力に数えません。

    処理条件

    • for 文と range で同じ表示を3回繰り返します。
    • print はプログラム中に1回だけ書きます。
    • 文字列の掛け算(*)や改行文字 \n の連結で3行分を一度に作る方法は使いません。
    • 繰り返し用の変数は,表示に使わなくてよいでしょう。

    出力

    • 入力した文字列をそのまま3行表示します。
    • 番号・空白・見出しは付けません。
    • 数字はすべて半角とします。指定した行以外の見出し・案内文・空行を表示しません。

    実行例

    入力:

    田中
    

    出力:

    田中
    田中
    田中
    
    ヒントを見る

    まず入力を1回だけ受け取って変数に入れます。次に,その変数を表示する文を繰り返しの中に入れます。入力を受け取る文を繰り返しの中に入れると,3回入力を求められてしまう点に注意しましょう。

  3. 章末演習章末演習 3

    1 から入力した整数 n までの整数を,小さい順に1行に1つずつ表示します。

    入力

    • 0 以上 100 以下の整数 n を1行入力します。
    • input() には案内文を渡さない(案内文を表示しない)。入力欄に打ち込んだ値が画面に残っても,それはプログラムの出力に数えません。

    処理条件

    • for 文と range を使い,range には開始の値と終了の値の2つの引数を渡す。
    • while 文やリストは使いません。
    • n が 0 のときは何も表示しない(条件分岐を書かなくても,range の性質でそうなるようにする)。

    出力

    • 1,2,…,n を1行に1つずつ,計 n 行表示します。
    • 各行は数字だけとし,前後に空白を付けません。
    • 数字はすべて半角とします。指定した行以外の見出し・案内文・空行を表示しません。

    実行例

    例1

    入力:

    3
    

    出力:

    1
    2
    3
    

    例2(n が 0 のとき)

    入力:

    0
    

    出力:

    (何も表示されない)

    ヒントを見る

    input() で受け取った値は文字列なので,range に渡す前に整数に変換します。range の終了の値はその値自身を含まないため,n まで表示するには終了の値をどうすればよいかを考えましょう。

  4. 章末演習章末演習 4

    1 から 5 までの整数を順に足していき,足すたびにその時点の合計を表示し,最後に合計を表示します。

    入力

    入力なし(input() は使わない)。

    処理条件

    • 合計を入れる変数を繰り返しの前に 0 で初期化し,for 文と range で取り出した 1〜5 を1つずつ足し込む。
    • sum() 関数,while 文,計算結果を数値で直接書く方法は使いません。

    出力

    • 全部で6行表示します。
    • 1〜5行目:その回に足した数と,足した直後の合計を,半角空白1個で区切って表示します。
    • 6行目:「合計」と最終的な合計を,半角空白1個で区切って表示します。
    • 数字はすべて半角とします。指定した行以外の見出し・案内文・空行を表示しません。

    実行例

    出力:

    1 1
    2 3
    3 6
    4 10
    5 15
    合計 15
    
    ヒントを見る

    合計の変数をどこで 0 にするか(繰り返しの前か中か)で結果が変わります。足し込む文と途中経過を表示する文は繰り返しの中に,最後の1行を表示する文は繰り返しの外に置きます。字下げの位置で中と外が決まります。

  5. 章末演習章末演習 5

    1,2,3,… と順に足していき,合計が入力した目標値 m 以上になった時点で止め,最後に足した数とそのときの合計を表示します。何回足せばよいかは前もって分からないため,条件で止まる繰り返しを使います。

    入力

    • 1 以上 10000 以下の整数 m を1行入力します。
    • input() には案内文を渡さない(案内文を表示しない)。入力欄に打ち込んだ値が画面に残っても,それはプログラムの出力に数えません。

    処理条件

    • while 文を使い,「合計が m 未満である間」繰り返します。
    • 足す数と合計の2つの変数を,繰り返しの前に初期化します。
    • for 文,break,sum() 関数,和の公式による計算は使いません。
    • 合計がちょうど m になったときも,そこで止める。

    出力

    • 2行表示します。
    • 1行目:「最後に足した数」と,その数を半角空白1個で区切って表示します。
    • 2行目:「合計」と,そのときの合計を半角空白1個で区切って表示します。
    • 数字はすべて半角とします。指定した行以外の見出し・案内文・空行を表示しません。

    実行例

    例1

    入力:

    20
    

    出力:

    最後に足した数 6
    合計 21
    

    例2(ちょうど m に達するとき)

    入力:

    15
    

    出力:

    最後に足した数 5
    合計 15
    

    例3(m が最小のとき)

    入力:

    1
    

    出力:

    最後に足した数 1
    合計 1
    
    ヒントを見る

    繰り返しの中で「次に足す数を1増やす」ことと「合計に足す」ことの順序を決めましょう。足す数の初期値をいくつにするかは,この順序で変わります。while の条件に使う合計が毎回必ず増えることも確かめます。

  6. 章末演習章末演習 6

    1 から 10 までの整数のうち,奇数の和と偶数の和をそれぞれ求めて表示します。

    入力

    入力なし(input() は使わない)。

    処理条件

    • range の3つ目の引数(増分)を使い,奇数だけを取り出す for 文と偶数だけを取り出す for 文を1つずつ,計2つ書きます。
    • if 文や % による奇数・偶数の判定,sum() 関数,計算結果を数値で直接書く方法は使いません。
    • 合計用の変数は奇数用と偶数用で別にし,それぞれ繰り返しの前に 0 で初期化します。

    出力

    • 2行表示します。
    • 1行目:「奇数の和」と奇数の和を半角空白1個で区切って表示します。
    • 2行目:「偶数の和」と偶数の和を半角空白1個で区切って表示します。
    • 数字はすべて半角とします。指定した行以外の見出し・案内文・空行を表示しません。

    実行例

    出力:

    奇数の和 25
    偶数の和 30
    
    ヒントを見る

    奇数も偶数も2ずつ増えていく並びです。それぞれ最初の値をいくつにすればよいか,10 を含めるには終了の値をどうすればよいかを考えましょう。2つの for 文は字下げせずに縦に並べます。

  7. 章末演習章末演習 7

    1 から入力した整数 n までの整数を1つずつ調べ,偶数だけを小さい順に1行に1つずつ表示します。

    入力

    • 0 以上 100 以下の整数 n を1行入力します。
    • input() には案内文を渡さない(案内文を表示しない)。入力欄に打ち込んだ値が画面に残っても,それはプログラムの出力に数えません。

    処理条件

    • for 文と range で 1 から n までの整数を1ずつ順に取り出し,繰り返しの中で if 文と %(余り)を使って偶数かどうかを判定します。
    • この問題は繰り返しと条件分岐の組合せが目的なので,range の増分を 2 にして偶数だけを取り出す方法や,リストの内包表記は使いません。
    • n が 2 未満のときは何も表示しません。

    出力

    • n 以下の正の偶数を小さい順に1行に1つずつ表示します。
    • 各行は数字だけとし,前後に空白を付けません。
    • 数字はすべて半角とします。指定した行以外の見出し・案内文・空行を表示しません。

    実行例

    例1

    入力:

    6
    

    出力:

    2
    4
    6
    

    例2(n が奇数のとき)

    入力:

    7
    

    出力:

    2
    4
    6
    

    例3(n が 2 未満のとき)

    入力:

    1
    

    出力:

    (何も表示されない)

    ヒントを見る

    偶数とは 2 で割った余りが 0 になる数です。if 文は for 文の中に入るので1段,print は if 文の中に入るのでさらに1段字下げします。字下げの段数で,どの文がどの条件のもとで実行されるかが決まります。

  8. 章末演習章末演習 8

    入力した段の九九を,かける数 1 から 9 まで順に9行で表示します。

    入力

    • 九九の段を表す 1 以上 9 以下の整数を1行入力します。
    • input() には案内文を渡さない(案内文を表示しない)。入力欄に打ち込んだ値が画面に残っても,それはプログラムの出力に数えません。

    処理条件

    • for 文と range を使い,かける数を 1 から 9 まで1ずつ変えながら積を計算します。
    • print を9回並べる方法や,積を数値で直接書く方法は使いません。

    出力

    • 9行表示します。各行は「段 x かける数 = 積」の形とします。
    • x は半角小文字のエックス,= は半角とし,段・x・かける数・=・積の各要素の間に半角空白を1個ずつ入れます。
    • 数字はすべて半角とします。指定した行以外の見出し・案内文・空行を表示しません。

    実行例

    入力:

    7
    

    出力:

    7 x 1 = 7
    7 x 2 = 14
    7 x 3 = 21
    7 x 4 = 28
    7 x 5 = 35
    7 x 6 = 42
    7 x 7 = 49
    7 x 8 = 56
    7 x 9 = 63
    
    ヒントを見る

    繰り返しで変わるのはかける数だけで,段は入力した値のままです。range の終了の値は含まれないので,9 まで繰り返すには終了の値をいくつにするかを確かめましょう。print にカンマで区切って複数の値を渡すと,間に半角空白が1個入ります。

  9. 章末演習章末演習 9

    2 から入力した整数 N までの偶数について,その個数と合計を求めて表示します。N は偶数とは限りません。

    入力

    • 1 以上 10000 以下の整数 N を1行入力します。N は奇数でもよいでしょう。
    • input() には案内文を渡さない(案内文を表示しない)。入力欄に打ち込んだ値が画面に残っても,それはプログラムの出力に数えません。

    処理条件

    • for 文と,3つの引数(開始・終了・増分)を渡した range で,2 から N 以下までの偶数だけを取り出します。
    • 個数を数える変数と合計を入れる変数を,それぞれ繰り返しの前に 0 で初期化し,繰り返しの中で更新します。
    • if 文による判定,sum()・len() 関数,公式による計算は使いません。
    • N が 1 のときは偶数が1つもないので,個数も合計も 0 とします。

    出力

    • 2行表示します。
    • 1行目:「個数は」と個数を半角空白1個で区切って表示します。
    • 2行目:「合計は」と合計を半角空白1個で区切って表示します。
    • 数字はすべて半角とします。指定した行以外の見出し・案内文・空行を表示しません。

    実行例

    例1

    入力:

    100
    

    出力:

    個数は 50
    合計は 2550
    

    例2(N が奇数のとき)

    入力:

    7
    

    出力:

    個数は 3
    合計は 12
    

    例3(偶数が1つもないとき)

    入力:

    1
    

    出力:

    個数は 0
    合計は 0
    
    ヒントを見る

    まず,取り出したい偶数の並びの最初の値・増分・終わりを確かめます。N 自身が偶数のときに N も含まれるか,N が奇数のときに N を超える偶数が混ざらないかを,小さい N で確かめましょう。個数は繰り返しのたびに 1 ずつ,合計は取り出した値ずつ増やします。

  10. 章末演習章末演習 10

    1本120円のジュースを,所持金が続くかぎり1本ずつ買い続ける。買うたびに残金を表示し,最後に買えた本数と残金を表示します。

    入力

    • 所持金(円)を表す 0 以上 10000 以下の整数を1行入力します。
    • input() には案内文を渡さない(案内文を表示しない)。入力欄に打ち込んだ値が画面に残っても,それはプログラムの出力に数えません。

    処理条件

    • while 文を使い,「残金が 120 以上である間」1本ずつ買う処理を繰り返します。
    • 1本買うごとに,残金を 120 減らし,本数を 1 増やし,残金を表示します。
    • for 文や,割り算(//,%)で本数を一度に計算する方法は使いません。
    • 所持金が 120 未満のときは1本も買えないので,「のこり」の行は表示せず,最後の2行だけを表示します。

    出力

    • 1本買うごとに「のこり」と買った直後の残金を半角空白1個で区切って1行表示します。
    • 繰り返しの後に,「買えた本数は」と本数,「残金は」と残金を,それぞれ半角空白1個で区切って1行ずつ表示します。
    • 数字はすべて半角とします。指定した行以外の見出し・案内文・空行を表示しません。

    実行例

    例1

    入力:

    500
    

    出力:

    のこり 380
    のこり 260
    のこり 140
    のこり 20
    買えた本数は 4
    残金は 20
    

    例2(ちょうど使い切るとき)

    入力:

    120
    

    出力:

    のこり 0
    買えた本数は 1
    残金は 0
    

    例3(1本も買えないとき)

    入力:

    100
    

    出力:

    買えた本数は 0
    残金は 100
    
    ヒントを見る

    while の条件に使う残金は,繰り返しの中で必ず減らします。減らさないと繰り返しが止まりません。本数を数える変数は繰り返しの前に初期化し,最後の2行を表示する文は繰り返しの外に置きます。ちょうど 120 円残っているときに買えるかどうかを,条件の不等号で確かめましょう。