note.nkmk.me

Pythonのprint関数で文字列、数値および変数の値を出力

Date: 2018-04-15 / Modified: 2018-06-12 / tags: Python, 文字列操作

Pythonで文字列や数値、変数に格納された値などを標準出力(sys.stdout)に表示するprint()関数について説明する。

ここでは以下の内容について説明する。

  • Python2とPython3のprintの違い
  • 文字列や数値、リスト、辞書などを出力
    • 整形(折り返し・省略など)して出力
  • 変数に格納された値を出力
  • 複数の変数を出力
  • 複数の変数を文字列に埋め込んで出力
    • パーセント%を使うprintf形式
    • 文字列メソッドformat()
    • f文字列(フォーマット文字列)
  • 数値をフォーマットして出力(桁数指定など)
スポンサーリンク

Python2とPython3のprintの違い

Python3ではprint関数だが、Python2ではprint文。

print xxx  # Python2
print(xxx)  # Python3

print文で書かれたPython2のコードをPython3で実行するとエラーSyntaxErrorになるので注意。括弧()をつければOK。

# print 'this is a pen'
# SyntaxError: Missing parentheses in call to 'print'. Did you mean print('this is a pen')?

print('this is a pen')
# this is a pen

以下、Python3のprint関数について説明する。

文字列、数値、リスト、辞書などを出力

文字列や数値などをprint()関数の引数に渡すとその値が出力される。

print('this is a pen')
# this is a pen

print(100)
# 100

リストや辞書の場合は全体が出力される。

print([0, 1, 2])
# [0, 1, 2]

print({'a': 0, 'b': 1, 'c': 2})
# {'a': 0, 'b': 1, 'c': 2}

文字列はそのまま出力されるが、それ以外の型がどのような文字列として出力されるかはそれぞれの型の__str__()メソッドで規定される。

たとえば、1.00000を文字列型'1.00000'として渡すとそのまま出力されるのに対し、浮動小数点float1.00000として渡すと1.0と出力される。

print('1.00000')
# 1.00000

print(1.00000)
# 1.0

format()メソッドを使うとfloatでも小数点以下の桁数を指定して出力するなど書式を指定できる。後述。

整形(折り返し・省略など)して出力

長い文字列やリスト、辞書などを整形(折り返し・省略など)して出力するには、textwrapモジュールやpprintモジュールを使うと便利。以下の記事を参照。

変数に格納された値を出力

これまでの例では文字列や数値の値をそのままprint()関数に渡していたが、当然ながら、それらの値を代入した変数でも同様の出力結果となる。

リストや辞書の中身を表示するにはインデックスやキーを指定する。

s = 'this is a pen'
print(s)
# this is a pen

l = [0, 1, 2]
print(l)
# [0, 1, 2]

print(l[0])
# 0

d = {'a': 0, 'b': 1, 'c': 2}
print(d)
# {'a': 0, 'b': 1, 'c': 2}

print(d['b'])
# 1

f = 1.00000
print(f)
# 1.0

複数の変数を出力

print()関数の引数に複数の変数および文字列や数値などを指定すると、スペース(空白)で区切られて出力される。

i = 100
print('apple', i, 0.123)
# apple 100 0.123

引数sepを指定することで区切り文字をデフォルトのスペース(空白)から任意の文字列に変更できる。改行文字\nを指定すると値・変数ごとに改行されて出力される。

print('apple', i, 0.123, sep='----')
# apple----100----0.123

print('apple', i, 0.123, sep='\n')
# apple
# 100
# 0.123

文字列の改行についての詳細は以下の記事を参照。

複数の変数を文字列に埋め込んで出力

文字列の途中に変数の値を挿入して出力したい場合は以下の三つの方法がある。

  • パーセント%を使うprintf形式
  • 文字列メソッドformat()
  • f文字列(フォーマット文字列)

公式ドキュメントのprintf形式の項目には以下のような注釈が書かれている。

注釈: ここで述べる書式化演算には様々な癖があり、よく間違いの元になっています (タプルや辞書を正しく表示できないなど)。新しい フォーマット文字列リテラル や str.format() インタフェースの方が間違いにくく、より強力で、柔軟で、さらに拡張可能です。
4. 組み込み型 printf 形式の文字列書式化 — Python 3.6.5 ドキュメント

