試行錯誤ダイアリー

新卒エンジニアが日々の技術的な学び,働き方,日々感じたこと等を書きます

【Python】print関数の記法

f:id:appli-in:20180829024443p:plain:w700


最近フォーマット文字列リテラル(f-string)の存在を知ったので
pythonのprint関数の記法について改めてまとめてみました.

フォーマット文字列リテラル(f-string)はpython3.6から実装されたようです.

print関数print()

print関数は文字列を出力する関数で,次のような構文で記述します.
引数には直接文字列を記述するか変数を与えることができます.

print("文字列" or "変数")

print("文字列")
# 文字列

いろいろな記法

ここではprint文を使って数値を文字列を一緒に出力する例で説明します.

format記法

一番有名かもしれない記法です. 文字列内の{}にformatメソッドの引数が順に入ります. 実際コードで書くと次のようになります.

a = 10
b = "Str"
print("数値:{}, 文字列:{}".format(a, b))
# 数値:10, 文字列:Str

文字列内の{}には明示的に{0}, {1}のようにフォーマット関数の順番を入力しても表示されます.

%記法

%記法ではC言語などでも使われる方法です.intを%d,floatを%fなどの変換指定文字を使って出力します.

記法は次のようにprint関数内の文字列のあとに%を入力し表示したい変数を入れます.

print("%d" % num)

実際コードで書くと次のようになります.

a = 10
b = "Str"
print("数値:%d, 文字列:%s:" % (a, b))
# 数値:10, 文字列:Str

フォーマット文字列リテラル(f-string)記法

python3.6から実装された記法で,文字列の前にfを入力し文字列内の{}内に直接変数を記述する方法です.

記法はprint(f"{変数}")となります.

実際にコードで書くと次のようになります.

a = 10
b = "Str"
print(f"数値:{a}, 文字列:{b}")
# 数値:10, 文字列:Str

もちろん次のように{}内に式を書くことも可能です.

print(f"{(a+a)**2}")
# 400

カンマ区切り

この記法はたくさん文字列と変数を表示させたいときは冗長になってしまいますが,とりあえず変数の値だけみたいときなどに便利です.

記法は次のようにprint関数内で文字列や変数をカンマで区切るだけです.

print(var , "str")

実際にコードを書くと次のようになります.

a = 10
b = "Str"
print(a,b)
# 10 Str

このようにそれぞれの変数はスペースで区切られます.

番外編(sys.stdout.write())

print関数を使わずにsys.stdout.write()を使う方法があります.

これを使う場合は次のように記述します.

import sys

sys.stdout.write("文字列")

print()では出力する際に改行されますが(endオプションない場合),sys.stdout.write()では改行されません.また,print()では変数を引数に指定できますが,sys.stdout.write()では文字列のみになるので予めstr()などで文字列に変換する必要があります.

sys.stdout.write()の使いどころですが,プログレスバー・ステータスを表示するときなどに使えます.キャリッジリターン(カーソルを文頭に戻す)を表すエスケープシーケンスの\rを文字列に入れることで,出力を同じ行に上書きすることができます. ※ print関数のendオプションを使った場合でも同様のことができます.

import sys
import time

print("sys.stdout.write()")
for i in range(10):
    sys.stdout.write("\r %d" % i)
    time.sleep(0.1)

print("\nprint()")
for i in range(10):
    print("\r %d" % i, end="")
    time.sleep(0.1)

"""
[出力]

sys.stdout.write()
 9
print()
 9
"""

まとめ

pythonでprint関数を使うときの様々なパターンについてまとめました.

どれを使うかは使う人の好みになるのかなと思いますが,それぞれ別の記法が存在するのはなにか理由があるのかもしれません.自分はわかりませんが...

ただ,複数人でコードを書くときにフォーマットが違うと状況によっては面倒そうだなと感じました.