フリーキーズ | 独学プログラミング

Pythonのよく使う標準ライブラリ一覧と使い方の例 その1

最終更新日
【画像】Pythonのよく使う標準ライブラリ一覧と使い方の例 その1

Pythonのプログラミングでよく利用される膨大な標準ライブラリの便利さを再発見するために書きました。

osによるファイル操作

Pythonの標準ライブラリにはオペレーティングシステムに関連するタスクを処理するのに役立つモジュールのスイートが用意されています。そのような強力なモジュールの1つが os で、Windows、Mac、Linuxなど、Pythonが動作している基本的なオペレーティングシステムとのインターフェースを提供します。

os モジュールを使って、ファイルやディレクトリの操作、環境変数の読み取り、プロセスのフォークなど、さまざまなことができます。ディレクトリの作成、ファイル名の変更、ディレクトリのウォークスルーなど、ファイルI/O操作したいときに便利です。

import os

ファイルやディレクトリを操作する

os モジュールで行う最も一般的なタスクの1つはファイルシステムの操作です。 os を使えば、ディレクトリの作成、削除、変更、ナビゲーションを行うことができます。以下は新しいディレクトリを作成する方法です。

import os

os.mkdir("new_directory")

また、以下のように現在の作業ディレクトリを変更したり、現在の作業ディレクトリの名前を取得したりできます。

# 現在の作業ディレクトリを変更
os.chdir("/path/to/directory")

# 現在の作業ディレクトリを取得
current_directory = os.getcwd()
print(current_directory)

環境との相互作用

また、 os モジュールではオペレーティングシステムの環境変数の読み書きできます。これはデータベースのパスワードやAPIキー、その他の秘密のトークンなどの機密情報を隠したいときに便利です。

以下は、環境変数の読み書きの方法です。

import os

# 環境変数の設定
os.environ["NEW_VARIABLE"] = "Hello"

# 環境変数の取得
value = os.getenv("NEW_VARIABLE")
print(value)  # 出力: Hello

shutilによるハイレベルなファイル操作

Pythonの shutil モジュールは高レベルのファイル操作するためのもう1つの強力なツールです。Pythonの標準ライブラリの一部である shutil はPythonのインストール時に同梱されており、ファイルやディレクトリのコピー、移動、削除の機能を提供します。

os モジュールと同様に、 shutil は異なるオペレーティングシステム間でシームレスに動作しスクリプトをポータブルにします。

import shutil

ファイルのコピーと移動

shutil モジュールの一般的な使い方の1つにファイルやディレクトリのコピーや移動があります。これはそれぞれ copy() 関数と move() 関数を使用して行うことができます。以下はファイルをコピーするサンプルコードです。

import shutil

# コピー元(src_file_path)からコピー先(dst_directory_path)へコピー
shutil.copy("src_file_path", "dst_directory_path")

ファイルを移動する方法は以下です。

# コピー元(src_file_path)からコピー先(dst_directory_path)へ移動
shutil.move("src_file_path", "dst_directory_path")

上記のいずれの場合も、 src_file_pathdst_directory_path はそれぞれソースファイルとデスティネーションディレクトリのパスに置き換える必要があります。

ファイルやディレクトリの削除

shutil のもう1つの使い方はファイルやディレクトリを削除することです。この目的のためにPythonは shutil.rmtree() 関数を提供しており、ディレクトリツリー全体、つまり、与えられたパス内のすべてのディレクトリとファイルを削除できます。

以下はその使用例です。

import shutil

# 指定ディレクトリ以下を削除
shutil.rmtree("directory_path")

shutil.rmtree() を不適切に使用すると重要なファイルを削除してしまう可能性があるため、使用中は注意する必要があることに注意してください。

datetimeで日付と時刻を管理する

プログラミングの世界では日付を表示するための書式設定、経過時間の計算、将来のタスクのスケジューリングなど、日付や時刻を扱うことはよくある作業です。Pythonの標準ライブラリに含まれる datetime モジュールは、単純な方法から複雑な方法まで、日付と時刻を操作するためのクラスを提供しています。

datetimeモジュールには、datetimedatetimetimedeltaなどのクラスがあります。

import datetime

日付と時刻を操作する

datetimeモジュールでは、日付と時刻を個別に、または一緒に扱うことができます。ここでは、現在の日付と時刻を表す 'datetime' オブジェクトを作成する方法を説明します。

