
武蔵野個別指導塾の特徴
高校情報I 回数を決めた反復—開始と終了の境界から実行する値を並べる|武蔵野個別指導塾

棚番号を並べ、終点と刻み、0回の条件から考える回数を決めた反復です。
よくあるのは、高校生が棚番号を順に表示するとき、終了値も実行すると思い込む場面です。棚3から棚7までを指定したつもりで range(3, 7) と書くと、棚7が抜けます。数を1つ直す前に、どの値が変数へ渡され、何回本体が動くのかを並べてみましょう。
棚番号を出す前に決めること
問われ方には、コードから表示される値と回数を求める型、指定された棚番号を表示するコードを書く型、実行結果の不足を直す型があります。いずれも、最初の値、最後に必要な値、増減の幅、表示順を条件として読み取ります。番号を何番から振るかは場面の決め方であり、Pythonが棚の先頭を決めるわけではありません。
例えば「棚3から棚7まで1ずつ、各番号を1行に1個表示」と決めれば、期待する値は3、4、5、6、7で、行数は5です。ここでは番号そのものを表示し、番号を配列の添字には使いません。同じ番号を複数回表示する指定もありません。実際の施設にある棚数を表したものではなく、検証用に決めた条件です。
回数を数える対象にも名前を付けます。本体回数は、字下げされた処理を実行した回数です。判定回数を求める場合は、この説明では「次の候補を取り出せるか調べた回数」と定義し、最後に候補がないと確認した1回も数えます。これは処理の説明用の数え方であり、Pythonの内部で比較命令が何回走るかを表すものではありません。コードに if がある場合、その条件を評価した回数とも別です。
rangeが渡す値と止まる境界
for 変数 in range(開始, 終了, 刻み): は、決まった順序の整数を変数へ1つずつ渡し、そのたびに字下げされた本体を実行します。図1のように、開始から刻みを加えた値を順に見て、正の刻みなら終了より小さい値を渡します。終了そのものは渡しません。候補が終了を超えても渡しません。

図1では開始3、終了8、刻み1です。3から7までが本体に渡され、次の候補8は境界に達するため渡されません。終了が最後に表示する棚番号ではなく、そこで止めるための境界である点が重要です。例えば棚7を含めるなら、刻み1では8を終了値にします。
刻みが正のときは、開始が終了以上なら最初から渡せる値がなく、0回です。刻みが負のときは逆に、開始から刻みを加えて減らし、終了より大きい値を渡します。開始が終了以下なら0回です。刻み0は進む方向が決まらず、range は ValueError を出します。終了までの差が刻みで割り切れなくても、境界に達する前の候補までで止まります。
range(終了) は開始0、刻み1の省略形です。range(開始, 終了) は刻み1の省略形です。いずれも整数を使います。小数や文字列をそのまま渡すと TypeError になります。終了値を含まない規則と、開始値や刻みを省略したときの既定値を分けて覚えると、読み違えを見つけやすくなります。
基本例題:棚3から棚7までを表示する
棚3から棚7まで、1ずつ昇順に番号を1行に1個表示し、最後に表示件数を 件数 5 のように1行で表示します。入力はコードに埋め込んだ整数3と8です。表示が0件なら件数0とします。手で並べると3、4、5、6、7の5個なので、これが実行前の期待値です。
count = 0
for shelf in range(3, 8):
print(shelf)
count = count + 1
print("件数", count)
1行目は表示前の件数を0にします。2行目は3から8の手前までを用意し、候補を shelf に渡します。3行目はその番号を表示し、4行目は表示できた件数を1増やします。5行目は字下げがないので、反復の終了後に1回だけ件数を表示します。Python 3.14.8での実際の出力は、期待どおり次の6行です。
3
4
5
6
7
件数 5
各回の実行直後を表にすると、件数と表示済みの棚の対応を確かめられます。図2は同じ状態を示しています。
回 shelf 表示後のcount
1 3 1
2 4 2
3 5 3
4 6 4
5 7 5

