for文とrange()で、同じ処理をくり返すやり方- くり返しで合計を積み上げる定番パターン
- ループの中にループを入れる「二重ループ」
- 条件が成り立つ間くり返す
while文
STEP 1くり返す ― for文とrange()
「こんにちは、と5回表示する」を、printを5行書かずに済ませるのが繰り返し構造です。for i in range(1, 6): と書くと、変数 i が1、2、3、4、5と変わりながら、字下げした行が5回くり返されます。range(1, 6) の6は「6の手前まで」という意味で、6自身は含まれないことに注意してください。
実行して、字下げした行が5回、「おわり」が1回だけ表示されることを確かめましょう。そのあと range(1, 6) を range(1, 11) に変えると何回になるかも予想してから試しましょう。
確認ポイントを見る(実行してから開くこと)
range(1, 6) で5回、range(1, 11) で10回です。「終わりの数の手前まで」——この感覚は共通テストの空欄補充で何度も問われます。
例題 1
1から10までの整数を表示します。今度はfor文の1行を自分で書いて完成させましょう。書けたら、range() の数を変えて1から100にもしてみましょう。
解答例を見る(まず自分で書いてから開くこと)
for i in range(1, 11): print(i)10まで表示したいので、終わりは「10の1つ先」の11です。
くり返す行の中に i が出てこなくても、字下げした行は回数分くり返されます。実行して確かめ、回数や文字も変えてみましょう。
確認ポイントを見る(実行してから開くこと)
i は1〜5と変わっていますが、使わなくてもかまいません。「for文は回数を数える係、中の行はやることを書く係」と分けて考えると、次の問題が書きやすくなります。
「ドン!」がちょうど3回表示されるように、for文の行を書き加えなさい。
解答例を見る(まず自分で書いてから開くこと)
for i in range(1, 4):
print('ドン!')
range(1, 4) で1、2、3の3回です。range(0, 3) や range(3) でも3回になります(いろいろな書き方でクリアできます)。printの中にiが出なくても繰り返しは実行されています。最初は違和感がありますが慣れていきましょう。STEP 2積み上げる ― 合計の定番パターン
くり返しの最大の使いどころが「合計を積み上げる」ことです。第1章で学んだ goukei = goukei + i(自己代入)をforの中に入れると、1周ごとに goukei に値が足しこまれていきます。値の変化を表で追うと、こうなります。
| 周 | i | goukei = goukei + i の結果 |
|---|---|---|
| 1周目 | 1 | 0 + 1 → 1 |
| 2周目 | 2 | 1 + 2 → 3 |
| 3周目 | 3 | 3 + 3 → 6 |
| 4周目 | 4 | 6 + 4 → 10 |
| 5周目 | 5 | 10 + 5 → 15 |
上の表とまったく同じ変化が起きることを、実行して確かめましょう。
例題 2
1から100までの整数を全部足すプログラムです。printがforの外にある(最後に1回だけ表示する)ことに注目してください。
1から10までの合計(55)が表示されるように、積み上げの行を書き加えなさい。字下げは半角スペースを2ついれます。字下げを忘れないように気をつけてください。
解答例を見る(まず自分で書いてから開くこと)
goukei = 0
for i in range(1, 11):
goukei = goukei + i
print('1から10までの合計は', goukei)
積み上げの1行が書ければ、共通テストの集計問題は安心してください。STEP 3ループの中のループ ― 二重ループ
forの中にもう1つforを入れることもできます。内側のループが一周りしてから、外側が1歩進む——時計の長針と短針のような動きです。
実行する前に、表示される6行の順番を予想してみましょう。「1と1、1と2、1と3、2と1…」でしょうか?それとも「1と1、2と1…」でしょうか?
確認ポイントを見る(実行してから開くこと)
j が先に1→2→3と回りきってから、外側の i が2に進みます。この「内側が先に回りきる」順番を理解して、共通テストの二重ループ問題を攻略しましょう!例題 3
九九の1〜3の段を表示するプログラムです。end=' ' は「改行のかわりに空白をはさむ」という指定で、1つの段を1行にまとめています。end=' ' は必ずprintのカッコの中に書きます(外に出すと、ただの変数になってしまいます)。最後の行の何も入っていない print() は、段の終わりで改行だけをする係です。
end=' ' はキーワード引数といいます。今回は end=' ' を改行を起こさないために使っています。共通テストにはでてこないので、安心してください。
1組から2組まで、それぞれ1番から3番までの出席番号が表示されるように、内側のfor文の行を書き加えなさい。
解答例を見る(まず自分で書いてから開くこと)
for i in range(1, 3):
for j in range(1, 4):
print(i, '組', j, '番')
内側のfor文は、外側より一段深く字下げします。上にある図2と見比べてみてください。
STEP 4条件が成り立つ間くり返す ― while文
「10回」のように回数が決まっているならforが便利ですが、「〜である間ずっと」のように回数がわからないくり返しには while 条件: を使います。whileには3点大切なポイントがあります——①始める前の準備(初期化)、②続ける条件、③1周ごとの更新。とくに③を忘れると、条件がずっと成り立ったままの無限ループになってしまいます。
図3のプログラムそのものです。num が6になった瞬間に条件が成り立たなくなり、ループを抜けることを確かめましょう。
例題 4
例題2(1〜10の合計)とまったく同じ仕事を、whileで書いたものです。forでは自動だった「iを増やす」を、自分の手で書いている点を見比べてください。
10からのカウントダウンが表示されるように、③更新の行を書き加えなさい。忘れると無限ループになりますが、このサイトでは自動で止まるので、恐れず失敗してみてください。
解答例を見る(まず自分で書いてから開くこと)
num = 10
while num >= 1:
print(num)
num = num - 1
print('発射!')
num = num - 1 が③更新です。試しにこの行を消して実行すると、無限ループを実行環境が検出して止めてくれます。エラー例1でくわしく見ます。
エラー例 ― よくあるエラーを知ろう!
くり返しの章では、エラーメッセージが出るまちがいに加えて、エラーは出ないのに結果がおかしい「バグ」にも出会います。どちらも体験しておきましょう。
エラー例 1 無限ループ(更新のし忘れ)
whileの3点セットのうち、③更新の行がありません。実行するとどうなるか、安心して試してください(このサイトの実行環境では自動で止まります)。
エラーの読み方を見る(実行してから開くこと)
RuntimeError: 実行が止まらないため中断しました と表示されます。num がずっと1のままなので、条件 num <= 5 が永遠に成り立ち続けるのが原因です。ループの中に num = num + 1 を足せば直ります。本物のパソコンでは自動では止まらないので、whileを書くときは必ず③更新を確かめる癖をつけましょう。
エラー例 2 エラーが出ないまちがい ― rangeの端
「1から10まで表示するつもり」で書いたプログラムです。実行してみると……?
まちがいの正体を見る(実行してから開くこと)
range(1, 10) は「10の手前まで」なので、10まで表示したければ range(1, 11) です。この「1つずれ」は、プロでもやらかす世界一有名なバグです。
演習問題
1〜100の整数をすべて表示するプログラムを完成させなさい。
解答例を見る(まず自分で書いてから開くこと)
for i in range(1, 101): print(i)終わりの数が101(100の1つ先)になっていれば正解です。余裕があれば、while文でも挑戦してみてください。
3の倍数を 3 + 6 + 9 + … + 30 と足し合わせた値を、while文を用いて求めなさい。ヒント:3ずつ増える変数を用意して、30以下の間くり返します。
解答例を見る(まず自分で書いてから開くこと)
goukei = 0
num = 3
while num <= 30:
goukei = goukei + num
num = num + 3
print('合計は', goukei)
更新が + 3 になるのがポイントです。「3ずつ進む」ようなくり返しは、forよりwhileの方が素直に書けることがあります。
九九の表(1の段から9の段まで)を表示するプログラムを自分で考えて作りなさい。例題3が大きなヒントです。
解答例を見る(まず自分で書いてから開くこと)
for i in range(1, 10):
for j in range(1, 10):
print(i, '×', j, '=', i * j, end=' ')
print()
例題3の range(1, 4) を range(1, 10) に広げるだけで、81マスの表が完成します。くり返しの威力を実感できる問題です。
10万円を年利5%で預けると、毎年残高が1.05倍になります。残高がはじめて20万円を超えるのは何年後かを、while文で求めなさい。(これは共通テストのサンプル問題に出た「複利計算」と同じ考え方の問題です)
解答例を見る(まず自分で書いてから開くこと)
zandaka = 100000 nensu = 0 while zandaka <= 200000: zandaka = zandaka * 1.05 nensu = nensu + 1 print(nensu, '年後にはじめて20万円を超える')「何回で条件を満たすかわからない」というのが、まさにwhileの出番です。2021年のサンプル問題は、これと同じ構造の貯金プログラムでした。
自由実行スペース
思いついたことを自由に試すための場所です。大きな数の合計や、模様の表示(print('★' * i) も面白いですよ)に挑戦してみましょう。
range(1, 11) と一緒になるんだ。whileは「(条件)の間繰り返す:」。この「端のちがい」だけは、注意が必要だ!