# 現在日時の取得
now = datetime.datetime.now()
print(now)

また、日付や時間のオブジェクトを簡単に作成できます。

# 日付オブジェクトの生成
date = datetime.date(2023, 5, 18)
print(date)

# 時間オブジェクトの生成
time = datetime.time(13, 45)  # 1:45 PM
print(time)

上記の例では、dateオブジェクトは日付(年、月、日)を、timeオブジェクトは時間(時、分、秒、マイクロ秒)を表しています。

時差を計算する

datetimeモジュールは2つの時点の時間差を計算するのにも便利です。これはtimedeltaオブジェクトを使って行うことができます。timedeltaオブジェクトは、期間、つまり2つの日付や時刻の差を表します。

# 2つの日付オブジェクトを生成
date1 = datetime.date(2023, 5, 18)
date2 = datetime.date(2023, 6, 18)

# 2つの日付の差分を計算
difference = date2 - date1
print(difference.days)  # 出力: 31

この例では、2つの日付の間の日数を計算しています。同様に、2つの時間や2つのdatetimeオブジェクトの差を計算できます。

結論として、datetimeモジュールはPythonで日付と時刻を扱うための強力なツールです。現在の日時の取得から時差の計算まで、datetimeは日付と時間を簡単かつ直感的に扱うための様々な機能性を提供します。

socketを使ったネットワークの相互作用

ネットワークプログラミングの領域で、Pythonのsocketモジュールは強力なツールです。Pythonの標準ライブラリの一部であるsocketは、コンピュータ間のネットワーク通信のための柔軟なインターフェイスを提供します。TCP、UDP、RAWソケットなどの幅広いプロトコルをサポートしており、多くのネットワークタスクに汎用的に使用できます。

socketはデータを送受信するネットワーク通信システムにおけるエンドポイントです。Pythonのsocketモジュールを使うと、ソケットオブジェクトを作成し、様々なネットワーク関連のタスクのためにそれらを制御できます。

import socket

ソケットの作成

ソケットを作成するには新しいソケットオブジェクトを初期化し、通信の種類を指定する必要があります。ここではソケットを作成する基本的な例を紹介します。

# ソケットオブジェクトの生成
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

上記のコードでは、socket.AF_INETはIPv4を使っていることを、socket.SOCK_STREAMはTCPソケットを作成していることを表しています。UDPソケットを作成する場合はsocket.SOCK_DGRAMを使用します。

接続を確立する

ソケットを作成したら、クライアント・サーバー通信の次のステップは接続を確立することです。クライアントはサーバーのIPアドレスとポート番号を使ってサーバーに接続します。

# サーバへ接続
s.connect(('www.python.org', 80))

この例では、HTTPの標準ポートである80番ポートでPythonの公式サイトに接続しています。

接続が確立したらsend()メソッドでサーバーにデータを送信し、recv()メソッドでサーバーからデータを受信できます。通信が終わったらclose()メソッドでソケットを閉じることが重要です。

mathを使った数学的操作

Pythonでは、数学の演算は基本的な足し算、引き算、掛け算、割り算にとどまりません。より複雑な数学的計算のためにPythonは標準ライブラリの一部であるmathモジュールを提供しています。mathモジュールには、三角法、複素数、対数、累乗などの関数が含まれています。

このモジュールは様々な数学関数、定数、計算ユーティリティを提供します。

import math

Performing Mathematical Operations

mathモジュールは高度な数学的操作を可能にする関数の数々を提供します。例えば、数値の平方根を計算したり、数値の階乗を求めたり、角度のサイン、コサイン、タンジェントを計算できます。以下はその例です。

# 16の平方根の計算
sqrt = math.sqrt(16)
print(sqrt)  # 出力: 4.0

# 5の階乗
fact = math.factorial(5)
print(fact)  # 出力: 120

# π/2のサインを計算
sin_val = math.sin(math.pi / 2)
print(sin_val)  # 出力: 1.0

数学定数を使う

mathモジュールには様々な数学定数も用意されています。よく使われる定数はπ(math.pi)とe(math.e)ですが、他にもτ(2π)を表すmath.tauや無限大を表すmath.infなどが用意されています。

# πの値を表示
print(math.pi)  # 出力: 3.141592653589793