図2の最後の棚は7で、条件の棚7までを満たします。8は棚として表示されていません。説明用の判定は、3から7を取り出す5回と、次がないと確かめる1回で6回です。本体は5回です。最後の1回は本体に入らないため、判定の数と表示行の数を同じものと扱えません。
正しさは、例が動いたこととは別に考えます。開始前に count は0で、表示済みの棚はありません。各回の後には、開始3からその回の番号までが順に表示され、count は表示済みの個数と等しい状態が保たれます。次の値を表示したら件数も1増やすため、この対応が次の回でも保たれます。候補は1ずつ増え、有限の境界8に達するので終了します。終了時には3以上8未満の整数が順に表示され、件数はその個数です。これは決めた範囲についての説明であり、入力条件を変える場合はその条件に戻って確かめます。
標準例題:一定の間隔で棚を選ぶ
棚4から棚14までの範囲で、棚4を最初とし、3ずつ進んだ番号を1行に1個表示します。棚14が間隔に合わなければ表示しません。表示の最後に件数を1行で出します。手で候補をたどると4、7、10、13、次は16です。16は範囲の外なので期待値は4行と 件数 4 です。
count = 0
for shelf in range(4, 15, 3):
print(shelf)
count = count + 1
print("件数", count)
1行目で件数を初期化し、2行目で開始4、境界15、刻み3を指定します。境界を15にするのは、棚14までを許すためです。3行目で候補を表示し、4行目で件数を増やし、最後に合計を表示します。Python 3.14.8の実際の出力は4、7、10、13が各1行、最後が 件数 4 でした。図2の棚とは別の入力です。
出力を元の条件へ戻すと、各番号は4以上14以下で、隣同士の差は3です。13の次の候補16は14を超えるので、範囲内に表示し損ねた候補はありません。14が終点の直前にあっても、刻みの列に現れなければ表示されません。「終点の手前の整数は必ず出る」と覚えると、刻みが1以外のときに誤ります。
この例で本体は4回です。取り出しの成否を数える説明用の判定は、4回成功し最後に1回失敗するので5回です。反復の途中で break や例外が起きる場合には、この数え方はそのまま当てはまりません。ここでは途中で止める命令のない処理に限定しています。
発展例題:逆順と0回を分ける
棚12から棚5までの範囲を、12を最初として2ずつ減らして表示します。棚5が刻みに合わなければ表示せず、件数も出します。期待する番号は12、10、8、6です。次の4は5より小さいため対象外です。
count = 0
for shelf in range(12, 4, -2):
print(shelf)
count = count + 1
print("件数", count)
Python 3.14.8で実行した出力は、12、10、8、6が各1行と 件数 4 です。初期化、表示、件数の更新、終了後の表示は基本例と同じ役割です。2行目では終了4を含まず、4より大きい候補を渡します。正の刻みのときと逆向きに境界を考えるため、4は表示されません。出力を条件に戻すと、各棚は5以上12以下で、差は2です。次の候補4は範囲外なので、必要な棚を最後まで表示しています。
同じ仕組みは0回にも対応します。例えば開始5、終了5、刻み1の range(5, 5) は空です。range(5, 10, -2) も、減る方向に進みながら10より大きい値を渡す条件を最初から満たさず空です。どちらも本体は0回、説明用の取り出し判定は最初の失敗1回です。初期化が本体の外にあれば、件数は0のまま終了後に表示できます。逆に初期化を本体の中に置けば、0回の場合に変数が用意されない書き方になりえます。
有限回で終わる理由は、刻みが0でない整数で、候補が一定方向へ進み、有限の終了境界を越えるからです。Pythonの range はその有限の列を表します。減らす指定なのに終了を大きくしても、無限に減り続けるわけではなく、最初から空になります。
棚6が消えた誤答を直す
棚2から棚6までを1ずつ、各1行で表示する条件を考えます。次の誤ったコードは、終了値6も表示されると考えて書いたものです。
for shelf in range(2, 6):
print(shelf)
Python 3.14.8での実際の出力は2、3、4、5の4行です。手で並べた期待値2、3、4、5、6の5行と比べると棚6が不足しています。2行目は受け取った値を表示していますが、1行目の列に6が入っていないため、表示処理を何度見直しても6は現れません。
for shelf in range(2, 7):
print(shelf)
修正後は終了境界を7にします。Python 3.14.8で再実行すると2、3、4、5、6の5行でした。1行目が2以上7未満の整数を順に渡し、2行目が各番号を表示します。図3のように誤答では6が境界ですが、修正後は6が範囲内、7が境界です。どちらも棚の順番は増加し、最後に取り出せる値の次で終了します。

図3の修正結果を元の条件へ戻すと、棚2と棚6の両端を含み、間の3、4、5もそれぞれ1回あります。棚7は表示されません。誤答の表示行を1行追加して帳尻を合わせるより、列の境界を直せば、棚が変わったときにも同じ規則で追えます。
なお range(2, 7, 0) は棚を1つも表示せず、範囲を作る時点で ValueError になります。これは正しい0回の範囲とは異なります。また range("2", 7) は文字列を整数として受け取らず TypeError です。外部入力を扱う場合は整数への変換と、刻みが0でないことの確認を、範囲を作る前に行います。外部装置からの読取り失敗や時間切れが起きたときは、その失敗を知らせ、空の棚一覧として成功扱いしない設計にします。装置の接続や例外処理の詳しい実装はここでは扱いません。
練習:候補を先に書き出す
次の5問はそれぞれ独立しています。棚番号以外にも、順番に番号を扱う場面で考えます。出力値は表示順に列挙し、本体回数は整数で答えてください。判定回数は、途中で中断しないときの取り出し成功と最後の失敗の合計です。いずれも整数の範囲で、各値を1回ずつ処理します。
- 通路の目印1から8までで、1を最初として2ずつ進みます。
range(1, 9, 2)で本体に渡る番号、回数、判定回数を答えてください。 - 整理箱10から4までで、10を最初として3ずつ減らします。
range(10, 3, -3)の番号、回数、判定回数を答えてください。 - 開始6、終了6、刻み1の
range(6, 6)で本体に渡る番号、回数、判定回数を答えてください。番号がなければ空と書きます。 - カード番号2から11までで、2を最初として4ずつ進みます。
range(2, 12, 4)の番号、回数、判定回数を答えてください。 - 部屋番号8から3までで、8を最初として2ずつ減らします。終点を含まない
rangeの3引数と、渡る番号、回数、判定回数を答えてください。
練習の答えと条件への照合
- 1、3、5、7、本体4回、判定5回です。次の候補9は終了9に等しいので渡しません。目印はいずれも1以上8以下で、隣の差が2です。
- 10、7、4、本体3回、判定4回です。次の1は終了3以下です。各箱は4以上10以下で、指定された3ずつの減少を満たします。
- 番号は空、本体0回、判定1回です。最初の候補6は終了6未満ではないので処理しません。開始と終了が同じでも、1回は実行されるとは限りません。
- 2、6、10、本体3回、判定4回です。次の14は終了12以上です。2以上11以下にある指定間隔の番号は、この3個です。
range(8, 2, -2)、8、6、4、本体3回、判定4回です。次の2は境界なので渡しません。3以上8以下で、8から2ずつ減らす条件に戻しても同じ3個です。終了を3にしても今回は同じ列になりますが、終点3を含む範囲を表す境界として2を選んでいます。
Python 3.14.8で各 range を一覧にした実際の出力は、順に [1, 3, 5, 7]、[10, 7, 4]、[]、[2, 6, 10]、[8, 6, 4] です。手で次の候補を足して境界を確認した結果と一致します。この照合は5つの入力の検証であり、任意の整数についての証明そのものではありません。
手元に残す要点
- 開始値から刻みを加え、終了値そのものを含めずに候補を渡します。
- 正の刻みでは終了未満、負の刻みでは終了より大きい値が対象です。
- 方向と境界によっては本体が0回になり、刻み0はエラーです。
- 本体回数と、最後の失敗を含む取り出し判定回数を区別します。
説明が止まった箇所を見つける
最後の番号を誤るときは、終了値を丸で囲み、最初の候補から次の候補まで実際に書き出してみます。開始値を誤るときは、range(終了) と2引数の形を別々に読み、どの引数が省略されたかを口に出します。回数が合わない場合は、表示行と件数の更新が同じ字下げの中にあるかを処理表で確かめます。
個別指導では、まず本人に「次の候補が境界と同じなら本体に入るか」を説明してもらい、続いて正の刻み、負の刻み、0回の例を各1つずつ手で追います。答えが合っていても、最後の失敗を本体に数えていないか、終了後の処理を反復の中に入れていないかを表の列で確認します。棚の列と終了境界を分けて読めば、反復の回数は自分で検証できます。
読んで終わりにするか、ここから変えるか。
武蔵境駅徒歩30秒、講師1人に生徒1人の完全1対1。授業のあいだ、先生は隣を離れません。いまの詰まりを、無料相談でそのまま話してください。
まず15分だけ電話で話したい方は、無料電話相談(15分)から。塾からお電話を差し上げます。
本気になった日が、入塾の日。
お子様の教育、迷ったら「丸投げ」してください。必ず、期待以上の結果で返します。武蔵野で育む、武蔵境で学ぶ。
電話は年中無休。365日、24時間、お電話可能。



