for 文で 1 から n までの合計を求める
このレッスンで分かること
for i in range(1, n + 1):で 1 から n までの整数を順番に取り出せます- 合計を貯める変数 (アキュムレータ) は
0で初期化し、ループ内でtotal += iで足し込みます- 最小コードは
def sum_to(n):\n total = 0\n for i in range(1, n + 1):\n total += i\n return total
for 文で 1 から n までの合計を求める とは
for 文と range を組み合わせて、1 から n までの整数の合計を求める基本パターンを学ぶ。本レッスンでは、for 文で 1 から n までの合計を求める の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
for 文で 1 から n までの合計を求める
同じ処理を何度も繰り返すときに使うのが for 文です。Python の for は他の言語のような「カウンタ変数を増やす」スタイルではなく、イテラブル (反復可能なオブジェクト) の要素を順番に取り出すスタイルが基本です。本レッスンでは、整数の合計を求める典型例を題材に、for と range の使い方をじっくり読み解いていきます。最初の繰り返し処理ですから、書き方だけでなく、頭の中で値がどう変わっていくかも意識しながら進めましょう。
for 文は「繰り返し」というより「順番に取り出す」と考えると、Python らしい使い方ができます。
for 文と range のしくみ
for 変数 in イテラブル: という構文で、イテラブル の要素を 1 つずつ 変数 に入れながら、インデントされたブロックを実行します。range(start, stop) は start 以上 stop 未満の整数列を遅延生成するオブジェクトで、for と組み合わせるのが定番です。range は本物のリストではなく、必要なときに値を 1 つずつ生み出す仕組みなので、range(1, 1000000) のように大きな範囲でもメモリをほとんど使いません。
Python
for i in range(1, 6):
print(i)
# 1, 2, 3, 4, 5 が順に出力される上のコードでは range(1, 6) が 1, 2, 3, 4, 5 を返すので、変数 i にそれぞれの値が入り、print が 5 回呼ばれます。range の stop は 含まれない ことに注意してください。range(6) のように引数を 1 つだけ渡すと 0, 1, 2, 3, 4, 5 のように 0 始まりになります。for ループは Python ではリスト・文字列・辞書など、ほとんどあらゆるコレクションに対して使えます。
| 書き方 | 生成される値 | よく使う場面 |
|---|---|---|
range(5) | 0, 1, 2, 3, 4 | 0 始まりの繰り返し |
range(1, 6) | 1, 2, 3, 4, 5 | 1 から 5 までの累積 |
range(1, n + 1) | 1, 2, ..., n | 1 から n までの合計 |
range(0, 10, 2) | 0, 2, 4, 6, 8 | step を指定して飛ばす |
range(1, n + 1)と書けば 1 から n まで (n を含む) の整数列になります。
合計を貯める変数 (アキュムレータ)
合計を計算する典型パターンは、合計を貯めるための変数 (慣習的に total や sum_ などの名前) を 0 で初期化し、ループの中で total += i のように足し込んでいく形です。これは「アキュムレータ」と呼ばれます。アキュムレータは平均・最大値・カウントなど、いろいろな集計処理の基礎になる重要な発想です。
Python
def sum_to(n):
total = 0
for i in range(1, n + 1):
total += i
return totalこの関数は n = 5 のとき 1 + 2 + 3 + 4 + 5 = 15 を返します。total += i は total = total + i の省略形で、毎回新しい値で total を上書きしているわけです。アキュムレータの初期値は処理によって変わります。合計なら 0、積なら 1、リストなら [] のように、計算上「単位元」と呼ばれる値を選びます。
Python の組み込みには
sum(range(1, n + 1))もありますが、本レッスンではforの挙動を理解するために自力で書きます。
動きを追ってみる
n = 4 のときの動きを順番に追うと、内部状態の遷移は次の通りです。
n = 4 のときの total と i の状態を表でまとめると、次の通りです。
| ステップ | i の値 | total の値 |
|---|---|---|
| 初期化 | - | 0 |
| 1 周目 | 1 | 1 |
| 2 周目 | 2 | 3 |
| 3 周目 | 3 | 6 |
| 4 周目 | 4 | 10 |
| 返り値 | - | 10 |
ループが終わるたびに total の値が 1 → 3 → 6 → 10 と増えていく様子を頭に焼き付けてください。これは数列 1, 2, 3, ..., n の累積和を 1 ステップずつ計算しているだけです。ループ変数 i は反復のたびに上書きされ、最終的に range の最後の値が残ります。
よくある間違い
初学者が for でつまずきやすいポイントは次の通りです。
range(1, n)と書いてしまいnが含まれないtotal = 0の初期化を忘れ、NameErrorになる- インデントが揃わず
IndentationErrorが出る total += iをtotal = iと書いてしまい、上書きされる- ループの外で
returnを書かず、関数がNoneを返す
Python
# NG: range の上限が n そのものになっている
for i in range(1, n):
total += iこのコードだと n を含めずに加算してしまうので、n = 5 でも結果が 10 になってしまいます。range(1, n + 1) と書くか、range(n) で 0..n-1 を取り、i + 1 を足すなど、必ず仕様と合わせましょう。return をループの内側に書いてしまうと最初の反復で関数が終わってしまうのも、よくある罠です。
ここまでの要点
range(1, n + 1) で 1 から n を生成、total = 0 で初期化、total += i で足し込み、ループの 外 で return total。この 4 点さえ守れば合計は必ず計算できる。
やってみよう
このレッスンの課題は、整数 n を受け取り、1 から n までの合計を return する関数 sum_to(n) を完成させることです。n が 0 のときは 0 を返してください。for と range を使って、total を 1 ずつ積み上げるパターンをしっかり手に染み込ませましょう。テストでは n = 100 のときに 5050 が返ることも確認されます。
余裕があれば、ループを使わずに
sum(range(1, n + 1))で書いた場合と結果が一致することも確かめてみてください。
よくある質問
Q. ビット演算は実務でいつ使いますか?
A. フラグ管理(permission の rwx)、画像処理(マスク)、ハッシュ計算の高速化などで使います。複数の真偽値を 1 つの整数にまとめると、メモリ削減と演算高速化の両方が得られます。例えば 8 個の権限を 1 byte で表せます。
Q. AND / OR / XOR の代表的な使い道は?
A. AND は「特定ビットの確認・抽出」(flags & PERM_READ)、OR は「ビットの立て上げ」(flags |= PERM_WRITE)、XOR は「ビット反転や暗号化」で使います。XOR は 2 回かけると元に戻る性質から、簡易暗号や両端ポインタの入れ替えなどに応用できます。
Q. シフト演算で割り算しても良いですか?
A. 正の整数の 2 のべき乗での除算なら x >> n と x / (1<<n) は同じ結果になります。ただし負の数では言語ごとに挙動が違う(算術シフトと論理シフトの区別)ため、可読性と安全性のために通常の演算子を使い、性能ボトルネックでのみシフトを検討してください。
次のレッスン
次は while でカウントダウンする で、for 文と range を組み合わせて、1 から n までの整数の合計を求める基本パターンを学ぶ を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- for で合計 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. for で合計 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- for 文と range を使って実装すること
- total を 0 で初期化し、ループで加算していくこと
- 戻り値は print ではなく return で返すこと
入出力例
test-cases.txt
sum_to(5) → 15
sum_to(1) → 1
sum_to(0) → 0
sum_to(10) → 55
sum_to(100) → 5050