Pythonのプログラミングでよく利用される膨大な標準ライブラリの便利さを再発見するために書きました。
osによるファイル操作
Pythonの標準ライブラリにはオペレーティングシステムに関連するタスクを処理するのに役立つモジュールのスイートが用意されています。そのような強力なモジュールの1つが os
で、Windows、Mac、Linuxなど、Pythonが動作している基本的なオペレーティングシステムとのインターフェースを提供します。
os
モジュールを使って、ファイルやディレクトリの操作、環境変数の読み取り、プロセスのフォークなど、さまざまなことができます。ディレクトリの作成、ファイル名の変更、ディレクトリのウォークスルーなど、ファイルI/O操作したいときに便利です。
ファイルやディレクトリを操作する
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
は異なるオペレーティングシステム間でシームレスに動作しスクリプトをポータブルにします。
ファイルのコピーと移動
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_path
と dst_directory_path
はそれぞれソースファイルとデスティネーションディレクトリのパスに置き換える必要があります。
ファイルやディレクトリの削除
shutil
のもう1つの使い方はファイルやディレクトリを削除することです。この目的のためにPythonは shutil.rmtree()
関数を提供しており、ディレクトリツリー全体、つまり、与えられたパス内のすべてのディレクトリとファイルを削除できます。
以下はその使用例です。
import shutil
# 指定ディレクトリ以下を削除
shutil . rmtree ( "directory_path" )
shutil.rmtree()
を不適切に使用すると重要なファイルを削除してしまう可能性があるため、使用中は注意する必要があることに注意してください。
datetimeで日付と時刻を管理する
プログラミングの世界では日付を表示するための書式設定、経過時間の計算、将来のタスクのスケジューリングなど、日付や時刻を扱うことはよくある作業です。Pythonの標準ライブラリに含まれる datetime
モジュールは、単純な方法から複雑な方法まで、日付と時刻を操作するためのクラスを提供しています。
datetime
モジュールには、date
、time
、datetime
、timedelta
などのクラスがあります。
日付と時刻を操作する
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
モジュールを使うと、ソケットオブジェクトを作成し、様々なネットワーク関連のタスクのためにそれらを制御できます。
ソケットの作成
ソケットを作成するには新しいソケットオブジェクトを初期化し、通信の種類を指定する必要があります。ここではソケットを作成する基本的な例を紹介します。
# ソケットオブジェクトの生成
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
モジュールには、三角法、複素数、対数、累乗などの関数が含まれています。
このモジュールは様々な数学関数、定数、計算ユーティリティを提供します。
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
には文字列処理のための定数やクラスが含まれています。
このモジュールでは文字列メソッド用の定数、高度な文字列書式のためのテンプレート文字列クラス、およびヘルパー関数を提供します。
文字列の定数について
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
モジュールは正規表現をサポートしています。
このモジュールは、検索、置換、文字列の分割など、正規表現を使って文字列を操作するための様々な関数や定数を提供します。
文字列のパターンを検索する
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()
関数を使用して文字列中のPython
をJava
に置き換えています。
difflibで差分を扱う
テキストデータを扱う場合、文字列間の差分を比較・分析することがよくあります。Pythonの標準ライブラリの一部であるdifflib
モジュールがリストや文字列などの配列を比較する関数を提供しています。これらのツールは、配列間の共通要素や相違点を特定でき、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
モジュールは、標準ライブラリの一部で行を折り返したり埋めたりすることでテキスト出力をフォーマットする機能を提供します。幅を固定するなど、特定の方法でテキストを出力する必要がある場合に便利なユーティリティです。インデントや改行ルールなどをカスタマイズできる多くのオプションが付属しています。
テキストの折り返しと塗りつぶし
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文字のプロパティを取得したり、文字のカテゴリを決定したり、正規化を処理したりするのに役立ちます。
ユニコード文字のプロパティを取得する
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
モジュールは標準ライブラリの一部で、行編集、履歴保存、テキスト予測などの機能を提供し、コマンドラインインターフェイスの経験を向上させます。
基本的な行編集
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進数などのバイナリエンコーディングの両方をサポートしています。
テキストのエンコードとデコード
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タイムゾーンのサポートを提供し、タイムゾーンの取り扱いをより簡単にしています。
zoneinfoの基本的な使い方
特定のタイムゾーンを扱うにはそのタイムゾーン用のZoneInfo
オブジェクトを作成する必要があります。このオブジェクトをdatetime
のastimezone()
関数で使用すると、datetime
オブジェクトを目的のタイムゾーンに変換できます。
# 東京のタイムゾーンでZoneInfoオブジェクトの生成
tz = ZoneInfo ( 'Japan/Tokyo' )
# 現在日時を取得
now = datetime . now ( )
# 東京のタイムゾーンで変換
jp_time = now . astimezone ( tz )
print ( jp_time ) # 東京の現在日時を表示
calendarで日付をより広範囲で扱う
Pythonのcalendar
モジュールは、カレンダーに関連する出力を処理するための幅広い機能を提供します。カレンダーの印刷から、ある年がうるう年かどうかの検索まで、Pythonのcalendar
モジュールはそれをカバーしています。Pythonで日付や時刻のデータを扱う際には必須のライブラリです。
カレンダーの表示とうるう年の識別
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
モジュールは、リストや辞書のような複雑なオブジェクトのコピーを作成する必要がある場合に、同じオブジェクトへの参照ではなく必須のユーティリティとなります。初心者にありがちな罠は、複雑なオブジェクトがミュータブルであることで代入演算子を使ってコピーしたときに予期せぬ動作をすることです。
シャローコピーとディープコピーの比較
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コードの効率を向上させます。defaultdict
、namedtuple
、deque
、Counter
、OrderedDict
などの便利なデータ構造が含まれています。
defaultdictとCounterの威力
まず、collections
モジュールにある2つの人気クラス、defaultdict
とCounter
を調べてみましょう。
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
モジュールのもう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.RED
、Color.GREEN
、Color.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
モジュールは、ゲーム開発、データ解析、暗号化など、プログラミングの様々な分野で重要な役割を果たす乱数を生成できます。ランダムモジュールは、さまざまな確率分布から乱数を生成するための関数群を提供します。
乱数の生成
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