note.nkmk.me

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

Posted: 2018-04-15 / Modified: 2019-09-08 / Tags: Python, 文字列処理

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

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

  • Python2とPython3のprintの違い
  • 文字列や数値、リスト、辞書などを出力
    • 整形(折り返し・省略など)して出力
  • 変数に格納された値を出力
  • 末尾の改行なしで出力(引数end
  • 複数の変数を出力(引数sepで区切り文字を指定)
  • リストの要素を任意の文字で区切って出力
  • 複数の変数を文字列に埋め込んで出力
    • パーセント%を使う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のつもりがPython2で実行されていたなどという場合もあるので注意。実行されているPythonのバージョンの確認は以下の記事を参照。

以下、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

末尾の改行なしで出力(引数end)

デフォルトではprint()の出力は末尾で改行される。

print('abc')
print('xyz')
# abc
# xyz

引数endに任意の文字列を指定すると、その文字列が改行の代わりに最後に挿入される。例えば連続するprint()の出力を改行なしで単純に連結したい場合は空文字列''を指定すればよい。

print('abc', end='---')
print('xyz')
# abc---xyz

print('abc', end='')
print('xyz')
# abcxyz

なお、デフォルトで改行されるのは引数endのデフォルト値が改行文字'\n'に設定されているから。

複数の変数を出力(引数sepで区切り文字を指定)

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

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

また、複数の文字列を連結して新たな文字列を生成したい場合は以下の記事を参照。

リストの要素を任意の文字で区切って出力

上述のように、リストをそのままprint()で出力すると以下のようになる。

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

リストに*を付けて関数の引数に指定すると、それぞれの要素が展開され個別の引数として渡される。

デフォルトでは各要素が空白区切りで出力される。

print(*l)  # => print(0, 1, 2)
# 0 1 2

引数sepを指定すると任意の区切り文字で区切って出力できる。

print(*l, sep='')
# 012

print(*l, sep='-')
# 0-1-2

コードは長くなるが、リストの要素を連結した文字列を生成してからprint()で出力してももちろんOK。

s = '-'.join([str(i) for i in l])
print(s)
# 0-1-2

なお、処理速度を測定すると前者(*sepを利用)よりも後者(join()で連結文字列生成)の方が速い。前者で処理速度に問題がある場合は後者を試してみるといいだろう。

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

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

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

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

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

%d, %f.2, %sのような変換指定子を使う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}

format()メソッドついての詳細は以下の記事を参照。

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

スポンサーリンク
シェア

関連カテゴリー

関連記事