静かなる名辞

pythonとプログラミングのこと



【python】pythonでprintf的なことをする

 一年以上前にこんな記事を書きました。これはこれで今読み返すと面白い(香ばしい)記事ですが、真剣にpythonでprintfと同じことをしたくてアクセスしてきた人には役に立たないという問題点がありました。

 そこで、pythonでprintf的なことをする方法をまとめておきます。

 目次

 なお、本記事では次のコマンドで実行できる対話的インタプリタの出力を掲載します。返り値の文字列をそのまま出していますが、標準出力から出力したいときはprintを使ってください。

$ python

概要

 pythonでprintfのようなことをする方法は、3つあります。

  • %演算子を使った記法
  • str.format()メソッド
  • f文字列

 なんで3つもあるんでしょうねぇ・・・。困ったものです。

 とりあえず1つずつ説明していきます。

%演算子を使った記法

 一番昔からあり、最新のpythonでも使える方法です。なのでpythonのバージョンに依存せず使えるというメリットがあります。デメリットとしては、ちょっとわかりづらくトラブルの原因にもなること、柔軟性に劣ることが挙げられます。

 これは次のように使います。

>>> "hoge %s" % "fuga"
'hoge fuga'

 いかにもprintf的です。色々な例を示してみます。

>>> "hoge %s %s" % ("fuga", "piyo") # 複数渡すことができる
'hoge fuga piyo'
>>> "hoge %(fuga)s %(piyo)s" % {"fuga":"piyo", "piyo":"fuga"} # 辞書を使うと名前を指定して渡せる
'hoge piyo fuga'
>>> "hoge %d %03d" % (10, 20) # intもばっちり
'hoge 10 020'
>>> "hoge %.3f" % float(1/3) # floatも同様
'hoge 0.333'

 こうして見るとよさそうですが、複雑なことをしようとすると色々なトラブルが起こるので、次に説明するformatメソッドなどを使うことが推奨されています。

 もっと詳しく知りたい方は、公式ドキュメントを参照してください。

4. 組み込み型 — Python 3.6.5 ドキュメント

str.format()メソッド

 これはpythonの文字列オブジェクトに標準で実装されているメソッドです。python2.6以上で使えます。

 使い方は簡単です。

>>> "hoge {}".format("fuga")
'hoge fuga'

 最初はprintfや上の%演算子とはフォーマットが異なるのに戸惑うでしょう。formatメソッドでは"{}"でくくられた範囲をフォーマットとして解釈します。

 formatメソッドでも上と同様のことができます。

>>> "hoge {} {}".format("fuga", "piyo") # 複数渡す
'hoge fuga piyo'
>>> "hoge {fuga} {piyo}".format(fuga="piyo", piyo="fuga") # 名前を指定
'hoge piyo fuga'
>>> "hoge {0} {0} {1}".format("fuga", "piyo") # こういうこともできる。indexを指定すると便利
'hoge fuga fuga piyo'
>>> "hoge {0:10.3f}".format(1.4) # 文字列幅と精度を指定している
'hoge      1.400'

 こちらの方が柔軟性が高いのと、メソッドなので通常のオブジェクト指向の延長上で捉えることができ、%演算子ほど場当たり的な側面がありません。なので、この方法を積極的に覚えていくことをおすすめします。

 なお、公式ドキュメントはこちらです。
4. 組み込み型 — Python 3.6.5 ドキュメント

f文字列

 f文字列は一番新しい方法です。python3.6から導入されました。

 %演算子にしろstr.format()メソッドにしろ、ちょっと記述が冗長という欠点がありました。それを補ったのがf文字列です。これは文字列の中で直接式の値を評価し、それを文字列に変換して出力することができます。

 これを使うためには、文字列リテラルの先頭にfを付けます。

>>> f"{1+1}"
'2'

 簡潔な感じです。こういう使い方もできます。

>>> a = "hoge"
>>> f"{a}"
'hoge'

 関数だって呼び出せます。

>>> def pow2(x):
...     return x*x
... 
>>> b = 10
>>> f"{pow2(b)}"
'100'

 なかなか凄いですね。でも、個人的にはちょっとトリッキーすぎて使いづらい気が・・・。

 公式ドキュメントはここです。

2. 字句解析 — Python 3.6.5 ドキュメント

まとめ

 printf的なことをする3種類の方法を紹介しました。

 どの方法が良いのか? については、

  • 歴史的使命を終えつつある%演算子を使った記法
  • 現役バリバリなのでおすすめのsrt.format()メソッド
  • まだよくわからないf文字列

 という感じで、個人的にはsrt.format()メソッドをまずは使いこなせるようになることを推奨します。もちろん他の方法を使ってはいけないということではないので、少しずつ覚えていくのがおすすめです。