新単語 format 特定のフォーマットに従って文字列整形する
構文 formatメソッド
txt.format(*args, **kwargs)
txt :書式文字列
args :書式に割り当てる値(可変長引数)
kwargs :書式に割り当てる値(キーワード可変長引数)
これまでが文字の整形
これからが書式の指定だと思います。
構文 書式指定子
[[fill]align][sign][#][0][width][group_opt][.prec][type]
fill :桁数不足時に埋め込む文字(規定は空白)
align :配置指定
sign :符号
width :最小の表示幅(省略時はその値の幅)
group_opt :桁区切り文字
prec :有効桁数
type :データ型
この行のコードはPythonのstr.format()
関数を使用しています。str.format()
は非常に柔軟性が高く、さまざまなフォーマット指定子を用いて文字列を整形できます。
ここで使われている'{0:#_x}'
というフォーマット指定子について解説します。
{0}
:format()
メソッドの最初の引数(インデックスが0)を参照します。#
:#
オプションは、"0x"などの適切な接頭辞を出力することを指示します。今回はx
(16進数)フォーマットが指定されているので、"0x"接頭辞が付きます。_
: アンダースコア_
は数値の3桁ごとに区切り記号を挿入します。Python 3.6以降では、大きな数値を見やすくするためのこの機能が追加されました。x
: このフォーマット指定子は、数値を16進数(小文字)で表示することを指示します。
したがって、この行のコードは、format
関数の引数(0x5f5bce1aa
)を16進数表記に変換し、それに"0x"接頭辞を付けて、3桁ごとにアンダースコアを挿入して出力します。具体的には、"0x5_f5bc_e1aa"といった形になります。
3桁ごとに区切るのにf5bcになるのはなぜ?
この場合、「3桁ごとに区切る」という説明は、少し混乱を招くかもしれません。_
フォーマット指定子は、数値を「3桁ごと」に区切るというよりは、「1000の位」ごとに区切るものです。
ただし、x
フォーマット指定子は16進数(基数16)を使用しているため、16のべき乗ごとに区切りを挿入します。つまり、16^4(=65536)の位、16^8の位、16^12の位…といった具体的な位置になります。
ですので、0x5f5bce1aa
を見てみると、下4桁(e1aa)、次の4桁(5bce)、その次の1桁(5)というように、16進数表記で4桁ごとに区切りが挿入されます。これが「f5bc_e1aa」という出力に繋がります。
0x5_f5bc_e1aa答えはこれなんだが、もう一度解説してくれ、子供でも分かりやすく。
もちろんです。この例では、Pythonのフォーマット機能を使って数値を特定の形式で表示しています。
0x5f5bce1aa
は16進数表記の数値です。16進数は、0-9の数字とa-fの6つの文字を使って数を表現します。aは10、bは11、cは12、dは13、eは14、fは15を表します。.format(0x5f5bce1aa)
で、この数値をフォーマットします。ここでの0x5f5bce1aa
は16進数の数値を表しています。フォーマット指定子
'{0:#_x}'
は数値をどのように表示するかを指示します。0:
は、.format()
の中の最初の値(つまり、0x5f5bce1aa
)を使用することを示しています。#
は、数値を16進数として表示する際に0x
を数値の前に表示することを示します。_
は、数値を1000の位ごとにアンダースコア_
で区切ることを示します。ただし、16進数の場合は4桁ごとに区切ります(なぜなら、16の4乗が10000近いからです)。x
は、数値を16進数で表示することを示しています。
その結果、
0x5_f5bc_e1aa
が出力されます。これは元の数値0x5f5bce1aa
を、4桁ごと(16進数での1000の位ごと)に_
で区切った形式で表示しています。
なお、0x
は16進数を示すプレフィックスです。したがって、0x5_f5bc_e1aa
は16進数で5f5bce1aaを表し、それを4桁ずつにアンダースコアで区切って表示しています。
3桁4桁4桁になるのは
Pythonの動きが右から左に向かって作用していくためのようです。
コメント