静かなる名辞

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.9 ドキュメント

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'

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

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

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'

 表示フォーマットも指定できます。formatのときと同じような書き方です。

>>> f"{1/3:.3f}"
'0.333'

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

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

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

2019/08/22追記
 この記事を書いてから月日が過ぎ、近年は少し事情が変わってきたのかなと思うようになりました。

 なんだかんだで簡潔に書けるのがf文字列の良いところです。また、最近のPython環境は3.6以降が標準になってきたので(何かと美味しい機能が3.6以降で増えたので)、f文字列の互換性の問題もあまり気にならなくなってきました。

 今後はf文字列でいいかなという感じもします。

まとめ

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

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

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

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

2019/08/22追記
 新し目のPythonしか触らないという前提であれば、f文字列から覚えてもいいと思います。記述量が減らせて楽です。

scanf編

 兄弟記事です。よろしければこちらも御覧ください。

www.haya-programming.com