🔁 ステップ6: for文でデータを処理しよう
繰り返し処理をマスターして効率的にプログラミング!
ステップ5では、if文で条件分岐を学びました。今回は、「同じ処理を何度も繰り返す」方法を学びます。これが「繰り返し処理(ループ)」です。
📖 このステップで学ぶこと
・for文の基本構文
・range()関数の使い方
・リストの繰り返し処理
・enumerate()でインデックス取得
・ネスト(入れ子)構造
・データ分析での実践例
🔄 1. 繰り返し処理とは何か?
プログラミングでは、同じ処理を何度も繰り返したいことがよくあります。
🔰 繰り返しが必要な場面
📌 よくある例
・リストの全ての要素を表示する
・1から100までの数を足す
・全ての生徒の成績を判定する
・ファイル内の全ての行を読み込む
・商品リストから価格を集計する
もし繰り返しを使わないと、同じコードを何十回、何百回も書く必要があります。
💡 繰り返しがないと…
# 100人の点数を表示したい場合
print(scores[0])
print(scores[1])
print(scores[2])
# ... あと97行も書く必要がある!
※ 画面が小さい場合は、コードブロックを横にスクロールできます
これは非効率ですし、人数が変わるたびにコードを書き直す必要があります。
Pythonでは、for文(フォー文)を使って繰り返し処理を実現します。
📝 2. for文の基本
for文を使えば、リストの要素を1つずつ取り出して処理できます。
🔰 for文の書き方
📌 for文の構文
for 変数 in リストなど:
繰り返し実行する処理
4つのルール:
1. forの後に変数名を書く
2. inの後に繰り返す対象(リストなど)を書く
3. 行末に:(コロン)を付ける
4. 実行する処理はインデント(字下げ)する
🔑 インデントは重要!
if文と同じく、for文でもインデント(字下げ)が必須です。
インデントされた部分が「for文の中身」として繰り返し実行されます。
通常はスペース4つでインデントします。
📘 最初のfor文を書いてみよう
コード:フルーツを1つずつ表示
# フルーツのリスト
fruits = ["りんご", "バナナ", "オレンジ"]
# リストの各要素を表示
for fruit in fruits:
print(fruit)
実行結果
りんご バナナ オレンジ
💡 コードの解説
fruits = [“りんご”, “バナナ”, “オレンジ”]
・3つの要素を持つリストを作ります
・このリストの各要素を順番に処理します
for fruit in fruits:
・「fruitsの中の各要素を、fruitという変数に入れて繰り返す」という意味です
・fruitは自動的に次の値に変わります
・最後に:(コロン)を忘れずに
print(fruit)
・スペース4つでインデントされています
・この行が3回繰り返されます
動作の流れ:
1回目: fruitに”りんご”が入る → print()で表示
2回目: fruitに”バナナ”が入る → print()で表示
3回目: fruitに”オレンジ”が入る → print()で表示
4回目: 要素がなくなったので終了
📝 変数名は自由に決められる
コード:変数名を変えた例
# 変数名は何でもOK(わかりやすい名前にしよう)
numbers = [10, 20, 30, 40, 50]
for num in numbers:
print(num)
実行結果
10 20 30 40 50
📌 変数名の付け方のコツ
・リストが複数形なら、変数は単数形にするとわかりやすい
例: for fruit in fruits(フルーツたちの中の1つのフルーツ)
例: for student in students(生徒たちの中の1人の生徒)
・短すぎる名前(i, x, aなど)は避けて、意味のある名前を
📝 複数の処理を繰り返す
コード:各数値を2倍にして表示
# 数値のリスト
numbers = [1, 2, 3, 4, 5]
# 各数値を2倍にして表示
for num in numbers:
doubled = num * 2
print(f"{num} × 2 = {doubled}")
実行結果
1 × 2 = 2 2 × 2 = 4 3 × 2 = 6 4 × 2 = 8 5 × 2 = 10
💡 複数行の処理
for文の中身は、何行でも書けます。
すべて同じ量(スペース4つ)インデントする必要があります。
この例では、doubled = num * 2 と print() の2行が繰り返されます。
🔢 3. range()関数で数値の繰り返し
range()関数を使うと、連続した数値を簡単に生成できます。
🔰 range()の基本形
📌 range(終了)の形
range(n)は、0からn-1までの数値を生成します。
例: range(5) → 0, 1, 2, 3, 4(5個の数)
コード:0から4まで表示
# 0から4まで(5回)繰り返す
for i in range(5):
print(i)
実行結果
0 1 2 3 4
💡 コードの解説
range(5)
・0, 1, 2, 3, 4という5個の数を生成します
・5は含まれません(0から数えて5個という意味)
for i in range(5):
・変数iに0が入る → 処理
・変数iに1が入る → 処理
・変数iに2が入る → 処理
・変数iに3が入る → 処理
・変数iに4が入る → 処理
・終了
🔑 重要なポイント
range(5)は5を含みません!
0, 1, 2, 3, 4の5個の数を生成します。
これはプログラミングでは一般的な仕様です。
🔰 range(開始, 終了)の形
📌 開始位置を指定
range(開始, 終了)で、開始位置を指定できます。
例: range(1, 6) → 1, 2, 3, 4, 5
終了の数は含まれません。
コード:1から5まで表示
# 1から5まで
for i in range(1, 6):
print(i)
実行結果
1 2 3 4 5
💡 コードの解説
range(1, 6)
・1から始まります
・6の手前(5)まで生成します
・つまり1, 2, 3, 4, 5が生成されます
「1から5まで」を指定したいときは、range(1, 6)と書く必要があります。
🔰 range(開始, 終了, ステップ)の形
📌 増加量を指定
range(開始, 終了, ステップ)で、増加量を指定できます。
例: range(0, 11, 2) → 0, 2, 4, 6, 8, 10(2ずつ増える)
コード:0から10まで2ずつ増やす
# 0から10まで、2ずつ増やす
for i in range(0, 11, 2):
print(i)
実行結果
0 2 4 6 8 10
💡 コードの解説
range(0, 11, 2)
・0から始まります
・11の手前まで
・2ずつ増えます
・結果: 0, 2, 4, 6, 8, 10
偶数だけ、奇数だけを生成したいときに便利です。
📝 逆順(減少)も可能
コード:10から1までカウントダウン
# 10から1まで、1ずつ減らす(逆順)
for i in range(10, 0, -1):
print(i)
実行結果
10 9 8 7 6 5 4 3 2 1
💡 マイナスのステップ
range(10, 0, -1)
・10から始まります
・0の手前(1)まで
・-1ずつ(つまり1ずつ減る)
カウントダウンや逆順処理に使えます。
📘 range()を使った実践例
コード:九九の3の段
# 九九の3の段を表示
for i in range(1, 10):
result = 3 * i
print(f"3 × {i} = {result}")
実行結果
3 × 1 = 3 3 × 2 = 6 3 × 3 = 9 3 × 4 = 12 3 × 5 = 15 3 × 6 = 18 3 × 7 = 21 3 × 8 = 24 3 × 9 = 27
📊 4. リストとfor文の組み合わせ
for文の真価は、リストと組み合わせたときに発揮されます。
📘 合計を計算する
コード:点数の合計と平均
# 点数のリスト
scores = [85, 92, 78, 95, 88]
# 合計を計算
total = 0
for score in scores:
total = total + score
print(f"合計:{total}点")
print(f"平均:{total / len(scores)}点")
実行結果
合計:438点 平均:87.6点
💡 コードの解説
total = 0
・合計を入れる変数を0で初期化します
・ループの前に必ず初期化が必要です
for score in scores:
・scoresリストの各要素をscoreに入れて繰り返します
total = total + score
・現在のtotalにscoreを足して、totalを更新します
・これを5回繰り返して、全ての点数が足されます
total / len(scores)
・合計を要素数で割って平均を計算します
・len(scores)は5なので、438 / 5 = 87.6
📘 条件に合う要素を数える
コード:80点以上の人数を数える
# 点数のリスト
scores = [85, 92, 78, 95, 88, 72, 90]
# 80点以上の人数を数える
count = 0
for score in scores:
if score >= 80:
count = count + 1
print(f"80点以上:{count}人")
実行結果
80点以上:5人
💡 for文とif文の組み合わせ
for文の中でif文を使えます。
count = 0
・カウンター変数を0で初期化
if score >= 80:
・各scoreが80以上かチェック
・条件を満たす場合だけcountを1増やす
この例では、85, 92, 95, 88, 90の5つが80以上なので、countは5になります。
📘 新しいリストを作る
コード:各要素を2倍にした新しいリスト
# 元のリスト
numbers = [1, 2, 3, 4, 5]
# 各要素を2倍にした新しいリストを作る
doubled = []
for num in numbers:
doubled.append(num * 2)
print(doubled)
実行結果
[2, 4, 6, 8, 10]
💡 リストの作成パターン
doubled = []
・空のリストを作ります
・ここに要素を追加していきます
doubled.append(num * 2)
・numを2倍にした値をdoubledに追加します
・append()は末尾に要素を追加するメソッドです
このパターンは、データ加工でよく使います。
🔢 5. enumerate()でインデックスも取得
enumerate()関数を使うと、インデックス(番号)と値の両方を同時に取得できます。
🔰 enumerate()とは?
📌 enumerate()の使い方
for インデックス, 値 in enumerate(リスト):
処理
インデックスと値を同時に受け取れます。
インデックスは0から始まります。
コード:インデックス付きで表示
# フルーツのリスト
fruits = ["りんご", "バナナ", "オレンジ"]
# インデックス付きで表示
for index, fruit in enumerate(fruits):
print(f"{index}番目:{fruit}")
実行結果
0番目:りんご 1番目:バナナ 2番目:オレンジ
💡 コードの解説
enumerate(fruits)
・fruitsリストの各要素に番号を付けます
・(0, “りんご”), (1, “バナナ”), (2, “オレンジ”)という形で返されます
for index, fruit in enumerate(fruits):
・indexに番号(0, 1, 2)が入ります
・fruitに値(”りんご”, “バナナ”, “オレンジ”)が入ります
・2つの変数で同時に受け取ります
📝 1から始める番号付け
enumerate()の第2引数で、開始番号を指定できます。
コード:1から始める
# フルーツのリスト
fruits = ["りんご", "バナナ", "オレンジ"]
# 1から始める番号付け
for index, fruit in enumerate(fruits, start=1):
print(f"{index}番目:{fruit}")
実行結果
1番目:りんご 2番目:バナナ 3番目:オレンジ
💡 start引数
enumerate(fruits, start=1)
・start=1 で、番号を1から始めます
・デフォルトはstart=0です
人間にとって自然な「1番目、2番目…」という番号付けができます。
📘 実践例:順位付け
コード:成績上位者の発表
# 成績上位者のリスト(既に順位順)
top_students = ["田中", "佐藤", "鈴木", "高橋", "伊藤"]
# 順位付きで表示
print("=== 成績上位者 ===")
for rank, name in enumerate(top_students, start=1):
print(f"{rank}位:{name}さん")
実行結果
=== 成績上位者 === 1位:田中さん 2位:佐藤さん 3位:鈴木さん 4位:高橋さん 5位:伊藤さん
🔀 6. ネスト(入れ子)構造
for文の中に、さらにfor文を書くことができます。これをネスト(入れ子)や二重ループと呼びます。
📘 二重ループの基本
コード:二重ループ
# 二重ループの基本
for i in range(3):
for j in range(3):
print(f"i={i}, j={j}")
実行結果
i=0, j=0 i=0, j=1 i=0, j=2 i=1, j=0 i=1, j=1 i=1, j=2 i=2, j=0 i=2, j=1 i=2, j=2
💡 二重ループの動作
外側のループ(i):
・iが0のとき、内側のループが全部(j=0,1,2)実行される
・iが1のとき、内側のループが全部(j=0,1,2)実行される
・iが2のとき、内側のループが全部(j=0,1,2)実行される
インデントのレベル:
・外側のfor文:スペース4つ
・内側のfor文:スペース8つ(4+4)
・print():スペース12つ(4+4+4)
合計で3×3=9回実行されます。
📘 実践例:九九の表
コード:九九の表を作る
# 九九の表を作る
print("=== 九九の表 ===")
for i in range(1, 10):
for j in range(1, 10):
result = i * j
print(f"{result:3}", end=" ") # 右揃えで表示
print() # 改行
実行結果
=== 九九の表 === 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81
💡 print()の特殊な使い方
print(f”{result:3}”, end=” “)
・{result:3}は、3桁分の幅で右揃え表示
・end=” “は、改行の代わりにスペースを入れます
・通常のprint()は自動で改行しますが、これで横並びにできます
print()
・引数なしのprint()は、改行だけします
・内側のループが終わったら、次の行に移ります
⚠️ ネストは深くしすぎない
for文を何重にもネストすると、コードが読みにくくなります。
また、実行回数が爆発的に増えます(3重ループで10×10×10=1000回)。
できるだけシンプルに保ちましょう。目安は2〜3階層まで。
🎯 7. データ分析での実践例
📘 例1:売上データの集計
コード:月別売上の表示と集計
# 月別売上データ
sales = [120000, 135000, 98000, 156000, 142000, 128000]
months = ["1月", "2月", "3月", "4月", "5月", "6月"]
# 売上を表示
print("=== 月別売上 ===")
for i in range(len(sales)):
print(f"{months[i]}:{sales[i]:,}円")
# 合計と平均
total_sales = 0
for sale in sales:
total_sales += sale
average = total_sales / len(sales)
print(f"\n合計:{total_sales:,}円")
print(f"平均:{average:,.0f}円")
実行結果
=== 月別売上 === 1月:120,000円 2月:135,000円 3月:98,000円 4月:156,000円 5月:142,000円 6月:128,000円 合計:779,000円 平均:129,833円
💡 コードの解説
for i in range(len(sales)):
・len(sales)は6なので、range(6)と同じ
・iは0から5まで変化します
・months[i]とsales[i]で、同じ位置の要素にアクセスします
{sales[i]:,}
・カンマ区切りで数値を表示(120000 → 120,000)
total_sales += sale
・total_sales = total_sales + sale の省略形
{average:,.0f}
・カンマ区切りで、小数点以下0桁で表示
📘 例2:温度データの分析
コード:最高気温と最低気温を見つける
# 1週間の気温データ(℃)
temperatures = [18.5, 21.2, 19.8, 22.5, 20.1, 23.7, 21.9]
days = ["月", "火", "水", "木", "金", "土", "日"]
# 最高気温と最低気温を見つける
max_temp = temperatures[0]
min_temp = temperatures[0]
max_day = days[0]
min_day = days[0]
for i in range(len(temperatures)):
if temperatures[i] > max_temp:
max_temp = temperatures[i]
max_day = days[i]
if temperatures[i] < min_temp:
min_temp = temperatures[i]
min_day = days[i]
print(f"最高気温:{max_temp}℃({max_day}曜日)")
print(f"最低気温:{min_temp}℃({min_day}曜日)")
実行結果
最高気温:23.7℃(土曜日) 最低気温:18.5℃(月曜日)
💡 最大値・最小値の見つけ方
最初の要素で初期化:
・max_temp = temperatures[0]
・最初の値を「現在の最大値」とします
各要素と比較:
・if temperatures[i] > max_temp:
・より大きい値が見つかったら更新します
同時に曜日も記録:
・max_day = days[i]
・最大値が更新されたら、その曜日も記録します
📝 練習問題
ここまで学んだことを、実際に手を動かして確認しましょう。
問題1:1から10まで表示(初級)
📋 問題
range()を使って、1から10までの数を表示してください。
解答例を見る
コード
for i in range(1, 11):
print(i)
実行結果
1 2 3 4 5 6 7 8 9 10
問題2:リストの全要素を表示(初級)
📋 問題
以下のリストの全ての要素を、1行ずつ表示してください:
colors = ["赤", "青", "緑", "黄", "紫"]
解答例を見る
コード
colors = ["赤", "青", "緑", "黄", "紫"]
for color in colors:
print(color)
実行結果
赤 青 緑 黄 紫
問題3:1から100までの合計(中級)
📋 問題
1から100までの数を全て足した合計を計算して表示してください。
解答例を見る
コード
# 合計を入れる変数
total = 0
# 1から100まで足す
for i in range(1, 101):
total = total + i
print(f"1から100までの合計:{total}")
実行結果
1から100までの合計:5050
💡 ポイント
この問題は数学の公式(n × (n+1) ÷ 2)でも解けますが、for文の練習として1つずつ足しています。
100 × 101 ÷ 2 = 5050
問題4:偶数だけを表示(中級)
📋 問題
1から20までの数の中で、偶数だけを表示してください。
解答例を見る
コード:方法1(if文で判定)
for i in range(1, 21):
if i % 2 == 0:
print(i)
実行結果
2 4 6 8 10 12 14 16 18 20
コード:方法2(range()のステップ)
for i in range(2, 21, 2):
print(i)
💡 ポイント
方法2の方が効率的です。range()のステップ機能を使えば、偶数だけを生成できます。
問題5:成績の集計と判定(中級)
📋 問題
以下のテスト点数のリストについて、合計、平均、80点以上の人数を計算してください:
scores = [85, 92, 78, 95, 88, 72, 90, 81]
解答例を見る
コード
scores = [85, 92, 78, 95, 88, 72, 90, 81]
# 合計を計算
total = 0
for score in scores:
total = total + score
# 平均を計算
average = total / len(scores)
# 80点以上を数える
high_score_count = 0
for score in scores:
if score >= 80:
high_score_count = high_score_count + 1
# 結果を表示
print(f"合計:{total}点")
print(f"平均:{average}点")
print(f"80点以上:{high_score_count}人")
実行結果
合計:681点 平均:85.125点 80点以上:6人
問題6:FizzBuzzゲーム(上級)
📋 問題
1から30までの数について、以下のルールで表示してください:
・3の倍数なら「Fizz」
・5の倍数なら「Buzz」
・15の倍数(3と5の両方の倍数)なら「FizzBuzz」
・それ以外はその数を表示
解答例を見る
コード
for i in range(1, 31):
if i % 15 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
実行結果
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz
💡 ポイント
15の倍数を最初にチェックすることが重要です。
順番を間違えると、15は3の倍数でもあるので「Fizz」と表示されてしまいます。
elifは上から順番にチェックされ、最初にTrueになった条件だけが実行されることを思い出しましょう。
🎯 このステップのまとめ
✅ 学んだこと
✓ for文で繰り返し処理ができる
✓ range()で連続した数値を生成
✓ range(開始, 終了, ステップ)で柔軟な数列
✓ リストの全要素を順番に処理できる
✓ enumerate()でインデックスと値を同時取得
✓ for文はネスト(入れ子)にできる
✓ for文とif文を組み合わせて条件付き処理
✓ データの集計・分析にfor文は必須
💡 次のステップに進む前に確認
以下のことができるようになったか確認しましょう:
□ for文でリストを繰り返し処理できる
□ range()を使って数値の繰り返しができる
□ enumerate()でインデックス付きループができる
□ for文とif文を組み合わせて使える
□ リストの合計や平均を計算できる
これらができたら、次のステップに進みましょう!
❓ よくある質問
Q1: range(5)はなぜ0から4までなのですか?
A: プログラミングでは0から数え始めるのが一般的です。
range(5)は「5個の数」を生成すると考えましょう。0, 1, 2, 3, 4の5個です。
最初は混乱しますが、慣れると自然に感じるようになります。
Q2: for文の変数名は何でも良いですか?
A: はい、任意の変数名が使えます。
ただし、内容がわかりやすい名前にしましょう。
リストを繰り返すならfor item in itemsのように、単数形と複数形で対応させると読みやすいです。
Q3: enumerate()とrange(len())の違いは?
A:
enumerate(list)はインデックスと値の両方を取得できます。
range(len(list))はインデックスだけです。
値も必要な場合はenumerate()の方が便利です。
Q4: for文の中でリストを変更できますか?
A: できますが、繰り返し中のリストを変更すると予期しない動作になることがあります。
安全に変更したい場合は、リストのコピーを作って繰り返すか、新しいリストを作りましょう。
Q5: 無限ループになってしまいます
A: for文は指定した回数だけ繰り返すので、通常は無限ループになりません。
無限ループは次のステップで学ぶwhile文で起こりやすいです。
もし止まらない場合は、Google Colabの「ランタイム」→「ランタイムを中断」で停止できます。
Q6: for文とwhile文、どちらを使うべきですか?
A: 繰り返す回数が決まっている場合はfor文が適しています。
条件によって回数が変わる場合は、次のステップで学ぶwhile文を使います。
迷ったらfor文から試してみましょう。
Q7: リスト内包表記とは何ですか?
A: リスト内包表記は、for文を1行で書ける便利な記法です。
例: doubled = [num * 2 for num in numbers]
これは後のステップで学びますので、今はfor文をしっかり理解しましょう。
Q8: ネストは何階層までできますか?
A: 技術的には制限はありませんが、3階層を超えると読みにくくなります。
深いネストが必要な場合は、後で学ぶ関数を使ってコードを整理しましょう。
学習メモ
Pythonデータ分析入門 - Step 6