Python♪「% 演算子」を使った古い文字列書式設定

文字列の書式設定はPython2.6からformatメソッドが追加され、%演算子を使った古い文字列書式設定よりも、このformatメソッドを使った方がよいと思います。でも、Pythonのチュートリアルで簡単に紹介されていますし、古いコードでは%演算子が使われてます。そこで、「まずは、このくらい知っておけばいいのでは」という程度にまとめてみたいと思います。

なお、以下関連記事です。

関連記事:「% 演算子」の書式設定において、桁数を「*」で表記する方法
<記事概要>「%演算子」による文字列書式設定において、桁数の部分を「*」で表現し、桁数を引数で渡す方法があります。この方法は、localeモジュールのlocale.format()やlocale.forma_string()でも同様ですので、サンプルコードにより使い方を簡単に整理します。

0.チュートリアル学習のポイントシリーズ、関連記事

この記事は「チュートリアル学習のポイントシリーズ」の記事です。一連の記事のリンクは、以下を参照してください。
Pythonチュートリアルの学習のポイントを整理

1.最初に覚えるべきこと

まず、最初に覚えるべき基本事項について説明します。このくらい知っていれば、書籍などのコードを読むときに、ざっとした内容は理解できるのではないでしょうか。

(1) %演算子を使った古い文字列書式設定の方法

%演算子を使った文字列の書式設定は、「format % values 」という書き方で書式設定を行います。そして、 左側の(format)の中%d, %fなどの位置に 右側の引数(values)を表示します。このとき、右側の引数をそのまま表示するのではなく、フォーマット指定子(%d,%fなど)によって、表示する書式を指定することができます。

「format (%dなどを含む文字列)」 % 「values (1つ以上の引数)」

 format :
  %d, %fなどの「フォーマット指定子」を含む文字列
  表示書式を「フォーマット指定子」により指定できる。

 values:
  valuesの値がformatの%d,%fなどの位置に表示される。
  複数の値を引数として渡す場合にはタプルを用いる。
  valuesを辞書型にすれば、左側のformat側からキーワードで指定できる。

 formatとvaluesの間の「%」:
   「%演算子」です。「フォーマット指定子」と名称を混同しないようにしましょう。

(2) 最初に覚える3つのサンプルコード

言葉ではわかりにくいので、実際のサンプルコードを見てみましょう。コード01のように、複数の値を引数として渡す場合にはタプルを用います。また、引数を辞書とし、キーワードで指定することができ、その場合にはフォーマット指定子の%の直後に(キーワード)を挿入します。

#コード01
print('%sは好き。' % 'チョコ')
print('%sは好き。%sは苦手。' % ('チョコ', 'マシュマロ'))
print('%(key1)s好き。%(key2)s苦手。' % {'key1':'アメ', 'key2':'ラムネ'})
#出力01
チョコは好き。
チョコは好き。マシュマロは苦手。
アメ好き。ラムネ苦手。

(3) キーワードの指定には「'」は必要ない

コード02は辞書の要素を参照する単純なコードですが、コード02はx['key1']のようにkey1の両側に「'」があります。しかし、%演算子でキーワード指定する場合には、コード01の「%(key1)s」のように、key1の両側に「'」がないことに注意しましょう。

#コード02
x = {'key1':'チョコ', 'key2':'マシュマロ'}
print(x['key1'])
#出力02
チョコ

(4) 主なフォーマット指定子

主なフォーマット指定子は以下の通りです。なお、format()メソッドを使った新しい書式指定方法では{:b}により、2進数に変換することができますが、 %演算子を用いた古い書式指定方法では2進数に変換するフォーマット指定子がありません。

指定子説明
%d符号付き10進整数
%f10進浮動小数点数
%e指数表記の浮動小数点数(eが小文字)
%E指数表記の浮動小数点数(Eが大文字)
%o符号付き8進数
%x符号付き16進数(xが小文字)
%X符号付き16進数(Xが大文字)
%sstr()で変換した文字列
%rrepr()で変換した文字列
%aascii()で変換した文字列

(5) 全体桁数の指定(%d, %sなど)

%のあとに表示桁数を指定することができます。以下、具体的な表示方法の例を示します。

指定子の使用例説明
%d, %s全体桁数無指定
%10d, %10s全体桁数10 ※数字も文字列も右寄せ

(6) 全体桁数、少数部桁数の指定(%f, %eなど)

不動点小数点数などは、全体桁数だけでは無く、小数部の桁数も指定できます。以下、具体的な指定方法です。

なお、「%10f」では小数部分の桁数は6桁になりますが、「%10.f」「%.f」では、小数部分が表示されなくなりますので、注意する必要があります。

