Python 入門

Python 組み込みモジュール

Python 標準ライブラリ(Standard Library)は、多種多様なプログラミングタスクに対応する準備済みのモジュールが収められた巨大なコレクションです。一般的な操作のためにコードを一から書く必要はなく、これらのモジュールをインポートして利用するだけで、開発時間と労力を大幅に節約できます。

本章では、標準ライブラリの中でも不可欠な3つのモジュール、mathdatetime、および random を紹介します。これらはそれぞれ、数学計算の実行、日付と時刻の操作、そして乱数の生成に使用されます。

1. モジュールとインポートの復習

具体的なモジュールを掘り下げる前に、モジュールとは何か、そしてどのようにインポートするのかを復習しておきましょう。前のレッスンで学んだ通り、モジュールとは Python の定義や文が含まれたファイルのことです。モジュールを利用することで、コードを再利用可能なコンポーネントに整理でき、コードのモジュール化とメンテナンス性が向上します。

モジュールを使用するには、import 文を使用します。以下は一般的なインポート方法です。

  • import モジュール名: モジュール全体をインポートします。関数や変数にアクセスするには、ドット記法(例:モジュール名.関数名)を使用します。
import math
# 16 の平方根を計算
result = math.sqrt(16)
print(result)  # 出力: 4.0
  • from モジュール名 import 特定の項: モジュール内の特定の関数や変数のみをインポートします。この場合、ドット記法なしで直接使用できます。
from math import sqrt
# 25 の平方根を計算
result = sqrt(25)
print(result)  # 出力: 5.0

from モジュール名 import *: モジュール内のすべての項目をインポートします。便利ではありますが、名前空間(Namespace)の衝突を引き起こしやすく、コードの可読性を下げるため、通常は推奨されません。

from math import *
# pi の値を使用
result = pi
print(result)  # 出力: 3.141592653589793
  • import モジュール名 as 略称: モジュールを別名(エイリアス)でインポートします。長いモジュール名を短縮したり、名前の衝突を回避したりする際に非常に有用です。
import datetime as dt
# 現在の日時を取得
now = dt.datetime.now()
print(now)  # 現在の日時が出力される

2. math モジュール:数学関数

math モジュールは、三角関数、対数関数、指数関数、丸め関数など、幅広い数学関数を提供します。また、pie といった便利な数学定数も定義されています。

2.1 定数

  • math.pi: 円周率(π)を表す定数。約 3.14159 です。
  • math.e: 自然対数の底(e、ネイピア数)を表す定数。約 2.71828 です。
import math
print(math.pi)  # 出力: 3.141592653589793
print(math.e)   # 出力: 2.718281828459045

例:円の周長を計算する

import math
radius = 5
circumference = 2 * math.pi * radius
print(circumference)  # 出力: 31.41592653589793

2.2 基本算術関数

  • math.ceil(x): 切り上げ。x 以上の最小の整数を返します。
  • math.floor(x): 切り捨て。x 以下の最大の整数を返します。
  • math.fabs(x): x の絶対値を浮動小数点数(float)形式で返します。
  • math.factorial(x): x の階乗を返します。x が整数でない場合や負の場合は ValueError が発生します。
  • math.fmod(x, y): x / y の剰余を浮動小数点数で返します。
import math
print(math.ceil(4.2))     # 出力: 5
print(math.floor(4.8))    # 出力: 4
print(math.fabs(-5.5))    # 出力: 5.5
print(math.factorial(5))  # 出力: 120 (5*4*3*2*1)
print(math.fmod(10.5, 3)) # 出力: 1.5

例:経過日数が何週間分(完全な週)にあたるか計算する

import math
days = 20
weeks = math.floor(days / 7)
print(weeks)  # 出力: 2

2.3 指数・対数関数

  • math.exp(x): e の x 乗 (ex) を返します。
  • math.log(x[, base]): 指定された base(底)に対する x の対数を返します。底を指定しない場合は自然対数(底が e)となります。
  • math.log10(x): 常用対数(底が 10)を返します。
  • math.pow(x, y): xy 乗 (xy) を返します(単純な累乗には ** 演算子が一般的です)。
  • math.sqrt(x): x の平方根を返します。
import math
print(math.exp(2))      # 出力: 7.38905609893065
print(math.log(10))     # 出力: 2.302585092994046
print(math.log(10, 2))  # 出力: 3.3219280948873626 (底が2)
print(math.log10(100))  # 出力: 2.0
print(math.pow(2, 3))   # 出力: 8.0
print(math.sqrt(25))    # 出力: 5.0

例:複利を計算する

import math
principal = 1000  # 元本
rate = 0.05       # 利率
time = 5          # 期間(年)
amount = principal * math.pow((1 + rate), time)
print(amount)  # 出力: 1276.2815625000004

2.4 三角関数

  • math.sin(x): x(ラジアン)の正弦を返します。
  • math.cos(x): x(ラジアン)の余弦を返します。
  • math.tan(x): x(ラジアン)の正接を返します。
  • math.degrees(x): 弧度(ラジアン)から度(ディグリー)に変換します。
  • math.radians(x): 度(ディグリー)から弧度(ラジアン)に変換します。
