5.2.11 文字を整形する
新単語 format   特定のフォーマットに従って文字列整形する

構文 formatメソッド
txt.format(*args, **kwargs)
txt :書式文字列
args :書式に割り当てる値(可変長引数)
kwargs :書式に割り当てる値(キーワード可変長引数)

print('{}は{}, {}歳です。'.format('サクラ', '女の子', 2))
サクラは女の子, 2歳です。

 name = 'サクラ'
 sex = '女の子'
 age = 2
 print(f'{name}は{sex}、{age}歳です。')
サクラは女の子、2歳です。

これまでが文字の整形

これからが書式の指定だと思います。

構文 書式指定子
[[fill]align][sign][#][0][width][group_opt][.prec][type]
fill :桁数不足時に埋め込む文字(規定は空白)
align :配置指定
sign :符号
width :最小の表示幅(省略時はその値の幅)
group_opt :桁区切り文字
prec :有効桁数
type :データ型

print('{0:#_x}'.format(0x5f5bce1aa))
0x5_f5bc_e1aa

この行のコードはPythonのstr.format()関数を使用しています。str.format()は非常に柔軟性が高く、さまざまなフォーマット指定子を用いて文字列を整形できます。

ここで使われている'{0:#_x}'というフォーマット指定子について解説します。

  1. {0}: format()メソッドの最初の引数(インデックスが0)を参照します。

  2. #: #オプションは、"0x"などの適切な接頭辞を出力することを指示します。今回はx(16進数)フォーマットが指定されているので、"0x"接頭辞が付きます。

  3. _: アンダースコア_は数値の3桁ごとに区切り記号を挿入します。Python 3.6以降では、大きな数値を見やすくするためのこの機能が追加されました。

  4. 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のフォーマット機能を使って数値を特定の形式で表示しています。

  1. 0x5f5bce1aaは16進数表記の数値です。16進数は、0-9の数字とa-fの6つの文字を使って数を表現します。aは10、bは11、cは12、dは13、eは14、fは15を表します。

  2. .format(0x5f5bce1aa)で、この数値をフォーマットします。ここでの0x5f5bce1aaは16進数の数値を表しています。

  3. フォーマット指定子'{0:#_x}'は数値をどのように表示するかを指示します。

    • 0:は、.format()の中の最初の値(つまり、0x5f5bce1aa)を使用することを示しています。
    • #は、数値を16進数として表示する際に0xを数値の前に表示することを示します。
    • _は、数値を1000の位ごとにアンダースコア_で区切ることを示します。ただし、16進数の場合は4桁ごとに区切ります(なぜなら、16の4乗が10000近いからです)。
    • xは、数値を16進数で表示することを示しています。
  4. その結果、0x5_f5bc_e1aaが出力されます。これは元の数値0x5f5bce1aaを、4桁ごと(16進数での1000の位ごと)に_で区切った形式で表示しています。

なお、0xは16進数を示すプレフィックスです。したがって、0x5_f5bc_e1aaは16進数で5f5bce1aaを表し、それを4桁ずつにアンダースコアで区切って表示しています。


3桁4桁4桁になるのは
Pythonの動きが右から左に向かって作用していくためのようです。