174:2進、8進、10進、16進の各表現を相互に変換
文字列から数値型へ
int 関数の第1引数に「数値と解釈できる文字列」を、第2引数に基数を与えます。基数は 36 まで受け付けます。
>>> int("1010", 2)
10
>>> int("12", 8)
10
>>> int("10", 10)
10
>>> int("a", 16)
10
>>> int("20", 5)
10
第2引数を省略すると基数に 10 を指定したものとみなされます。
>>> int("10")
10
第1引数を「整数リテラルとおなじ書式の文字列」、第2引数を 0 とすると int 関数は基数を推測しつつ変換します。
>>> int("010", 0)
8
>>> int("0x10", 0)
16
数値型からへ文字列へ
数値を 10進数表記の文字列に変換するのは str 関数で問題ありません。
>>> str(10) '10'
数値を 8進数、16進数表記の文字列に変換するには 文字列フォーマット操作 で %o, %x を用います。
>>> '%o' % 10 '12' >>> '%x' % 10 'a'
数値を 8進数、16進数表記の整数リテラル風に変換するにはそれぞれ oct, hex 関数を用います。
>>> oct(10) '012' >>> hex(10) '0xa'
10, 8, 16 以外の基数に対応するにはすこしだけコードを書く必要がありそうです。
int2str_table = '0123456789abcdefghijklmnopqrstuvwxyz'
def int2str(i, base):
u"""
数値型を文字列に変換する。
i 数値
base 基数 (2から36の間の値)
"""
if not 2 <= base <= 36:
raise ValueError('base must be 2 <= base < 36')
result = []
temp = abs(i)
if temp == 0:
result.append('0')
else:
while temp > 0:
result.append(int2str_table[temp % base])
temp /= base
if i < 0:
result.append('-')
return ''.join(reversed(result))
assert len(int2str_table) == 36
for i in range(36):
if i < 10:
assert str(i) == int2str_table[i]
else:
assert chr(ord('a') + i - 10) == int2str_table[i]
>>> int2str(10, 2) '1010' >>> int2str(10, 8) '12' >>> int2str(10, 16) 'a' >>> int2str(10, 5) '20'
文字列から文字列へ
いったん数値に直してから文字列へ再変換します。
>>> s8 = '12' # 8進数 >>> i = int(s8, 8) # 数値型へ >>> s16 = '%x' % i # 16進数 >>> s16 'a'
Python 3000
Python 3.0 では 2進整数リテラルが追加、そして8進整数リテラルの接頭辞に変更が加わります。 2進リテラルは 0b1010 のように 0b を付与します。 8進リテラルは 0 ではなく 0o を付与します。
その影響で 2進整数リテラル風の文字列への変換関数 bin が追加されます。 oct の変換結果も 0o から始まるようになります。
>>> bin(10) '0b1010' >>> oct(10) '0o12'