# eの値を表示
print(math.e)  # 出力: 2.718281828459045

stringで文字列を操作する

文字列はPythonで最もよく使われるデータ型の1つで、stringライブラリは文字列の操作や対話のための追加機能を提供します。Pythonの標準ライブラリの一部として、stringには文字列処理のための定数やクラスが含まれています。

このモジュールでは文字列メソッド用の定数、高度な文字列書式のためのテンプレート文字列クラス、およびヘルパー関数を提供します。

import string

文字列の定数について

stringモジュールは特定の文字列操作に役立つ様々な定数を提供しています。例えば、string.ascii_lettersはすべてのASCII文字(小文字と大文字の両方)を含み、string.digitはすべての数字文字を含みます。さらに、string.punctuationはすべての句読点文字を含む記号を表します。以下はその例です。

# すべてのアスキー文字の表示
print(string.ascii_letters)  # 出力: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

# すべての数字の表示
print(string.digits)  # 出力: '0123456789'

# すべての記号を表示
print(string.punctuation)  # 出力: '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

テンプレート文字列の使用

定数に加えてstringモジュールは、文字列のプレースホルダーを置換する方法を提供するTemplateクラスも提供します。これは、特に動的な文字列を生成する際に便利です。

from string import Template

# テンプレート文字列の生成
t = Template('Hello, $name')

# プレースホルダーへ値の挿入
s = t.substitute(name='Taro')
print(s)  # 出力: 'Hello, Taro'

この例では$nameはプレースホルダーで、substitute()メソッドを使って指定した値で置き換えられます。

reで正規表現を扱う

Pythonでは正規表現が文字列を扱うための強力なツールとなっています。Pythonの標準ライブラリの一部であるreモジュールは正規表現をサポートしています。

このモジュールは、検索、置換、文字列の分割など、正規表現を使って文字列を操作するための様々な関数や定数を提供します。

import re

文字列のパターンを検索する

reモジュールの一般的な使い方のひとつに文字列の中から特定のパターンを検索することがあります。search()関数はマッチした場合、マッチオブジェクトを返し、マッチしなかった場合はNoneを返します。以下はその例です。

# 文字列内の「Python」を探査
s = "私はPythonを勉強しています!"
match = re.search('Python', s)
if match:
    print("発見!")
else:
    print("なし")

この例ではsearch()関数を使って、文字列の中からPythonという単語を探し出しています。

正規表現を使って文字列を置き換える

reモジュールではsub()関数を使って文字列の一部を置き換えることもできます。この関数は検索パターンが出現するすべての文字列を新しい文字列で置き換えます。以下に、その使い方を紹介します。

# 「Python」を「Java」に置き換え
s = "私はPythonを勉強しています!Pythonは面白いです!"
new_s = re.sub('Python', 'Java', s)
print(new_s)  # 出力: "私はJavaを勉強しています!Javaは面白いです!"

この例ではsub()関数を使用して文字列中のPythonJavaに置き換えています。

difflibで差分を扱う

テキストデータを扱う場合、文字列間の差分を比較・分析することがよくあります。Pythonの標準ライブラリの一部であるdifflibモジュールがリストや文字列などの配列を比較する関数を提供しています。これらのツールは、配列間の共通要素や相違点を特定でき、difflibはファイルの差分やパッチファイルの作成などの作業に特に有用です。

このモジュールは、配列を比較し、人間が読める差分を生成するのに役立つクラスと関数を提供します。

import difflib

文字列の比較

difflibモジュールにはget_close_matches()という関数があり、指定した入力文字列に近い文字列をリストで見つけることができます。以下はその例です。

import difflib

# リストの定義
words = ['cat', 'bat', 'rat', 'hat', 'mat']

# catに似た文字列を探す
matches = difflib.get_close_matches('cat', words)
print(matches)  # 出力: ['cat', 'bat', 'rat']

この例ではget_close_matches()関数がリストの中からcatに似た単語を探し出します。

Differを使った配列の比較

difflibモジュールにはDifferというクラスもあり、これを使うと行ごとの違いを表示してきめ細かく配列を比較できます。ここではその使い方を紹介します。

import difflib

# 2つの文字列を定義
str1 = 'Hello World'
str2 = 'Hello world'

# Differオブジェクトの生成
d = difflib.Differ()

