2017/06/27

Python 3 の print() 関数の使い方

Python 3 の print() まわりの機能をご紹介します。

print('Hello world')

Python 2 と Python 3 では print() の機能が大きく異なります。 Python 2 の print 文については次の記事などを参考にしてみてください。

Python 2 の print 文の使い方


Python 3 の print() の基本的な使い方


Python 3 の print() は文字列を出力するための関数です。

宣言部は次のようになっており、出力対象のオブジェクトの他にもさまざまな引数を受け取ることができます。

print(*objects, sep, end, file, flush)

各引数の意味合いはそれぞれ次のとおりです。

  • objects: 出力対象のオブジェクト。複数個渡すことができる。
  • sep: objects が複数個渡された場合の区切り文字(セパレータ)。デフォルトは半角空白。
  • end: 最後の要素の末尾に付けられる文字。デフォルトは改行文字。
  • file: 出力先。デフォルトは標準出力だが、ファイルオブジェクトなどを指定することもできる。
  • flush: バッファなしで出力するかどうか。デフォルトは False で、出力先によって自動的に定められる。

いくつかのパターンで使ってみましょう。

# 文字列を出力する
print('Python')
# => Python

# 複数の文字列をまとめて出力する
print('This', 'is', 'a', 'chair.')
# => This is a chair.

# 文字列以外のオブジェクトを出力する
print('Total: ', 1000)
# => Total:  1000

print('List: ', [3, 5, 7])
# => List:  [3, 5, 7]

# カスタムクラスのオブジェクトを出力する
class Dog: 
    def __init__(self, name): 
        self.name = name

    def __str__(self): 
        return 'Dog (' + self.name + ')'

jiro = Dog('Jovani')
print(jiro)
# => Dog (Jovani)

# 区切り文字を変える
# デフォルトは半角空白
print('P', 'T', 'A', sep='__')
# => P__T__A

# 通常最後に追加される改行を別の文字列に変える
print('ABC', end='\n-------\n')
print('DEF')
# => ABC
# => -------
# => DEF

# 通常最後に追加される改行を削除する
print('ABC', end='')
print('DEF')
# => ABCDEF

# 標準出力ではなくファイルに出力する
with open('out.txt', 'w') as f: 
    print('result 1', file=f)
    print('result 2', file=f)

print(open('out.txt').read())
# => result 1
# => result 2

print() 関数の機能については以上です。


str.format()


print() 関数といっしょに使うことが多いもののひとつに文字列オブジェクトの str.format() があります。

これは文字列の中に変数を展開して挿入してくれるメソッドです。いくつかサンプルを見てみましょう。

# 細かな指定は行わず {} だけで出力する
key = 'name'
value = 'python'
print('{}: {}'.format(key, value))
# => name: python

# 引数のインデックスを指定して出力する
# この場合、同じ引数を何度も利用できる
value = 'pain'
print("It's your {0} or my {0} or somebody's {0}".format(value))
# => It's your pain or my pain or somebody's pain

# キーワード引数の形式で指定する
print('{fruit}食えば鐘が鳴るなり{temple}'.format(temple='法隆寺', fruit='柿'))
# => 柿食えば鐘が鳴るなり法隆寺

# インデックスを指定して一部を出力する
company = {
  'name': 'Sharp',
  'description': 'Meno tsuke dokoro ga sharp.',
}
print('{0[name]} -- {0[description]}'.format(company))

# アトリビュート名を指定して一部を出力する
class Dog: 
    def __init__(self, name): 
        self.name = name

kiyoshi = Dog('Campanella')
print('name: {0.name}'.format(kiyoshi))
# => name: Campanella

# 型とフォーマットを指定して出力する
print('{:0.2f}'.format(15))
# => 15.00

print('{:^10d}'.format(15))
# => '    15    ' ( 10 文字の中で中央寄せされた 15 )

str.format() はレシーバである文字列の中の {} に引数を挿入して展開してくれます。各 {} に対して、どの引数を挿入するのか、どのようなフォーマットで挿入するのかといったことを細かく指定することができます。

ただ、 str.format() は機能が豊富なので、一気に覚えるのではなく、まず「 format() でどういうことができるのか」だけ把握しておいて、具体的なオプションの指定方法については必要になったときに都度覚えていくのがよいかと思います。

詳しくは公式のドキュメントを参考にしてください。

6.1. string — Common string operations — Python documentation
6.1. string — 一般的な文字列操作 — Python ドキュメント


フォーマットつき文字列リテラル


Python 3.6 以降に限定とはなりますが、 f'' という形式で記述するフォーマットつき文字列リテラルというものも利用できます。

first = '奥山に紅葉踏み分け鳴く鹿の'
second = '声聞く時ぞ秋は悲しき'

tanka = f'{first}\n  {second}'

print(tanka)
# => 奥山に紅葉踏み分け鳴く鹿の
# =>   声聞く時ぞ秋は悲しき

str.format() よりも直感的な形で文字列の中に変数を組み込むことができます。

このフォーマット付きの文字列リテラルに対応する PEP は 498 です。興味のある方は以下のページなどもご覧になってみるとよいかもしれません。

PEP 498 -- Literal String Interpolation | Python.org

0 件のコメント: