7rikazhexde’s tech log

技術的な興味関心や備忘録をまとめてます。

Pythonのprint関数の形式

Pythonで小数点を含む実数の表示形式で悩むことがあったので、PEP仕様と実際の例を確認して内容をまとめました。
Pythonのprint関数の形式は基本はC言語の文字列フォーマットと同じですが、一部仕様(参考1)により異なります。

形式

[%] (マップキー) (変換フラグ)(最小フィールド幅)(.精度)[フォーマット指定子]

※()はオプションで省略化

構成要素

  • [%]
指定子の開始を示す文字  
  • (マップキー)
丸括弧で囲った文字列で表し、フォーマット化したい値をマップから選び出す  

print('%(language)s has %(number)03d quote types.' %{'language': "Python", "number": 2})  
Python has 002 quote types.  
  • (変換フラグ)
    一部の変換型の結果に影響
'#' : 値の変換に (下で定義されている) "別の形式" を使う。  
'0' : 数値型に対してゼロによるパディングを行う。  
'-' : 変換された値を左寄せにします ('0' と同時に与えた場合、 '0' を上書きする) 。  
' ' : (スペース) 符号付きの変換で正の数の場合、前に一つスペースを空ける (そうでない場合は空文字になる) 。  
'+' : 変換の先頭に符号文字 ('+' または '-') を付ける("スペース" フラグを上書きする) 。  
  • (最小フィールド幅)
・全体の文字数(実数の場合は小数点も含む)  
・最小フィールド幅よりも値が大きい桁数だった場合はそのまま表示される。  
・'*' (アスタリスク) を指定した場合、実際の文字列幅が values タプルの次の要素から読み出されれる。  
・タプルには最小フィールド幅やオプションの精度指定の後に変換したいオブジェクトがくるようにする。  
  • (.精度)
・効数字桁数  
・%.3fの場合、12.3567→12.357となる(小数第4位は四捨五入)  
・指定しない場合は6  
・'.' (ドット) とその後に続く精度で与えられる。 
・'*' (アスタリスク) を指定した場合、精度の桁数は values タプルの次の要素から読み出される。
・タプルには精度指定の後に変換したい値がくるようにする。
  • [フォーマット指定子]
・(精度長変換子:l)と変換型:dで表現される。  
・フォーマット指定子によりその指定子に対応する引数の表示の仕方が決まる。  
・精度長変換子(h, l,または L) を使うことができますが、 Python では必要ないため無視される。  
・つまり、例えば %ld は %d と等価である。  
  • 指定子