# 2つの文字列を比較
diff = d.compare(str1, str2)
print('\n'.join(diff))

この例では2つの文字列を比較するためにDifferが使用されています。出力には2つの文字列の差分が一行ずつ表示されます。

textwrapで行の折り返しや空白を整形する

Pythonのtextwrapモジュールは、標準ライブラリの一部で行を折り返したり埋めたりすることでテキスト出力をフォーマットする機能を提供します。幅を固定するなど、特定の方法でテキストを出力する必要がある場合に便利なユーティリティです。インデントや改行ルールなどをカスタマイズできる多くのオプションが付属しています。

import textwrap

テキストの折り返しと塗りつぶし

textwrapモジュールが提供する2つの主要な機能はテキストの折りたたみ(ラップ)と充填(フィリング)です。ラップは各行が最大で与えられた文字数を含むように入力段落を分割します。一方、フィリングはラップに似ていますが、行のリストの代わりに改行が埋め込まれた単一の文字列を返します。

import textwrap

# 長めのテキストの定義
text = "This is a very very very long string that we're going to split into multiple lines."

# テキストを20文字ごとに分割
wrapped_text = textwrap.wrap(text, width=20)
for line in wrapped_text:
    print(line)

# 一つの文字列として20文字ごとに分割
filled_text = textwrap.fill(text, width=20)
print(filled_text)

インデントを調整する

textwrapモジュールではテキストのインデントを調整できます。これは構造化された出力を作成したり、ぶら下がったインデントを持つテキストブロックを印刷する必要がある場合に便利です。ここではインデントを追加する方法を説明します。

import textwrap

# 文字列の定義
text = "This is a line of text that we're going to indent."

# テキストをインデントする
indented_text = textwrap.indent(text, '    ')  # 4つのスペースを挿入
print(indented_text)

unicodedataで文字コードを正規化する

今日のグローバル化したデジタル環境ではUnicodeデータを効率的に扱うことが重要です。標準ライブラリの一部であるPythonのunicodedataモジュールは、Unicode文字データベースへのアクセスを提供することでこの実現に貢献します。Unicode文字のプロパティを取得したり、文字のカテゴリを決定したり、正規化を処理したりするのに役立ちます。

import unicodedata

ユニコード文字のプロパティを取得する

unicodedataモジュールはUnicode文字のプロパティを取得するためのいくつかの関数を提供します。例えば、name()関数は文字に割り当てられた名前を返し、category()関数はその文字の一般的なカテゴリを返します。以下はその例です。

import unicodedata

# 文字種を取得
char_name = unicodedata.name('A')
print(char_name)  # 出力: 'LATIN CAPITAL LETTER A'

# 文字カテゴリを取得
char_category = unicodedata.category('A')
print(char_category)  # 出力: 'Lu' (Letter, uppercase)

この例では文字Aの名前とカテゴリを取得しています。

Unicode正規化

Unicode正規化とはUnicode文字列を標準的な形に変換する処理で、文字列を比較するときに便利です。unicodedataモジュールはこのためにnormalize()関数を提供しています。以下はその例です。

import unicodedata

# Unicode文字の正規化
s = 'Café'
normalized_s = unicodedata.normalize('NFD', s)
print(normalized_s)  # 出力: 'Café'

この例ではnormalize()関数がé文字を基底文字eとアクセントに分解しています。

readlineでCLIの入出力を改善する

コマンドラインアプリケーションで作業する場合、入力と出力の処理は使いやすさの重要な側面となります。Pythonのreadlineモジュールは標準ライブラリの一部で、行編集、履歴保存、テキスト予測などの機能を提供し、コマンドラインインターフェイスの経験を向上させます。

import readline

基本的な行編集

readlineモジュールはbashやtcshのようなシェルに見られるような行編集機能を提供します。ユーザーはカーソルを動かしたり、文字を削除したり、テキストを殺す(削除して保存し、後で貼り付ける)ことができます。ただし、このモジュールはPythonの対話型シェルのような対話型セッションで動作するものであり、通常のPythonスクリプトでその機能を示すことはありません。しかし、Pythonの対話型セッションでreadlineモジュールをインポートし、テキスト入力を試すことで、これらの機能を自分で体験できます。

コマンド履歴の処理

readlineのもう1つの大きな特徴はコマンドの履歴を扱うことができることです。ユーザーが入力したコマンドを記録しておき、その中からナビゲートできるようにするのです。履歴から特定のコマンドを取り出すには、get_history_item()関数を使用できます。get_current_history_length()関数は、現在保存されているヒストリーの行数を返します。

import readline

# いくつかのコマンドが入力されたと仮定

# コマンド履歴の行数を取得する
history_length = readline.get_current_history_length()
print(history_length)

# 最後のコマンドを取得
last_command = readline.get_history_item(history_length)
print(last_command)

履歴機能はスタンドアロンのスクリプトではなく、インタラクティブなPythonセッションで動作することを忘れないでください。

codecsでエンコード・デコードを操作する

テキストデータを扱う場合、異なるフォーマット間でエンコードやデコードすることがよくあります。Pythonの標準ライブラリの一部であるcodecsモジュールは、様々なコーデック(符号化器・復号器)を使ってデータをエンコード・デコードする関数を提供します。UTF-8やASCIIなどのテキストエンコーディングと、base64や16進数などのバイナリエンコーディングの両方をサポートしています。

import codecs

テキストのエンコードとデコード

codecsモジュールはテキストデータを異なるエンコーディングに変換するためのencode()decode()関数を提供します。ここでは文字列をUTF-8と相互変換する例を示します。

import codecs

# UTF-8へエンコード
encoded = codecs.encode('Hello, world!', 'utf-8')
print(encoded)  # 出力: b'Hello, world!'

# 標準文字へデコード
decoded = codecs.decode(encoded, 'utf-8')
print(decoded)  # 出力: 'Hello, world!'

この例ではencode()関数は、文字列のUTF-8エンコーディングを表すバイト列であるbytesオブジェクトを返します。そして、decode()関数はこのbytesオブジェクトを通常の文字列に変換して返します。

バイナリデータのエンコードとデコード

codecsモジュールはbase64などのバイナリーエンコーディングもサポートしています。ここではbase64を使ったデータのエンコードとデコードの例を紹介します。

import codecs

# base64へエンコード
encoded = codecs.encode(b'Hello, world!', 'base64')
print(encoded)  # 出力: b'SGVsbG8sIHdvcmxkIQ==\n'

# 標準データへデコード
decoded = codecs.decode(encoded, 'base64')
print(decoded)  # 出力: b'Hello, world!'

この例ではencode()関数は、データのbase64エンコードを表すbytesオブジェクトを返します。そして、decode()関数はこのbase64データを元の形式に変換します。

zoneinfoでタイムゾーンを取り扱う

タイムゾーンの取り扱いは多くのPythonアプリケーションで共通の要件です。バージョン3.9から導入されたPythonのzoneinfoモジュールは標準ライブラリの一部でIANAタイムゾーンのサポートを提供し、タイムゾーンの取り扱いをより簡単にしています。

import zoneinfo

zoneinfoの基本的な使い方

特定のタイムゾーンを扱うにはそのタイムゾーン用のZoneInfoオブジェクトを作成する必要があります。このオブジェクトをdatetimeastimezone()関数で使用すると、datetimeオブジェクトを目的のタイムゾーンに変換できます。

# 東京のタイムゾーンでZoneInfoオブジェクトの生成
tz = ZoneInfo('Japan/Tokyo')

# 現在日時を取得
now = datetime.now()

# 東京のタイムゾーンで変換
jp_time = now.astimezone(tz)

print(jp_time)  # 東京の現在日時を表示

calendarで日付をより広範囲で扱う

Pythonのcalendarモジュールは、カレンダーに関連する出力を処理するための幅広い機能を提供します。カレンダーの印刷から、ある年がうるう年かどうかの検索まで、Pythonのcalendarモジュールはそれをカバーしています。Pythonで日付や時刻のデータを扱う際には必須のライブラリです。

import calendar

カレンダーの表示とうるう年の識別

calendarモジュールでは指定された月や年のテキストカレンダーを作成できます。以下は、2023年5月のテキストカレンダーを印刷する例です。

import calendar

# 2023年5月のテキストカレンダー
print(calendar.month(2023, 5))

さらにisleap()関数である年がうるう年かどうかを確認できます。

# 2024年がうるう年かどうか
print(calendar.isleap(2024))  # 出力: True

平日を利用する

calendarモジュールを使えば特定の日付の曜日を調べることもできます。Pythonは月曜日を0、日曜日を6として表現します。weekday()関数は、与えられた年、月、日の曜日を返します。

# 2023/5/18の曜日を出力
day = calendar.weekday(2023, 5, 18)
print(day)  # 出力: 3 (木曜日を示す)

copyで配列・辞書の罠を回避する

Pythonのcopyモジュールは、リストや辞書のような複雑なオブジェクトのコピーを作成する必要がある場合に、同じオブジェクトへの参照ではなく必須のユーティリティとなります。初心者にありがちな罠は、複雑なオブジェクトがミュータブルであることで代入演算子を使ってコピーしたときに予期せぬ動作をすることです。

import copy

シャローコピーとディープコピーの比較

copyモジュールがサポートするコピーにはシャローコピーとディープコピーの2種類があります。シャローコピーは、新しい複合オブジェクトを構築し、その中にオリジナルで見つかったオブジェクトへの参照を挿入します。一方、ディープコピーは、新しい複合オブジェクトを構築し、そこへ再帰的にオリジナルのオブジェクトをコピーし挿入するものです。

これをリストで説明しましょう。

# リスト内リストを生成
original = [[1, 2, 3], [4, 5, 6]]

# シャローコピーを作成
shallow_copy = copy.copy(original)

# ディープコピーを作成
deep_copy = copy.deepcopy(original)

# 最初のサブリストを変更
shallow_copy[0][0] = 99

# 最初のリストを表示
print(original)  # 出力: [[99, 2, 3], [4, 5, 6]]

この例では、オリジナルのサブリストの変更はshallow_copyには反映されるがdeep_copyには反映されません。

ご覧のように、元のリストにも変更が反映されています。しかし、deep_copyに同じ変更を加えても元のリストは変わりません。

collectionsでデータ型を強化する

PythonのcollectionsモジュールはPythonの組み込みデータ構造を超える追加のデータ型を提供する強力なライブラリです。このモジュールは、機能を強化しPythonコードの効率を向上させます。defaultdictnamedtupledequeCounterOrderedDictなどの便利なデータ構造が含まれています。

import collections

defaultdictとCounterの威力

まず、collectionsモジュールにある2つの人気クラス、defaultdictCounterを調べてみましょう。

defaultdictは通常のPython辞書とほぼ同じように動作しますが、存在しないキーにアクセスしようとしてもKeyErrorを発生させません。その代わりにデフォルトの値で初期化されます。

from collections import defaultdict

# デフォルト整数を使ったdefaultdictの作成
d = defaultdict(int)

# 存在しないキーへアクセス
print(d['non_existent_key'])  # 出力: 0

一方、Counterはハッシュ可能なオブジェクトをカウントするためのdictサブクラスです。これは要素が辞書のキーとして格納され、そのカウントが辞書の値として格納されるコレクションです。

from collections import Counter

# Counterを生成
c = Counter('Hello World!')
print(c)  # 出力: Counter({'l': 3, 'o': 2, 'H': 1, 'e': 1, ' ': 1, 'W': 1, 'r': 1, 'd': 1, '!': 1})

namedtupleとdequeの柔軟性

namedtupleは名前付きフィールドを持つtupleのサブクラスを生成します。より意味のあるコンテキストを提供することでコードをすっきりさせ読みやすくする簡単な方法です。

from collections import namedtuple

# namedtupleの生成
Person = namedtuple('Person', ['name', 'age'])

# Personオブジェクトの生成
taro = Person(name='Taro', age=30)

print(taro.name)  # 出力: Taro
print(taro.age)   # 出力: 30

deque(ダブルエンド・キュー)はスタックとキューを一般化したものです。スレッドセーフでメモリ効率の良い追加と削除が可能で、どちらの側からもほぼ同じO(1)の性能が得られます。

from collections import deque

# dequeの作成
d = deque()

# 要素の追加
d.append('a')
d.append('b')
d.append('c')

print(d)  # 出力: deque(['a', 'b', 'c'])

# 右側から要素を削除
print(d.pop())  # 出力: 'c'

# 左側から要素を削除
print(d.popleft())  # 出力: 'a'

pprintでデバッグ出力を読みやすくする