%d, %f.2のような変換指定子を使うC言語などのprintf形式に慣れ親しんでいるのでなければ、公式ドキュメントにあるようにformat()メソッドやf文字列を使うのがオススメ。

なお、f文字列はPython3.6から追加された機能でそれより前のバージョンでは使えないので注意。

パーセント%を使うprintf形式

以下のように書くと文字列中の変換指定子%d, %sなどが変数で置換される。変数が複数の場合はカンマ,で区切り()で囲んでタプルとして指定する。

文字列 % 変数
s = 'Alice'
i = 25

print('Alice is %d years old' % i)
# Alice is 25 years old

print('%s is %d years old' % (s, i))
# Alice is 25 years old

変換指定子は整数が%d、浮動小数点が%f、文字列が%s。そのほか書式の指定方法などの詳細は以下の公式ドキュメント参照。

文字列メソッドformat()

文字列メソッドformat()を使って以下のように書くと文字列中の置換フィールド{}が引数に指定した変数で置換される。変数が複数の場合はカンマ,で区切る。

文字列.format(変数)
print('Alice is {} years old'.format(i))
# Alice is 25 years old

print('{} is {} years old'.format(s, i))
# Alice is 25 years old

置換フィールド{}にインデックス(0始まりの整数)を指定すると引数の位置に応じた値で置換される。同じ値を繰り返し使いたい場合に便利。

print('{0} is {1} years old / {0}{0}{0}'.format(s, i))
# Alice is 25 years old / AliceAliceAlice

置換フィールド{}に文字列を指定するとキーワード引数として指定した値で置換される。

print('{name} is {age} years old'.format(name=s, age=i))
# Alice is 25 years old

文字列中の波括弧{, }をそのまま出力したい場合は{{, }}とする。

print('{} is {} years old / {{xxx}}'.format(s, i))
# Alice is 25 years old / {xxx}

f文字列(フォーマット文字列)

f文字列は文字列リテラルの前にfをつけた文字列(f'xxx')。

文字列中の置換フィールド{}に変数を直接指定できる。

s = 'Alice'
i = 25

print(f'{s} is {i} years old')
# Alice is 25 years old

f文字列についての詳細は以下の記事を参照。

数値をフォーマットして出力(桁数指定など)

format()メソッドを呼ぶ文字列やf文字列の置換フィールド{}内に書式指定文字列を指定すると、数値を任意の書式にフォーマットして出力できる。

{:書式指定文字列}のように:のあとに書式化文字列を記述する。置換フィールドにインデックスや名前を指定する場合はそのあとに:書式指定文字列を書く。

number = 0.45
print('{0:.4f} is {0:.2%}'.format(number))
# 0.4500 is 45.00%

print(f'{number:.4f} is {number:.2%}')
# 0.4500 is 45.00%

書式指定文字列によって様々なフォーマットにすることが可能。

  • 左寄せ、中央寄せ、右寄せ
  • ゼロ埋め
  • 2進数、8進数、16進数
  • 小数点以下の桁数指定
  • 指数表記
  • パーセント表示
i = 255

print('left   : {:<8}'.format(i))
print('center : {:^8}'.format(i))
print('right  : {:>8}'.format(i))
print('zero   : {:08}'.format(i))
print('bin    : {:b}'.format(i))
print('oct    : {:o}'.format(i))
print('hex    : {:x}'.format(i))
# left   : 255     
# center :   255   
# right  :      255
# zero   : 00000255
# bin    : 11111111
# oct    : 377
# hex    : ff

f = 0.1234

print('digit   : {:.2}'.format(f))
print('digit   : {:.6f}'.format(f))
print('exp     : {:.4e}'.format(f))
print('percent : {:.0%}'.format(f))
# digit   : 0.12
# digit   : 0.123400
# exp     : 1.2340e-01
# percent : 12%

例はformat()メソッドだが、f文字列でも同様の書式指定文字列が使える。

format()メソッドおよび書式指定文字列についてのより詳細な説明は以下の記事を参照。

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事