指定子の使用例説明
%f 全体桁数無指定、(ディフォルト:少数部桁数6)
%10.5f全体桁数10, 小数部桁数5
%.5f全体桁数無指定、小数部桁数5
%10f全体桁数10、(ディフォルト:小数部桁数6)
%10.f全体桁数10 、小数部表示されない
→整数部のみ表示(%10.0fと同じ出力結果)
%.f全体桁数無指定、少数部表示されない
→整数部のみ表示(%.0fと同じ出力結果)

%10.fと%.fの出力については、以下のコードを参考にしてください。なお、2行目の「print('1234567890■出力位置■')」は、2行目より後のコードの出力が何文字目に配置されるかを、わかりやすくするために出力しています。3~6行目の「■」は出力の終了位置を明確にするために追加した文字列です。
また、%10.fと%.fの を積極的に使うことはないと思いますが、注意喚起のため表に加えました。

#コード03
print('1234567890■出力位置■')
print('%10.f■' % 3.14)
print('%.f■' % 3.14)
print('%10.e■' % 3.14)
print('%.e■' % 3.14)
#出力03
1234567890■出力位置■
         3■
3■
     3e+00■
3e+00■

2.補足説明

ここまでの説明で、%演算子の基本的な説明は終了です。この章では、もう少し細かい部分について説明を補足します。

(1) 引数の型変換

それぞれのフォーマット指定子は、変換元のデータの型が決まっています。例えば、数値は%sにより、str型には変換できます。しかし、文字列を%dや%fにより数値に変換することはできません。

#コード04
print('%s' % 999) #数値もstr型に変換される

#エラー:文字列は10進整数に変換されない。
#print('%d' % '999')

#エラー:文字列は10進浮動小数点数に変換されない。
#print('%f' % '999')

(2) 全体桁数を指定した場合の右寄せ、左寄せ

全体桁数を指定した場合、数値も文字列も右揃えになります。なお、format()メソッドを用いた新しい文字列書式設定では数値は右寄せ、文字列は左寄せになります。

#コード05
print('1234567890■出力位置■')
print('%d■' % 999)
print('%s■' % 'abc')
print('%10d■' % 999)
print('%10s■' % 'abc')
#出力05
1234567890■出力位置■
999■
abc■
       999■
       abc■

(3) 指定した全体桁数を超える場合

コード06では、いずれも出力結果が指定した桁数5を超えています。このように、指定した桁数を超えた場合、一部が削除されるのではなく、指定桁数を超えた部分も全て表示されます。

なお、4行目の%5fは、小数点以下の指定が省略されているため、小数点以下の桁数はディフォルトの6桁となります。したがって、3.14は3.140000となり、全体桁数の5を超えて表示されます。ついつい、小数点以下が6桁になることを忘れてしまうので注意しましょう。

#コード06
print('1234567890■出力位置■')
print('%5d■' % 1234567890)
print('%5f■' % 3.14)
#出力06
1234567890■出力位置■
1234567890■
3.140000■

3.おまけコード( %f , %E, %eの桁数指定)

おまけコードとして、%f, %E, %eの桁数指定のサンプルコードを列挙します。コードがだらだらと長いので、本文からはずしました。

(1) %fのサンプルコード

3行目の「print('%f←終了位置' % 3.14, '%f')」において、%より右に「3.14」と 「'%f'」がありますが、「'%f'」は%演算子の引数ではありません。なぜなら、「3.14」と 「'%f'」はタプルではないからです。複数の値を引数とする場合は、タプルにする必要があります。ここでは、「,」で区切られた「'%f←終了位置' % 3.14」と「'%f'」をprint()で出力しています。

#コード07
print('1234567890■出力位置■')
print('%f■' % 3.14, '%f')
print('%10.5f■' % 3.14, '%10.5f')
print('%.5f■' % 3.14, '%.5f')
print('%10f■' % 3.14, '%10f')
print('%10.f■' % 3.14, '%10.f')
print('%.f■' % 3.14, '%.f')
#出力07
1234567890■出力位置■
3.140000■ %f
   3.14000■ %10.5f
3.14000■ %.5f
  3.140000■ %10f
         3■ %10.f
3■ %.f

(2) %E, %eのサンプルコード

%E, %eのサンプルコードです。%fと同様の出力書式となります。

#コード08
print('123456789012345■出力位置■')
print('%E■' % 3.14, '%E')
print('%e■' % 3.14, '%e')
print('%15.3e■' % 3.14, '%15.3e')
print('%.3e■' % 3.14, '%.3e')
print('%15e■' % 3.14, '%15e')
print('%15.e■' % 3.14, '%15.e')
print('%.e■' % 3.14, '%.e')
#出力08
123456789012345■出力位置■
3.140000E+00■ %E
3.140000e+00■ %e
      3.140e+00■ %15.3e
3.140e+00■ %.3e
   3.140000e+00■ %15e
          3e+00■ %15.e
3e+00■ %.e

4.広告

「ホームページよかったよ!」っていうあなた。以下の広告から、なにか買い物をしてください。一部が私の報酬になり、モチベーションが大幅upします。