Pythonのpprintモジュールは、Pythonのデータ構造を整形して読みやすく表示する機能を提供します。特にネストしたリストや辞書など、従来のprint関数ではうまく表示できないような複雑なデータを扱う場合に便利です。

from pprint import pprint

Pythonのデータ構造を美しくする

伝統的に表示すると読みづらい入れ子の辞書の例について考えてみましょう。

data = {"name": "John", "age": 30, "cities": ["New York", "Los Angeles", "Chicago"], "education": {"highschool": "ABC High", "university": "XYZ Uni"}}

# 通常の表示
print(data)

このコードでは辞書が1行で表示されるため、可読性が落ちます。では、pprintを使ってみましょう。

# pprintで表示
pprint(data)

pprint関数は、キーと値のペアがそれぞれ改行された、より構造化された形式で辞書を出力するのでより読みやすくなります。

出力の幅をコントロールする

pprintモジュールのもう1つの特徴は出力の幅を制御できることです。これはpprint関数にwidthパラメータを渡すことで実現できます。

# pprintで幅を指定する
pprint(data, width=1)

この例ではwidth=1によって、リストや辞書の各項目が別々の行へ印刷されるようになります。これは長いリストや辞書の場合に便利です。

enumで列挙型を作成する

Pythonのenumモジュールは、値の集合を表す記号的な名前である列挙を作成できます。列挙型は反復可能で不変であり、一度作成された個々の値を変更は不可能です。列挙型は、特定の値から1つを選ぶことができるもので、コードの可読性を高めるために使用されます。

列挙型は、enumモジュールを使って次のように作成します。

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

コードで列挙型を活用する

上記の例ではColorは3つのメンバーを持つ列挙型(またはEnum)です。 Color.REDColor.GREENColor.BLUEです。これらのメンバーはそれぞれ1、2、3の値を持っています。以下に、それらの使い方を説明します。

# enumメンバーにアクセス
print(Color.RED)  # 出力: Color.RED

# enumメンバーの値を取得
print(Color.RED.value)  # 出力: 1

# enumメンバーの名前を取得
print(Color.RED.name)  # 出力: RED

ご覧のように列挙型は単純な定数よりも読みやすくなっています。また、名前('RED'など)と値(1など)をすばやく関連付けることができます。

列挙型とその利点

列挙型には読みやすさ以外にもいくつかの利点があります。列挙型は反復可能であるため、ループ処理を行うことができます。また、列挙型の値が有効な値の1つであることが保証されるのでバグを防ぐことができます。

# enumの繰り返し処理
for color in Color:
    print(color)

# 不正な値のセットを試みるとAttributeErrorを起こす
Color.RED = 4

randomで乱数を作成する

Pythonのrandomモジュールは、ゲーム開発、データ解析、暗号化など、プログラミングの様々な分野で重要な役割を果たす乱数を生成できます。ランダムモジュールは、さまざまな確率分布から乱数を生成するための関数群を提供します。

import random

乱数の生成

Pythonでは、randomモジュールが提供するいくつかの関数を使って乱数を生成できます。そのうちのいくつかを見てみましょう。

# 0~1のランダムな浮動小数点
print(random.random())  # e.g., 出力: 0.874332581665231

# 範囲内のランダムな整数
print(random.randint(1, 10))  # e.g., 出力: 6

# リスト内からランダムで取り出す
print(random.choice(['red', 'green', 'blue']))  # e.g., 出力: 'green'

これらの例ではrandom()は0から1の間のランダムな浮動小数点を生成しています。randint(a, b)aからb(包括)の間のランダムな整数を生成し、choice(list)は与えられたリストの中からランダムに要素を選び出します。

randomモジュールのその他の機能

randomモジュールには単純な乱数生成だけでなく、リストをランダムにシャッフルしたり、ガウス分布や指数分布などの異なる分布から乱数を生成したり、ランダムビットを生成する関数もあります。

# リストのシャッフル
my_list = [1, 2, 3, 4, 5]
random.shuffle(my_list)
print(my_list)  # e.g., 出力: [3, 2, 5, 1, 4]

# ガウス分布でランダムな数値を取り出す
print(random.gauss(mu=0, sigma=1))  # e.g., 出力: -0.17287094779120443

続きは下記リンクからご覧ください。

Pythonのよく使う標準ライブラリ一覧と使い方の例 その2

関連するコンテンツ