Python 3: Deep Dive (Part 1 - Functional): 基数 (セクション4-2/11)
Pythonの整数は`int`クラスのオブジェクトであり、数値や文字列から整数を作成する2つのコンストラクタが用意されています。
Pythonは2進数、8進数、16進数の表現をサポートし、カスタムコードを使って任意の基数での数値変換も可能です。
`from_base10`関数で10進数を他の基数に変換し、`encode`関数でその数値を文字列にエンコードすることができます。
Python 3: Deep Diveシリーズのこのエピソードでは、整数コンストラクタとPythonにおける数値基数の概念について詳しく説明します。セクション4のレッスン32と33では、これらのトピックを詳細に探求し、Pythonが整数やさまざまな数値基数をどのように扱うかを理解するための理論的な洞察と実践的なコード例が提供されています。
レッスン32: 整数コンストラクタと基数 - 理論的な概要
Pythonでは、整数は単なる数字以上のものであり、`int`クラスからインスタンス化されたオブジェクトです。つまり、整数も他のPythonオブジェクトと同様に、新しい整数のインスタンスを作成するためのコンストラクタを持っています。`int`クラスは、主に2つのコンストラクタを提供しています。
単一パラメータコンストラクタ: このコンストラクタは、整数、浮動小数点数、あるいはブール値などの数値をパラメータとして受け取ります。浮動小数点数や小数値を渡すと、Pythonは小数部分を切り捨て、整数部分だけを残します。例えば:
a = int(10.9) # 結果は10
この切り捨ては四捨五入とは異なり、Pythonは単に小数部分を切り捨てます。
文字列と基数コンストラクタ: 2つ目のコンストラクタは、文字列から整数を生成するために使用されます。このコンストラクタは、文字列とともに、数値の基数を指定するためのオプションの2番目のパラメータも受け取ります。例えば:
a = int("1010", 2) # "1010"を2進数として解釈し、10進数で10に変換
このコンストラクタは、2から36までの基数をサポートしており、10を超える基数(例: 16進数)では、大文字と小文字の区別はありません(例えば、A-Fやa-fを使用します)。
また、Pythonには他の基数に整数を変換するための組み込み関数も用意されています:
`bin()`: 整数を2進数表記に変換します。
`oct()`: 整数を8進数表記に変換します。
`hex()`: 整数を16進数表記に変換します。
これらの関数は、それぞれの基数を示すために、結果に`0b`、`0o`、`0x`というプレフィックスを付けます。
レッスン33: 整数コンストラクタと基数 - 実践的なコーディング
理論から実践に移り、レッスン33では基数変換とエンコードをPythonでどのように実装するかを解説します。ここでは、主な概念とコードスニペットの要点を紹介します。
def from_base10(n, b):
if b < 2 or n < 0:
raise ValueError('Base b must be >= 2 and n must be >= 0')
digits = []
while n > 0:
n, m = divmod(n, b)
digits.insert(0, m)
return digits
def encode(digits, digit_map):
if max(digits) >= len(digit_map):
raise ValueError("digit_map is not long enough to encode digits")
encoding = ''.join([digit_map[d] for d in digits])
return encoding
def rebase_from10(number, base):
digit_map = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
sign = -1 if number < 0 else 1
number *= sign
digits = from_base10(number, base)
encoding = encode(digits, digit_map)
if sign == -1:
encoding = '-' + encoding
return encoding
関数をテストする例:
print(rebase_from10(3451, 16)) # 出力: D7B
print(rebase_from10(-4095, 16)) # 出力: -FFF
これらの例は、Pythonがさまざまな基数で数値を柔軟に変換し、表現できることを示しています。これは、非10進数の数値システムを使用するデータを扱う際に非常に強力な機能です。
結論
セクション4のレッスン32と33は、Pythonが整数や数値基数をどのように扱うかについての深い洞察を提供し、理論と実践の架け橋となる内容です。これらの概念をマスターすることで、さまざまな形式で数値を操作する能力を身に付けることができ、多くのプログラミング作業において重要なスキルとなります。バイナリデータの扱いや16進数の色の表現、あるいはPythonの数値システムをより深く理解したい場合など、これらのレッスンは必要な基盤を提供します。
このブログ投稿は、レッスンの重要な側面を網羅し、これらの概念に不慣れな読者にもわかりやすく説明しています。さらに詳細を追加したい場合や調整が必要な場合は、お知らせください。