この単位では、Python 標準ライブラリのうち、よく使う代表的な機能を扱う。
datetimemathrandomstatisticscollectionsの代表例Counterdefaultdictdeque
itertoolsの代表例chainisliceproductgroupbyの基礎
functoolsの最小限partiallru_cacheの基礎
この単位の主な論点は次の通り。
datetimeを使うと、日付、日時、時間差を扱えるmathを使うと、数学系の関数や定数を利用できるrandomを使うと、乱数やランダムな選択を扱えるstatisticsを使うと、平均や中央値などの基本的な統計処理を扱えるCounterを使うと、要素ごとの出現回数を数えられるdefaultdictを使うと、キーごとの初期値を簡潔に扱えるdequeを使うと、両端への追加や取り出しを扱いやすいitertoolsを使うと、反復処理の組み合わせを簡潔に書けるfunctools.partialを使うと、引数の一部を固定した関数を作れるfunctools.lru_cacheを使うと、同じ引数の計算結果をキャッシュできる
この単位のファイル構成は次の通り。
src/10_essential_standard_library/
main.py
datetime_examples.py
math_random_statistics_examples.py
collections_examples.py
itertools_examples.py
functools_examples.py
各ファイルの役割は次の通り。
main.py- Unit 10 の実行入口
- 各テーマ別ファイルの関数を順番に呼び出す
datetime_examples.pydate、datetime、timedelta、文字列変換を扱う
math_random_statistics_examples.pymath、random、statisticsの代表的な処理を扱う
collections_examples.pyCounter、defaultdict、dequeを扱う
itertools_examples.pychain、islice、product、groupbyを扱う
functools_examples.pypartial、lru_cacheを扱う
リポジトリ直下で仮想環境を有効化してから実行する。
PowerShell の場合:
.venv\Scripts\Activate.ps1
python src/10_essential_standard_library/main.pyGit Bash の場合:
source .venv/Scripts/activate
python src/10_essential_standard_library/main.pyRuff の確認は次のコマンドで行う。
uv run ruff check .
uv run ruff format --check .必要に応じてフォーマットを実行する。
uv run ruff format .次の順番で読むと、内容を追いやすい。
main.pydatetime_examples.pymath_random_statistics_examples.pycollections_examples.pyitertools_examples.pyfunctools_examples.py
最初に main.py を読むことで、この単位全体の実行順序を把握できる。
その後、日時、数値処理、コレクション補助、反復処理補助、関数補助の順番で読む。
Unit 10 全体の処理の流れは次の通り。
main.pyが実行されるmain()が呼び出される- 表示用の見出しを出す
datetimeのサンプルを実行するmath、random、statisticsのサンプルを実行するcollectionsのサンプルを実行するitertoolsのサンプルを実行するfunctoolsのサンプルを実行する- 各ファイル内の
assertにより、軽い期待値確認を行う
この単位では、標準ライブラリを使って自前実装を減らす考え方を主題にしている。
各ファイルの run_...() 関数は、テーマ別サンプルをまとめて実行するための入口として使う。
datetime_examples.py では、date、datetime、timedelta を使っている。
release_date = date(2026, 5, 15)
started_at = datetime(2026, 5, 15, 9, 30, 0)
review_period = timedelta(days=7)
review_date = release_date + review_perioddate は日付だけを表す。
datetime は日付と時刻をまとめて表す。
timedelta は時間差を表す値で、日付や日時に足したり引いたりできる。
日時処理を文字列のまま扱うより、専用の型として扱う方が安全で読みやすい。
math_random_statistics_examples.py では、random.Random(42) を使っている。
rng = random.Random(42)
random_number = rng.randint(1, 10)
selected_language = rng.choice(["Python", "Java", "SQL"])乱数は通常、実行ごとに結果が変わる。
学習用コードや確認用コードでは、結果が毎回変わると assert が書きにくい。
Random に seed を渡すと、同じ順序の乱数を再現できる。
そのため、この単位ではランダム処理の結果を固定して確認している。
collections_examples.py では、単語ごとの出現回数を数えている。
words = ["python", "java", "python", "sql", "python", "sql"]
word_counts = Counter(words)Counter を使うと、要素ごとの出現回数を自前で dict に集計しなくてよい。
word_counts["python"] のように書くと、該当要素の件数を取得できる。
出現回数の多い順に見たい場合は、most_common() を使える。
collections_examples.py では、カテゴリごとの点数を defaultdict にまとめている。
scores_by_category: defaultdict[str, list[int]] = defaultdict(list)
for category, score in score_rows:
scores_by_category[category].append(score)通常の dict では、キーが存在するか確認してから list を作る必要がある。
defaultdict(list) を使うと、存在しないキーを参照したときに空の list が作られる。
キーごとに値を集める処理でよく使う形である。
itertools_examples.py では、売上データをカテゴリごとに集計している。
sorted_sales = sorted(sales, key=itemgetter("category"))
for category, grouped_sales in groupby(sorted_sales, key=itemgetter("category")):
total = 0groupby は、連続した同じキーの要素をグループ化する。
そのため、同じカテゴリが離れた位置にあると、別グループとして扱われる。
期待通りにカテゴリごとにまとめたい場合は、先に同じキーで並び替えることが多い。
functools_examples.py では、税率を固定した関数を作っている。
apply_standard_tax = partial(apply_tax, tax_rate=0.1)
apply_reduced_tax = partial(apply_tax, tax_rate=0.08)partial は、関数の一部の引数を先に固定した新しい関数を作る。
この例では、tax_rate を固定することで、呼び出し側は価格だけを渡せばよくなる。
同じ関数を少し違う設定で繰り返し使いたい場合に役立つ。
functools_examples.py では、再帰関数に lru_cache を付けている。
@lru_cache(maxsize=32)
def fibonacci(number: int) -> int:
if number <= 1:
return number
return fibonacci(number - 1) + fibonacci(number - 2)lru_cache は、同じ引数で呼び出された結果をキャッシュする。
同じ計算を何度も行う関数では、再計算を減らせる。
今回の fibonacci は学習用の例であり、キャッシュの効果が分かりやすいように再帰で書いている。
datetime_examples.py では、strftime と strptime を使っている。
formatted_datetime = started_at.strftime("%Y-%m-%d %H:%M:%S")
parsed_datetime = datetime.strptime("2026-05-15 09:30:00", "%Y-%m-%d %H:%M:%S")strftime は、日時を文字列に変換する。
strptime は、文字列を datetime に変換する。
どちらもフォーマット指定が必要であり、文字列の形と指定がずれると正しく変換できない。
math_random_statistics_examples.py では、random.Random(42) を使っている。
rng = random.Random(42)random.randint() などを直接使うと、実行ごとに結果が変わる。
これは実際のランダム処理としては自然だが、学習用の期待値確認では扱いにくい。
結果を固定したい場合は、seed を指定した Random オブジェクトを使うと確認しやすい。
collections_examples.py では、defaultdict(list) を使っている。
scores_by_category: defaultdict[str, list[int]] = defaultdict(list)defaultdict は、存在しないキーを参照しただけで初期値を作る。
便利な一方で、意図せずキーを増やす可能性もある。
存在確認だけが目的の場合は、in を使ってキーがあるかを確認する方が安全な場面がある。
collections_examples.py では、deque(maxlen=3) を使っている。
recent_events: deque[str] = deque(maxlen=3)
recent_events.append("login")
recent_events.append("view")
recent_events.append("edit")
recent_events.append("logout")maxlen を指定した deque は、最大件数を超えると古い要素が自動で削除される。
この例では、4件追加しても最後の3件だけが残る。
履歴や直近ログを一定件数だけ持ちたい場合に使える。
itertools_examples.py では、chain、islice、product の結果を list にしている。
all_skills = list(chain(backend_skills, python_skills))
first_five_even_numbers = list(islice(...))
color_size_pairs = list(product(colors, sizes))itertools の多くの関数は、すぐに list を作るのではなく iterator を返す。
中身を表示したり assert で確認したりしたい場合は、list() に変換すると分かりやすい。
大きいデータを扱う場合は、必要な分だけ取り出せることが利点になる。
functools_examples.py では、同じ引数で fibonacci(10) を2回呼び出している。
fibonacci_10 = fibonacci(10)
cache_after_first_call = fibonacci.cache_info()
fibonacci_10_again = fibonacci(10)
cache_after_second_call = fibonacci.cache_info()lru_cache は、同じ引数で呼び出した結果を再利用する。
そのため、引数が毎回異なる処理では効果が出にくい。
キャッシュを使う関数では、同じ入力に対して同じ結果を返すことも重要となる。
この単位を読んだ後、次の内容を確認する。
datetimeで日付、日時、時間差を扱えることを説明できるstrftimeとstrptimeの違いを説明できるmath、random、statisticsの基本的な用途を説明できる- seed を指定した乱数の結果が固定されることを説明できる
Counterで出現回数を数えられることを説明できるdefaultdictでキーごとの値を集められることを説明できるdequeの基本的な用途を説明できるchain、islice、product、groupbyの基本を読めるpartialで引数の一部を固定した関数を作れることを説明できるlru_cacheで同じ引数の計算結果をキャッシュできることを説明できる