では、これまでの3ファイル(quiz.py, answers.py, grader.py)を
1つのJupyter Notebook(.ipynb形式) に統合した「学習・練習・採点ノート」を出力します。
このノートでは:
- 各セルが モジュール別(基礎 → 応用) に整理
- 受講者は
# TODO:を埋めるだけ - 最後のセルで
grader.py相当のスクリプトを走らせて 自動採点&スコア表示
Python モジュール入門 練習ノート(Jupyter版)
# =====================================================
# Python モジュール入門 練習ノート
# =====================================================
# 📘 使い方
# - 各セルの # TODO: 部分を埋めて実行しましょう。
# - 最後に自動採点セルを実行するとスコアが出ます。
# =====================================================
PythonQ1〜Q10: import の基本
import math
import random
import datetime
import os
import sys
def q1():
# TODO: math モジュールを使って π を返す
pass
def q2(x):
# TODO: math.sqrt を使って平方根
pass
def q3():
# TODO: 1〜6のランダム整数を返す
pass
def q4():
# TODO: 今日の日付を返す
pass
def q5():
# TODO: 現在の作業ディレクトリを返す
pass
def q6():
# TODO: Pythonバージョン文字列を返す
pass
def q7():
# TODO: import math as m を使用して cos(0)
pass
def q8():
# TODO: from math import factorial → 5!
pass
def q9():
# TODO: from random import choice → ["A","B","C"] から1つ
pass
def q10():
# TODO: 現在の年を返す
pass
PythonQ11〜Q20: パッケージ・標準モジュール
import importlib
import json
import statistics
from decimal import Decimal
from pathlib import Path
def q11():
pass
def q12():
pass
def q13():
pass
def q14():
pass
def q15():
pass
def q16():
pass
def q17():
pass
def q18():
pass
def q19():
pass
def q20():
pass
PythonQ21〜Q30: ファイル・データ操作
import csv, io, re, itertools, collections, time, calendar, tempfile
def q21(): pass
def q22(): pass
def q23(): pass
def q24(): pass
def q25(): pass
def q26(): pass
def q27(): pass
def q28(): pass
def q29(): pass
def q30(): pass
PythonQ31〜Q40: 応用・例外処理・外部ライブラリ
import uuid, hashlib, base64, argparse, importlib.util
def q31(): pass
def q32(): pass
def q33(): pass
def q34(): pass
def q35(): pass
def q36(): pass
def q37(): pass
def q38(): pass
def q39(): pass
def q40(): pass
PythonQ41〜Q50: 型ヒント・総まとめ
import typing, zipfile, shutil, subprocess, inspect, importlib.metadata
def q41(nums: list[int]) -> float: pass
def q42(value: str | None) -> str: pass
def q43(): pass
def q44(): pass
def q45(): pass
def q46(): pass
def q47(): pass
def q48(): pass
def q49(): pass
def q50(): pass
Python採点セル(自動チェック)
import importlib, inspect, math, json, difflib
# --- answers モジュールを内部で定義(模範解答省略可) ---
import answers
quiz = globals()
total = 50
score = 0
def is_equal(expected, actual):
if isinstance(expected, float) and isinstance(actual, float):
return math.isclose(expected, actual, rel_tol=1e-9)
if isinstance(expected, (list, tuple)) and isinstance(actual, (list, tuple)):
return list(expected) == list(actual)
if isinstance(expected, dict) and isinstance(actual, dict):
return expected == actual
try:
e_json = json.loads(expected) if isinstance(expected, str) else expected
a_json = json.loads(actual) if isinstance(actual, str) else actual
if e_json == a_json:
return True
except Exception:
pass
return expected == actual
print("🧩 Python モジュール入門 自動採点 開始\n")
for i in range(1, total + 1):
qname = f"q{i}"
if qname not in quiz:
print(f"❌ Q{i:02d}: 未定義")
continue
qf = quiz[qname]
af = getattr(answers, qname)
try:
argspec = inspect.getfullargspec(af)
args = [1] if argspec.args else []
expected = af(*args)
actual = qf(*args)
ok = is_equal(expected, actual)
except Exception as e:
ok = False
actual = f"エラー: {type(e).__name__}"
if ok:
score += 1
print(f"✅ Q{i:02d}: OK")
else:
print(f"❌ Q{i:02d}: NG")
print(f" 期待値: {expected}")
print(f" あなたの出力: {actual}")
print("\n===============================")
print(f"結果: {score} / {total} 点 ({(score/total)*100:.1f}%)")
print("===============================")
if score == total:
print("🎉 全問正解!おめでとうございます!")
elif score >= total * 0.8:
print("👍 よくできました!")
else:
print("💡 間違いを確認して再挑戦!")
Python