import math
angle_radians = math.pi / 2  # 90度
print(math.sin(angle_radians))     # 出力: 1.0
print(math.cos(angle_radians))     # 出力: 6.123233995736766e-17 (ほぼ 0)
print(math.degrees(angle_radians)) # 出力: 90.0

3. datetime モジュール:日付と時刻の操作

datetime モジュールは、日付、時刻、および期間を処理するためのクラスを提供します。イベントログの記録、タスクのスケジューリング、経過時間の計算などに不可欠です。

3.1 コアクラス

  • datetime.date: 日付(年、月、日)を表します。
  • datetime.time: 時刻(時、分、秒、マイクロ秒)を表します。
  • datetime.datetime: 日付と時刻の両方を表します。
  • datetime.timedelta: 2つの日付や時刻の間の「期間」や「差」を表します。

3.2 オブジェクトの作成

import datetime

# date オブジェクトの作成
d = datetime.date(2023, 10, 27)
print(d)  # 出力: 2023-10-27

# time オブジェクトの作成
t = datetime.time(10, 30, 0)
print(t)  # 出力: 10:30:00

# datetime オブジェクトの作成
dt = datetime.datetime(2023, 10, 27, 10, 30, 0)
print(dt)  # 出力: 2023-10-27 10:30:00

# 現在の日時を取得
now = datetime.datetime.now()
print(now)  # 現在のシステム日時

3.3 コンポーネントへのアクセス

import datetime
now = datetime.datetime.now()

print(now.year)       # 現在の年
print(now.month)      # 現在の月
print(now.day)        # 現在の日
print(now.hour)       # 現在の時
print(now.minute)     # 現在の分
print(now.weekday())   # 曜日 (0:月曜日 - 6:日曜日)
print(now.isoweekday())# 曜日 (1:月曜日 - 7:日曜日)

3.4 timedelta オブジェクト:日時の算術計算

timedelta は時間差を表し、これを使って日時の加算や減算を行うことができます。

import datetime

# 1日を表す timedelta を作成
one_day = datetime.timedelta(days=1)

# 今日の日付
today = datetime.date.today()

# 明日の日付を計算
tomorrow = today + one_day
print("明日:", tomorrow)

# 1週間前の日付を計算
one_week_ago = today - datetime.timedelta(weeks=1)
print("一週間前:", one_week_ago)

3.5 フォーマットとパース:strftime と strptime

  • strftime(format): 日時オブジェクトを特定の形式の文字列に変換します。
  • strptime(date_string, format): 文字列を解析して datetime オブジェクトに変換します。
import datetime
now = datetime.datetime.now()

# datetime オブジェクトを文字列にフォーマット
formatted_datetime = now.strftime("%Y-%m-%d %H:%M:%S")
print(formatted_datetime)  # 例: 2023-10-27 14:30:00

# 文字列を解析して datetime オブジェクトに変換
date_string = "2023-11-15"
parsed_date = datetime.datetime.strptime(date_string, "%Y-%m-%d")
print(parsed_date)  # 出力: 2023-11-15 00:00:00

4. random モジュール:乱数生成

random モジュールは、擬似乱数を生成する関数を提供します。統計学的なランダム性が求められるシミュレーション、ゲーム、データサンプリングなどに適しています。

4.1 基本的な乱数関数

  • random.random(): 0.0 以上 1.0 未満の浮動小数点数を返します。
  • random.randint(a, b): a 以上 b 以下の整数を返します。
  • random.uniform(a, b): a 以上 b 以下の浮動小数点数を返します。
import random
print(random.random())        # 0.0 〜 1.0 の浮動小数点数
print(random.randint(1, 10))  # 1 〜 10 の整数
print(random.uniform(1, 10))  # 1 〜 10 の浮動小数点数

4.2 シーケンス関連の関数

  • random.choice(sequence): リストやタプルなどのシーケンスから要素を1つランダムに返します。
  • random.shuffle(sequence): シーケンスの要素をインプレース(直接)でシャッフルします。
  • random.sample(population, k): 重複なしで k 個の要素をサンプリングしたリストを返します。
import random
my_list = [1, 2, 3, 4, 5]

print(random.choice(my_list))  # リストから1つ選択

random.shuffle(my_list)        # リストをシャッフル
print(my_list)

print(random.sample(my_list, 3)) # ユニークな3つの要素を抽出

4.3 乱数シード (Seed) の設定

擬似乱数生成器を使用しているため、random.seed() でシード値を設定すると、実行のたびに同じ乱数シーケンスを得ることができます(テストやデバッグに有用です)。

import random

# シード値を設定
random.seed(42)
print("1回目:", random.random())
print("1回目:", random.randint(1, 10))

# 同じシード値を再度設定
random.seed(42)
# 上記と全く同じ結果が得られる
print("2回目:", random.random())
print("2回目:", random.randint(1, 10))