🎓 ステップ11: Python基礎の総復習
これまで学んだことを総まとめしよう!
ステップ10では、辞書を使ったデータ管理を学びました。ステップ11では、これまで学んだ全ての内容を復習し、総合的な理解を深めます。
📖 このステップで学ぶこと
・これまでの復習問題
・エラーの読み方と対処法
・ミニプロジェクト:成績管理システム
・総合復習問題
🎯 1. Part 1-2の振り返り
ステップ1〜10で学んだ内容を確認しましょう。
📝 学んだことのチェックリスト
✅ Part 1: 環境構築とPython基礎
□ Google Colabの使い方
□ 変数とデータ型(int, float, str, bool)
□ 計算と演算子(+, -, *, /, ==, !=, and, or)
□ リストの操作(追加、削除、スライス)
□ 条件分岐(if, elif, else)
✅ Part 2: 繰り返しと関数
□ for文とwhile文
□ break、continue
□ 関数の定義(def)と呼び出し
□ 引数と戻り値(return)
□ 文字列操作(split, replace, strip, upper, lower)
□ 辞書の操作(キー、値、items)
📘 基本構文の総まとめ
コード:これまでの基本構文
# 変数とデータ型
name = "太郎" # 文字列
age = 25 # 整数
height = 175.5 # 浮動小数点数
is_student = True # 真偽値
# リスト
fruits = ["りんご", "みかん", "バナナ"]
fruits.append("ぶどう")
# 辞書
person = {
"name": "太郎",
"age": 25,
"city": "東京"
}
# 条件分岐
if age >= 20:
print("成人です")
else:
print("未成年です")
# for文
for fruit in fruits:
print(fruit)
# 関数
def greet(name):
return f"こんにちは、{name}さん"
message = greet("花子")
print(message)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
成人です りんご みかん バナナ ぶどう こんにちは、花子さん
🔧 2. エラーの読み方と対処法
プログラミングでは、エラーは当たり前です。大切なのは、エラーメッセージを読んで原因を特定することです。
🔰 エラーメッセージの見方
📌 エラーメッセージの構造
エラーメッセージには、以下の情報が含まれています:
1. 何行目でエラーが起きたか
2. エラーの種類(SyntaxError、NameErrorなど)
3. エラーの原因(何が問題か)
📘 SyntaxError – 文法エラー
❌ 文法エラーの例
# コロンを忘れた
def say_hello()
print("こんにちは")
# エラーメッセージ:
# SyntaxError: invalid syntax
※ 画面が小さい場合は、コードブロックを横にスクロールできます
原因:
・def文の後にコロン(:)がありません
・Pythonの文法ルールに違反しています
✅ 正しいコード
# コロンを追加
def say_hello():
print("こんにちは")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
💡 対処法
if、for、def、whileの後にはコロン(:)が必要です。
インデント(字下げ)も確認しましょう。
📘 NameError – 未定義の変数
❌ 未定義エラーの例
# 定義していない変数を使った
print(total)
# エラーメッセージ:
# NameError: name 'total' is not defined
※ 画面が小さい場合は、コードブロックを横にスクロールできます
原因:
・変数totalが定義されていません
・変数を使う前に、値を代入する必要があります
✅ 正しいコード
# 先に変数を定義する
total = 0
print(total)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
💡 対処法
変数を使う前に定義しましょう。
変数名のスペルミスもチェックしてください。
📘 TypeError – 型エラー
❌ 型エラーの例
# 文字列と数値を足そうとした
result = "年齢:" + 25
# エラーメッセージ:
# TypeError: can only concatenate str (not "int") to str
※ 画面が小さい場合は、コードブロックを横にスクロールできます
原因:
・文字列と整数を+でつなげようとしています
・異なるデータ型は直接連結できません
✅ 正しいコード
# 方法1: 数値を文字列に変換
result = "年齢:" + str(25)
print(result)
# 方法2: f-stringを使う(推奨)
result = f"年齢:{25}"
print(result)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
💡 対処法
データ型を確認しましょう。
必要に応じて型変換(int(), str(), float())を使います。
f-stringを使うと、自動的に型変換されるので便利です。
📘 IndexError – インデックスエラー
❌ インデックスエラーの例
# 範囲外のインデックス
fruits = ["りんご", "みかん"]
print(fruits[5])
# エラーメッセージ:
# IndexError: list index out of range
※ 画面が小さい場合は、コードブロックを横にスクロールできます
原因:
・リストには2つの要素しかありません(インデックス0と1)
・インデックス5は範囲外です
✅ 正しいコード
fruits = ["りんご", "みかん"]
# 方法1: 存在するインデックスを使う
print(fruits[0])
print(fruits[1])
# 方法2: 範囲チェックをする
if len(fruits) > 5:
print(fruits[5])
else:
print("インデックスが範囲外です")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
💡 対処法
インデックスは0から始まることを忘れずに。
len()でリストの長さを確認しましょう。
リストの長さがnの場合、使えるインデックスは0〜n-1です。
📘 KeyError – キーエラー
❌ キーエラーの例
# 存在しないキー
person = {"name": "太郎", "age": 25}
print(person["city"])
# エラーメッセージ:
# KeyError: 'city'
※ 画面が小さい場合は、コードブロックを横にスクロールできます
原因:
・辞書に”city”というキーが存在しません
・存在しないキーにアクセスしようとしています
✅ 正しいコード
person = {"name": "太郎", "age": 25}
# 方法1: get()を使う(推奨)
print(person.get("city", "不明"))
# 方法2: inで確認してから取得
if "city" in person:
print(person["city"])
else:
print("キーが存在しません")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
💡 対処法
辞書のキーを取得する前に、get()メソッドを使うか、inで存在確認しましょう。
get()を使うとエラーを防げます。
📘 IndentationError – インデントエラー
❌ インデントエラーの例
# インデントが揃っていない
def say_hello():
print("こんにちは")
print("元気ですか")
# エラーメッセージ:
# IndentationError: expected an indented block
※ 画面が小さい場合は、コードブロックを横にスクロールできます
原因:
・関数の中身がインデントされていません
・インデントの深さが揃っていません
✅ 正しいコード
# インデントを揃える
def say_hello():
print("こんにちは")
print("元気ですか")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
💡 対処法
インデント(字下げ)はスペース4つで統一しましょう。
Google Colabなら、Tabキーで自動的にスペース4つが入ります。
同じブロック内のコードは、同じインデントにします。
📌 よくあるエラーまとめ
| エラー | 原因 | 対処法 |
| SyntaxError | 文法ミス(コロン忘れなど) | コロンとインデントを確認 |
| NameError | 未定義の変数 | 変数を定義してから使う |
| TypeError | データ型の不一致 | 型変換またはf-string使用 |
| IndexError | 範囲外のインデックス | len()で範囲を確認 |
| KeyError | 存在しないキー | get()またはinで確認 |
| IndentationError | インデントのミス | スペース4つで統一 |
📝 3. 総合復習問題
これまで学んだことを組み合わせて問題を解きましょう。
問題1:リストの基本操作(初級)
📋 問題
リスト[10, 20, 30, 40, 50]から、30以上の値だけを抽出して新しいリストを作成してください。
解答例を見る
コード
numbers = [10, 20, 30, 40, 50]
filtered = []
for num in numbers:
if num >= 30:
filtered.append(num)
print(filtered)
# リスト内包表記を使う方法
filtered2 = [num for num in numbers if num >= 30]
print(filtered2)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
[30, 40, 50] [30, 40, 50]
問題2:文字列の加工(中級)
📋 問題
文字列” hello world “を、先頭を大文字にして前後の空白を削除し、”Hello World”にしてください。
解答例を見る
コード
text = " hello world "
# 1. 空白を削除
text = text.strip()
# 2. 各単語の先頭を大文字に
text = text.title()
print(text)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
Hello World
問題3:関数の作成(中級)
📋 問題
リストを受け取って、その合計と平均を返す関数calc_statsを作成してください。
解答例を見る
コード
def calc_stats(numbers):
total = sum(numbers)
average = total / len(numbers)
return total, average
# テスト
scores = [85, 92, 78, 95, 88]
total, avg = calc_stats(scores)
print(f"合計: {total}")
print(f"平均: {avg:.1f}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
合計: 438 平均: 87.6
問題4:辞書のデータ処理(上級)
📋 問題
生徒データのリスト[{"name": "太郎", "score": 85}, {"name": "花子", "score": 92}]から、80点以上の生徒の名前のリストを作成してください。
解答例を見る
コード
students = [
{"name": "太郎", "score": 85},
{"name": "花子", "score": 92},
{"name": "次郎", "score": 78},
{"name": "三郎", "score": 88}
]
high_scorers = []
for student in students:
if student["score"] >= 80:
high_scorers.append(student["name"])
print(f"80点以上: {high_scorers}")
print(f"人数: {len(high_scorers)}人")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
80点以上: ['太郎', '花子', '三郎'] 人数: 3人
問題5:データの集計(上級)
📋 問題
文字列のリスト[“red”, “blue”, “red”, “green”, “blue”, “red”]から、各色の出現回数を辞書で集計してください。
解答例を見る
コード
colors = ["red", "blue", "red", "green", "blue", "red"]
color_count = {}
for color in colors:
color_count[color] = color_count.get(color, 0) + 1
print("【色の出現回数】")
for color, count in color_count.items():
print(f"{color}: {count}回")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
【色の出現回数】 red: 3回 blue: 2回 green: 1回
🎮 4. ミニプロジェクト:成績管理システム
これまで学んだ全ての知識を使って、実用的なシステムを作ります。
📘 プロジェクトの概要
📌 実装する機能
・生徒の追加
・成績の記録
・平均点の計算
・成績一覧の表示
📝 完成コード(全体)
コード:成績管理システム
# 成績管理システム
# 生徒データを格納する辞書
students = {}
def add_student(name):
"""生徒を追加"""
if name in students:
print(f"{name}さんは既に登録されています")
else:
students[name] = []
print(f"{name}さんを追加しました")
def add_score(name, score):
"""成績を追加"""
if name not in students:
print(f"エラー: {name}さんは登録されていません")
return
if 0 <= score <= 100:
students[name].append(score)
print(f"{name}さんの成績({score}点)を追加しました")
else:
print("エラー: 成績は0〜100の範囲で入力してください")
def calc_average(name):
"""平均点を計算"""
if name not in students:
print(f"エラー: {name}さんは登録されていません")
return None
if len(students[name]) == 0:
print(f"{name}さんの成績が登録されていません")
return None
avg = sum(students[name]) / len(students[name])
return avg
def show_all_students():
"""全生徒の成績を表示"""
if len(students) == 0:
print("生徒が登録されていません")
return
print("\n【成績一覧】")
print("-" * 40)
for name, scores in students.items():
if len(scores) > 0:
avg = sum(scores) / len(scores)
print(f"{name}さん")
print(f" 成績: {scores}")
print(f" 平均: {avg:.1f}点")
else:
print(f"{name}さん")
print(f" 成績: 未登録")
print("-" * 40)
# システムを使ってみる
print("=== 成績管理システム ===\n")
# 生徒を追加
add_student("太郎")
add_student("花子")
add_student("次郎")
print()
# 成績を追加
add_score("太郎", 85)
add_score("太郎", 92)
add_score("太郎", 78)
add_score("花子", 95)
add_score("花子", 88)
add_score("次郎", 72)
print()
# 平均点を表示
taro_avg = calc_average("太郎")
if taro_avg:
print(f"太郎さんの平均点: {taro_avg:.1f}点")
print()
# 全体の成績を表示
show_all_students()
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
=== 成績管理システム === 太郎さんを追加しました 花子さんを追加しました 次郎さんを追加しました 太郎さんの成績(85点)を追加しました 太郎さんの成績(92点)を追加しました 太郎さんの成績(78点)を追加しました 花子さんの成績(95点)を追加しました 花子さんの成績(88点)を追加しました 次郎さんの成績(72点)を追加しました 太郎さんの平均点: 85.0点 【成績一覧】 ---------------------------------------- 太郎さん 成績: [85, 92, 78] 平均: 85.0点 ---------------------------------------- 花子さん 成績: [95, 88] 平均: 91.5点 ---------------------------------------- 次郎さん 成績: [72] 平均: 72.0点 ----------------------------------------
🔍 コードの詳細解説
✅ このプロジェクトで使った技術
□ 辞書でデータを管理
□ リストで複数の成績を格納
□ 関数で機能を分割
□ 条件分岐でエラーチェック
□ ループで全データを表示
□ 計算(合計、平均)
💪 5. 発展課題
成績管理システムをさらに改良してみましょう。
📘 課題1:最高点・最低点の表示
📋 課題
各生徒の最高点と最低点も表示する機能を追加してください。
解答例を見る
コード
def show_all_students_detailed():
"""全生徒の詳細成績を表示"""
if len(students) == 0:
print("生徒が登録されていません")
return
print("\n【成績一覧(詳細)】")
print("-" * 40)
for name, scores in students.items():
if len(scores) > 0:
avg = sum(scores) / len(scores)
max_score = max(scores)
min_score = min(scores)
print(f"{name}さん")
print(f" 成績: {scores}")
print(f" 平均: {avg:.1f}点")
print(f" 最高: {max_score}点")
print(f" 最低: {min_score}点")
else:
print(f"{name}さん")
print(f" 成績: 未登録")
print("-" * 40)
show_all_students_detailed()
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
【成績一覧(詳細)】 ---------------------------------------- 太郎さん 成績: [85, 92, 78] 平均: 85.0点 最高: 92点 最低: 78点 ---------------------------------------- 花子さん 成績: [95, 88] 平均: 91.5点 最高: 95点 最低: 88点 ---------------------------------------- 次郎さん 成績: [72] 平均: 72.0点 最高: 72点 最低: 72点 ----------------------------------------
📘 課題2:成績のランキング
📋 課題
平均点が高い順に生徒を並べて表示する機能を追加してください。
解答例を見る
コード
def show_ranking():
"""平均点のランキングを表示"""
if len(students) == 0:
print("生徒が登録されていません")
return
# 平均点を計算してリストに格納
rankings = []
for name, scores in students.items():
if len(scores) > 0:
avg = sum(scores) / len(scores)
rankings.append((name, avg))
# 平均点で降順ソート
rankings.sort(key=lambda x: x[1], reverse=True)
# ランキング表示
print("\n【成績ランキング】")
for i, (name, avg) in enumerate(rankings, 1):
print(f"{i}位: {name}さん - {avg:.1f}点")
show_ranking()
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
【成績ランキング】 1位: 花子さん - 91.5点 2位: 太郎さん - 85.0点 3位: 次郎さん - 72.0点
💡 解説
rankings = []
・名前と平均点のペアを格納するリストを作成
rankings.append((name, avg))
・タプル(name, avg)をリストに追加
rankings.sort(key=lambda x: x[1], reverse=True)
・sort()でリストを並び替えます
・key=lambda x: x[1]は「タプルの2番目の要素(平均点)で並び替える」という意味
・reverse=Trueで降順(高い順)にします
enumerate(rankings, 1)
・enumerate()は、ループの回数(順位)も同時に取得できます
・1から始まる順位番号をiに代入します
📘 課題3:成績の削除機能
📋 課題
生徒を削除する機能、または特定の成績を削除する機能を追加してください。
解答例を見る
コード
def remove_student(name):
"""生徒を削除"""
if name in students:
del students[name]
print(f"{name}さんを削除しました")
else:
print(f"エラー: {name}さんは登録されていません")
def remove_score(name, index):
"""特定の成績を削除"""
if name not in students:
print(f"エラー: {name}さんは登録されていません")
return
if 0 <= index < len(students[name]):
removed = students[name].pop(index)
print(f"{name}さんの成績({removed}点)を削除しました")
else:
print("エラー: 無効なインデックスです")
# テスト
remove_score("太郎", 0) # 太郎さんの1番目の成績を削除
remove_student("次郎") # 次郎さんを削除
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
太郎さんの成績(85点)を削除しました 次郎さんを削除しました
💡 解説
del students[name]
・辞書から、そのキーと値のペアを削除します
・生徒のデータが完全に削除されます
students[name].pop(index)
・リストのpop()メソッドで、指定したインデックスの要素を削除します
・削除した値が返されるので、removed変数に代入できます
0 <= index < len(students[name])
・インデックスが有効な範囲かチェックします
・0以上、かつリストの長さ未満である必要があります
🎯 このステップのまとめ
✅ 総復習で確認したこと
✓ 変数、データ型、演算子の基本
✓ リストと辞書の使い方
✓ 条件分岐とループ処理
✓ 関数の定義と使い方
✓ 文字列操作のメソッド
✓ エラーの読み方と対処法
✓ 複数の技術を組み合わせた実践
💡 Part 3に進む前に確認
以下のことができるようになったか確認しましょう:
□ 基本的なPythonのコードが読める
□ 簡単なプログラムを自分で書ける
□ エラーメッセージを見て原因を特定できる
□ 関数を使ってコードを整理できる
□ 辞書とリストを組み合わせて使える
これらができたら、次のPart 3「データ分析に必要な数学」に進む準備ができています!
📌 ここまでの達成度チェック
もし理解が不十分な部分があれば、該当するステップに戻って復習しましょう。
基礎をしっかり固めることが、データ分析スキルの向上につながります!
❓ よくある質問
Q1: すべて完璧に理解しないと次に進めませんか?
A: 完璧でなくても大丈夫です。
基本的な使い方が分かれば次に進めます。
実際にデータ分析をしながら、また戻ってくることもあります。
重要なのは「分からないところが分かっている」ことです。
Q2: エラーが出たらどうすればいいですか?
A: まずエラーメッセージを読みましょう。
何行目でエラーが起きたか、何が原因かが書いてあります。
それでも分からない場合は、エラーメッセージをGoogleで検索すると解決策が見つかることが多いです。
Q3: 練習問題が難しくて解けません
A: まず解答例を見てOKです。
解答を見て、なぜそのコードで解けるのかを理解しましょう。
その後、自分で一から書いてみることが大切です。
Q4: どのくらい練習すればいいですか?
A: 手を動かすことが一番大切です。
このコースの例題を全て自分で打ち込んで実行してみましょう。
また、簡単なプログラムを自分で考えて作ってみることもおすすめです。
Q5: Part 3からは難しくなりますか?
A: Part 3ではデータ分析に必要な数学を学びます。
難しい数式は出てきませんが、平均や標準偏差などの統計の概念を学びます。
Pythonで計算しながら学ぶので、理解しやすいはずです!
学習メモ
Pythonデータ分析入門 - Step 11