繰り返し処理
「1から10まで声に出して数える」「同じ体操を5回くり返す」「名簿を上から順に 読み上げる」.わたしたちの日常には,同じことを何度もくり返す場面が たくさんあります.同じことなら1回書けば十分で,わざわざ10回も書きたくはありません. コンピュータがいちばん得意とするのも,この「決まったことを,文句も言わず, 正確に何度もくり返す」作業です.
第1章で見たプログラミングの3つの基本(順次・条件分岐・繰り返し)のうち,この章で 学ぶのは最後の繰り返し(ループ)です.Python には繰り返しの ための命令が2つあります.for と while です.回数が決まっているときは for,決まっていないときは while,と使い分ける.順番に見て いこう.
同じことを何回もくり返す:for と range
たとえば「 print("こんにちは") を3回実行したい」とします.素直に書くと こうなります.
print("こんにちは")
print("こんにちは")
print("こんにちは")3回ならまだ書けるが,これが100回だったらどうだろう.同じ行を100回もコピーするのは 大変であるし,見間違いやすく,後から「101回にしたい」と思っても直すのがひと 苦労です.こんなときに使うのが for(フォー)です.
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つ)でそろえます.
取り出した値を使ってみる
変数 kaisuu には,くり返すたびに 0, 1, 2 と順に値が入っています.これを 表示に使うと,くり返しのたびに中身が変わる様子がよく分かります.
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 は,始まりの数と 終わりの数を指定することもできます.
# 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の段を表示してみましょう.
# 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)を 表示したい」というときに使います.
# 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を足し,…と順に足していけば,最後に全部の 合計がたまっています.
# 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 がどう変わるかを,すべて書き出してみましょう.
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点以上)の人数」を数えてみましょう.
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週間の最高気温の記録から「いちばん暑かった 日の気温」を求めてみましょう.考え方は,スポーツの記録会でこれまでの最高記録を 紙に書いておき,それを上回ったら書き直すのに似ています.
# 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(ホワイル)です.
# 貯金が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 には,for にはないこわさがあります.条件が ずっと成り立ったままだと,くり返しが永遠に終わらないのです. これを無限ループといいます.
chokin = 0
while chokin < 1000: # この条件が永遠に成り立つ!
print("貯金中…") # chokin を増やし忘れているこの例では,ブロックの中で chokin を増やしていません.だから chokin は ずっと 0 のまま,0 < 1000 はいつまでも成り立ち,「貯金中…」が画面に 出つづけて止まらなくなります.
while を書くときは,「くり返すたびに,条件にかかわる変数がゴールに 近づいているか」を必ず確認しましょう.さきほどの正しい例では,毎回 chokin を 100円ずつ増やしていたので,いつか1000円に届いて止まった.もしプログラムが止まら なくなったら,あわてずCtrl+C(コントロールキーを押しながらC)で強制的に 止められます.
while を1周ずつ追いかける
while は「条件をチェックする → 中身を実行する → また条件をチェックする」をくり返します.この条件チェックの場所を意識すると, いつ止まるかが分かります.カウンタ(数える変数)を自分で増やす例で,1周ずつ追って みましょう.
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 成り立たない しない(抜ける) 4kaisuu が 4 になった時点で条件 4 <= 3 が成り立たなく なり,中身を実行せずにくり返しを抜けて「おわり」が表示されます.条件は,中身を 実行する前に毎回チェックされることに注目してください.もし kaisuu = kaisuu + 1 の1行を書き忘れると,kaisuu はずっと 1 のままで条件が永遠に成り立ち, 前ページの無限ループになってしまう.
減らしながらくり返す:残りを追いかける
while のカウンタは,増やすだけでなく減らす使い方もよくします. たとえば「持っているお金で,1個120円のパンを買えるだけ買う」場面を考えよう. これは「お金が足りている間くり返す」という,回数の決まっていないくり返しです.
# 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 4nokori が 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点未満)が出たらそこで 調べるのをやめる」場合です.
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だけは飛ばして 表示する」ときです.
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の表示」でも,両方で書けます.見くらべてみましょう.
# 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を字下げすると途中の合計も表示されます。
図で理解する
練習して確かめる
章末演習(10問)
ここには解答を載せていません。
- 章末演習章末演習 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
キーボードから入力した名前を,同じ形で3行続けて表示します。
入力
- 名前を表す文字列を1行入力します。空ではなく,前後に空白を含まないものとします。
input()には案内文を渡さない(案内文を表示しない)。入力欄に打ち込んだ値が画面に残っても,それはプログラムの出力に数えません。
処理条件
for文とrangeで同じ表示を3回繰り返します。printはプログラム中に1回だけ書きます。- 文字列の掛け算(
*)や改行文字\nの連結で3行分を一度に作る方法は使いません。 - 繰り返し用の変数は,表示に使わなくてよいでしょう。
出力
- 入力した文字列をそのまま3行表示します。
- 番号・空白・見出しは付けません。
- 数字はすべて半角とします。指定した行以外の見出し・案内文・空行を表示しません。
実行例
入力:
田中出力:
田中 田中 田中ヒントを見る
まず入力を1回だけ受け取って変数に入れます。次に,その変数を表示する文を繰り返しの中に入れます。入力を受け取る文を繰り返しの中に入れると,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
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行を表示する文は繰り返しの外に置きます。字下げの位置で中と外が決まります。
- 合計を入れる変数を繰り返しの前に 0 で初期化し,
- 章末演習章末演習 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
1 から 10 までの整数のうち,奇数の和と偶数の和をそれぞれ求めて表示します。
入力
入力なし(
input()は使わない)。処理条件
rangeの3つ目の引数(増分)を使い,奇数だけを取り出すfor文と偶数だけを取り出すfor文を1つずつ,計2つ書きます。if文や%による奇数・偶数の判定,sum()関数,計算結果を数値で直接書く方法は使いません。- 合計用の変数は奇数用と偶数用で別にし,それぞれ繰り返しの前に 0 で初期化します。
出力
- 2行表示します。
- 1行目:「奇数の和」と奇数の和を半角空白1個で区切って表示します。
- 2行目:「偶数の和」と偶数の和を半角空白1個で区切って表示します。
- 数字はすべて半角とします。指定した行以外の見出し・案内文・空行を表示しません。
実行例
出力:
奇数の和 25 偶数の和 30ヒントを見る
奇数も偶数も2ずつ増えていく並びです。それぞれ最初の値をいくつにすればよいか,10 を含めるには終了の値をどうすればよいかを考えましょう。2つの for 文は字下げせずに縦に並べます。
- 章末演習章末演習 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
入力した段の九九を,かける数 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
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
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 円残っているときに買えるかどうかを,条件の不等号で確かめましょう。