'd': 符号付き 10 進整数。  
'i': 符号付き 10 進整数。  
'o': 符号付き 8 進数。(1)  
'u': 旧式の型 -- 'd' と同じです。(6)  
'x': 符号付き 16 進数 (小文字)。(2)  
'X': 符号付き 16 進数 (大文字)。(2)  
'e': 指数表記の浮動小数点数 (小文字)。(3)  
'E': 指数表記の浮動小数点数 (大文字)。(3)  
'f': 10 進浮動小数点数。(3)  
'F': 10 進浮動小数点数。(3)  
'g': 浮動小数点数。指数部が -4 以上または精度以下の場合には小文字指数表記、それ以外の場合には10進表記。(4)  
'G': 浮動小数点数。指数部が -4 以上または精度以下の場合には大文字指数表記、それ以外の場合には10進表記。(4)  
'c': 文字一文字 (整数または一文字からなる文字列を受理する)。  
'r': 文字列 (Python オブジェクトを repr() で変換する)。(5)  
's': 文字列 (Python オブジェクトを str() で変換する)。(5)  
'a': 文字列 (Python オブジェクトを ascii() で変換する)。(5)  
'%': 引数を変換せず、返される文字列中では文字 '%' になる。  
     別の形式を指定(訳注: 変換フラグ # を使用)すると 8 進数を表す接頭辞 ('0o') が最初の数字の前に挿入される。  
  • 注釈
(1)別の形式を指定(訳注: 変換フラグ # を使用)すると 16 進数を表す接頭辞 '0x' または
   '0X' (使用するフォーマット文字が 'x' か 'X' に依存します) が最初の数字の前に挿入される。  
(2)この形式にした場合、変換結果には常に小数点が含まれ、それはその後ろに数字が続かない場合にも適用される。  
(3)指定精度は小数点の後の桁数を決定し、そのデフォルトは 6 。  
(4)この形式にした場合、変換結果には常に小数点が含まれ他の形式とは違って末尾の 0 は取り除かれない。  
   指定精度は小数点の前後の有効桁数を決定し、そのデフォルトは 6 。  
(5)精度が N なら、出力は N 文字に切り詰めらる。  
(6)PEP 237 を参照。

a = 0.12345678
print('----- start a='+str(0.12345678)+'の例 start -----') 
print('%.1f' + 'の値は%.1fです。'%a)
print('%.2f' + 'の値は%.2fです。'%a)
print('%.3f' + 'の値は%.3fです。'%a)
print('%.4f' + 'の値は%.4fです。'%a)
print('%.5f' + 'の値は%.5fです。'%a)
print('%.6f' + 'の値は%.6fです。'%a)
print('%.7f' + 'の値は%.7fです。'%a)
print('%.8f' + 'の値は%.8fです。'%a)
print('%.9f' + 'の値は%.9fです。'%a)

print('%1f' + 'の値は%1fです。'%a)
print('%2f' + 'の値は%2fです。'%a)
print('%3f' + 'の値は%3fです。'%a)
print('%4f' + 'の値は%4fです。'%a)
print('%5f' + 'の値は%5fです。'%a)
print('%6f' + 'の値は%6fです。'%a)
print('%7f' + 'の値は%7fです。'%a)
print('%8f' + 'の値は%8fです。'%a)
print('%9f' + 'の値は%9fです。'%a)
print('%10f' + 'の値は%10fです。'%a)
print('%11f' + 'の値は%11fです。'%a)
print('%12f' + 'の値は%12fです。'%a)

print('%20.1f' + 'の値は%20.1fです。'%a)
print('%20.2f' + 'の値は%20.2fです。'%a)
print('%20.3f' + 'の値は%20.3fです。'%a)
print('%20.4f' + 'の値は%20.4fです。'%a)
print('%20.5f' + 'の値は%20.5fです。'%a)
print('%20.6f' + 'の値は%20.6fです。'%a)
print('%20.7f' + 'の値は%20.7fです。'%a)
print('%20.8f' + 'の値は%20.8fです。'%a)
print('%20.9f' + 'の値は%20.9fです。'%a)
print('%20.10f' + 'の値は%20.10fです。'%a)

print('%-20.1f' + 'の値は%-20.1fです。'%a)
print('%-20.2f' + 'の値は%-20.2fです。'%a)
print('%-20.3f' + 'の値は%-20.3fです。'%a)
print('%-20.4f' + 'の値は%-20.4fです。'%a)
print('%-20.5f' + 'の値は%-20.5fです。'%a)
print('%-20.6f' + 'の値は%-20.6fです。'%a)
print('%-20.7f' + 'の値は%-20.7fです。'%a)
print('%-20.8f' + 'の値は%-20.8fです。'%a)
print('%-20.9f' + 'の値は%-20.9fです。'%a)
print('%-20.10f' + 'の値は%-20.10fです。'%a)
print('----- end a='+str(0.12345678)+'の例 end -----') 

b = 12345678.12345678
print('----- start b='+str(12345678.12345678)+'の例 start -----') 
print('%.1f' + 'の値は%.1fです。'%b)
print('%.2f' + 'の値は%.2fです。'%b)
print('%.3f' + 'の値は%.3fです。'%b)
print('%.4f' + 'の値は%.4fです。'%b)
print('%.5f' + 'の値は%.5fです。'%b)
print('%.6f' + 'の値は%.6fです。'%b)
print('%.7f' + 'の値は%.7fです。'%b)
print('%.8f' + 'の値は%.8fです。'%b)
print('%.9f' + 'の値は%.9fです。'%b)

print('%1f' + 'の値は%1fです。'%b)
print('%2f' + 'の値は%2fです。'%b)
print('%3f' + 'の値は%3fです。'%b)
print('%4f' + 'の値は%4fです。'%b)
print('%5f' + 'の値は%5fです。'%b)
print('%6f' + 'の値は%6fです。'%b)
print('%7f' + 'の値は%7fです。'%b)
print('%8f' + 'の値は%8fです。'%b)
print('%9f' + 'の値は%9fです。'%b)
print('%10f' + 'の値は%10fです。'%b)
print('%11f' + 'の値は%11fです。'%b)
print('%12f' + 'の値は%12fです。'%b)

print('%20.1f' + 'の値は%20.1fです。'%b)
print('%20.2f' + 'の値は%20.2fです。'%b)
print('%20.3f' + 'の値は%20.3fです。'%b)
print('%20.4f' + 'の値は%20.4fです。'%b)
print('%20.5f' + 'の値は%20.5fです。'%b)
print('%20.6f' + 'の値は%20.6fです。'%b)
print('%20.7f' + 'の値は%20.7fです。'%b)
print('%20.8f' + 'の値は%20.8fです。'%b)
print('%20.9f' + 'の値は%20.9fです。'%b)
print('%20.10f' + 'の値は%20.10fです。'%b)

print('%-20.1f' + 'の値は%-20.1fです。'%a)
print('%-20.2f' + 'の値は%-20.2fです。'%a)
print('%-20.3f' + 'の値は%-20.3fです。'%a)
print('%-20.4f' + 'の値は%-20.4fです。'%a)
print('%-20.5f' + 'の値は%-20.5fです。'%a)
print('%-20.6f' + 'の値は%-20.6fです。'%a)
print('%-20.7f' + 'の値は%-20.7fです。'%a)
print('%-20.8f' + 'の値は%-20.8fです。'%a)
print('%-20.9f' + 'の値は%-20.9fです。'%a)
print('%-20.10f' + 'の値は%-20.10fです。'%a)

print('%1.8f' + 'の値は%1.8fです。'%b)
print('%2.8f' + 'の値は%2.8fです。'%b)
print('%3.8f' + 'の値は%3.8fです。'%b)
print('%4.8f' + 'の値は%4.8fです。'%b)
print('%5.8f' + 'の値は%5.8fです。'%b)
print('%6.8f' + 'の値は%6.8fです。'%b)
print('%7.8f' + 'の値は%7.8fです。'%b)
print('%8.8f' + 'の値は%8.8fです。'%b)
print('%9.8f' + 'の値は%9.8fです。'%b)
print('----- end b='+str(12345678.12345678)+'の例 end -----') 
----- start a=0.12345678の例 start -----
%.1fの値は0.1です。
%.2fの値は0.12です。
%.3fの値は0.123です。
%.4fの値は0.1235です。#小数第4位が後ろの5で四捨五入されて桁上がり
%.5fの値は0.12346です。
%.6fの値は0.123457です。
%.7fの値は0.1234568です。
%.8fの値は0.12345678です。
%.9fの値は0.123456780です。#小数第9位は0埋め
%1fの値は0.123457です。
%2fの値は0.123457です。
%3fの値は0.123457です。
%4fの値は0.123457です。
%5fの値は0.123457です。
%6fの値は0.123457です。
%7fの値は0.123457です。
%8fの値は0.123457です。
%9fの値は 0.123457です。
%10fの値は  0.123457です。#10桁なので0埋め
%11fの値は   0.123457です。
%12fの値は    0.123457です。
%20.1fの値は                 0.1です。
%20.2fの値は                0.12です。
%20.3fの値は               0.123です。
%20.4fの値は              0.1235です。
%20.5fの値は             0.12346です。
%20.6fの値は            0.123457です。
%20.7fの値は           0.1234568です。
%20.8fの値は          0.12345678です。
%20.9fの値は         0.123456780です。
%20.10fの値は        0.1234567800です。
%-20.1fの値は0.1                 です。#20文字分で0埋めされて左詰め
%-20.2fの値は0.12                です。
%-20.3fの値は0.123               です。
%-20.4fの値は0.1235              です。
%-20.5fの値は0.12346             です。
%-20.6fの値は0.123457            です。
%-20.7fの値は0.1234568           です。
%-20.8fの値は0.12345678          です。
%-20.9fの値は0.123456780         です。
%-20.10fの値は0.1234567800        です。
----- end a=0.12345678の例 end -----
----- start b=12345678.12345678の例 start -----
%.1fの値は12345678.1です。
%.2fの値は12345678.12です。
%.3fの値は12345678.123です。
%.4fの値は12345678.1235です。
%.5fの値は12345678.12346です。
%.6fの値は12345678.123457です。
%.7fの値は12345678.1234568です。
%.8fの値は12345678.12345678です。
%.9fの値は12345678.123456780です。
%1fの値は12345678.123457です。
%2fの値は12345678.123457です。
%3fの値は12345678.123457です。
%4fの値は12345678.123457です。
%5fの値は12345678.123457です。
%6fの値は12345678.123457です。
%7fの値は12345678.123457です。
%8fの値は12345678.123457です。
%9fの値は12345678.123457です。
%10fの値は12345678.123457です。
%11fの値は12345678.123457です。
%12fの値は12345678.123457です。
%20.1fの値は          12345678.1です。
%20.2fの値は         12345678.12です。
%20.3fの値は        12345678.123です。
%20.4fの値は       12345678.1235です。
%20.5fの値は      12345678.12346です。
%20.6fの値は     12345678.123457です。
%20.7fの値は    12345678.1234568です。
%20.8fの値は   12345678.12345678です。
%20.9fの値は  12345678.123456780です。
%20.10fの値は 12345678.1234567799です。
%-20.1fの値は0.1                 です。
%-20.2fの値は0.12                です。
%-20.3fの値は0.123               です。
%-20.4fの値は0.1235              です。
%-20.5fの値は0.12346             です。
%-20.6fの値は0.123457            です。
%-20.7fの値は0.1234568           です。
%-20.8fの値は0.12345678          です。
%-20.9fの値は0.123456780         です。
%-20.10fの値は0.1234567800        です。
%1.8fの値は12345678.12345678です。
%2.8fの値は12345678.12345678です。
%3.8fの値は12345678.12345678です。
%4.8fの値は12345678.12345678です。
%5.8fの値は12345678.12345678です。
%6.8fの値は12345678.12345678です。
%7.8fの値は12345678.12345678です。
%8.8fの値は12345678.12345678です。
%9.8fの値は12345678.12345678です。
----- end b=12345678.12345678の例 end -----

小数点を含む実数ならば「%.[小数点以下の桁数分]f」にしておけば良さそうです。

参考