Pythonのprintのかしこい使い方。printでデータを自由自在にさばく!

58, 2019-07-22

目次

printの使い方

printはエンジニアにとって、大工さんの金づちみたいなものです。
つまり使えて当然のツールということですね。

ですので、今さら他人にprintの使い方なんて聞けません

でも使い方がよくわからない。。。そういう人は沢山います。
大丈夫です。そんな人はこの記事を読んでください。

この記事ではprintの↓の機能をご紹介します。

  • sep

  • end

  • file

  • flush

この記事を読めばあなたも今日からprintマスターです。
printをぶん投げてマシンをびっくりさせてあげましょう。

ふつうのprint

まず普通のprintの使い方です。
printの引数には画面に出力させたいデータを渡します。

:::python
print('金色の野に舞い降りし青き鷹を操るもの')

↑の結果は↓のようになります。

金色の野に舞い降りし青き鷹を操るもの

カンマ区切りで引数を渡す

printにカンマ区切りで引数を渡すと、printはデフォルトで半角スペース区切りで引数を出力します。

:::python
print('オラ!', 'オラ!', 'オラ!', 'オラ!')
オラ! オラ! オラ! オラ!

いろいろなデータを渡せる

もちろんprintの引数には文字列以外にも色々なデータを渡せます。

:::python
print(0, 'あ', None, [1, 2, 3], { 'key': 0 })
0  None [1, 2, 3] {'key': 0}

リストを展開させる

リストのデータを*(アスタリスク)で展開させればわざわざカンマで区切る必要もありません。

:::python
words = ['オラ!', 'オラ!', 'オラ!', 'オラ!']
print(*words)
オラ! オラ! オラ! オラ!

集合も展開できる

もちろん集合も*で展開できます。

:::python
myset = {0, 1, 2, 3}
print(*myset)
0 1 2 3

辞書は展開したらエラーになる

辞書は**で展開するとキーワード・エラーになることがあります。
(辞書の使い道は後半で解説します)

:::python
words = {
    '田中さん': '斎藤さん、付き合ってください',
    '斎藤さん': 'えっ、私ドワーフですけど',
}
print(**words)
TypeError: '田中さん' is an invalid keyword argument for print()

*でキーだけ展開させてもなんだかなーという感じです。

:::python
words = {
    '田中さん': '斎藤さん、付き合ってください',
    '斎藤さん': 'えっ、私ドワーフですけど',
}
print(*words)
田中さん 斎藤さん

辞書を展開させたい場合はitems, keys, valuesなどと一緒に使いましょう。

:::python
words = {
    '田中さん': '斎藤さん、付き合ってください',
    '斎藤さん': 'えっ、私ドワーフですけど',
}
print(*words.items())
print(*words.keys())
print(*words.values())
('田中さん', '斎藤さん、付き合ってください') ('斎藤さん', 'えっ、私ドワーフですけど')
田中さん 斎藤さん
斎藤さん、付き合ってください えっ、私ドワーフですけど

キーワードsepの使い方

printはデフォルトで引数を半角スペースに区切って出力します。
この半角スペースの区切りを別の区切りに変更したい場合はキーワードsepに指定します。

↓は半角スペースの代わりにを指定しています。
末尾には付加されてない所に注目してください。

:::python
print('オラ', 'オラ', 'オラ', 'オラ', sep='!')
オラ!オラ!オラ!オラ

↓はリストと合わせて使った例です。
コンパクトで素敵ですね。

:::python
words = ['きみが', '泣くまで', '殴るのを', 'やめない']
print(*words, sep='!')
きみが!泣くまで!殴るのを!やめない

sepをカンマにすれば即席でCSV形式のフォーマットを作れます↓。

:::python
print('ボブ', '30歳', '80kg', '203cm', sep=',')
# ボブ,30歳,80kg,203cm

キーワードendの使い方

キーワードのendで末尾の文字列を指定することができます。
printはデフォルトでendに改行を設定しています。
つまり、末尾の改行を消したい場合は↓のようにします。

:::python
print('この行に改行はいらない', end='')
この行に改行はいらない

よって、↓のようにすれば完全なJOJO語を合成できます。

:::python
print('オラ', 'オラ', 'オラ', 'オラ', sep='', end='\n')
オラ!オラ!オラ!オラ!

キーワードfileの使い方

printはデフォルトでどこに出力しているのかというと、標準出力に出力しています。
この出力先を変更したい場合はキーワードfileにファイル・オブジェクトを渡します。

↓はfileに標準出力のファイル・オブジェクトを渡しています。
つまり、デフォルトの動作と変わりません。

:::python
import sys

print('標準出力にいってきて~!', file=sys.stdout)
標準出力にいってきて~!

printの出力先を標準出力から標準エラー出力に変更したい場合は↓のようにします。

:::python
import sys

print('標準エラー出力にいってきて~!', file=sys.stderr)
標準エラー出力にいってきて~!

もちろん開いたファイルを渡すことも出来ます。
↓のようにするとprintout.txtファイルにデータを書き込みます。

:::python
with open('out.txt', 'w') as fout:
    print('ファイルを蹂躙する喜び', file=fout)

↑のコードが実行されるとout.txtの中身は↓のようになります。

ファイルを蹂躙する喜び

sepを組み合わせれば、↓のように簡易的なCSVデータを書き込むことも出来ます。
しかし、CSVはみなさんが思う以上に複雑なものです。
ちゃんと使いたい場合は専用のライブラリを使いましょう。

:::python
with open('persons.csv', 'w') as fout:
    print('ボブ', '30歳', '80kg', '203cm', sep=',', file=fout)
    print('シェリー', '62歳', '30kg', '150cm', sep=',', file=fout)
    print('ジェイソン', '4歳', '20kg', '80cm', sep=',', file=fout)
ボブ,30歳,80kg,203cm
シェリー,62歳,30kg,150cm
ジェイソン,4歳,20kg,80cm

キーワードflushの使い方

ファイル・オブジェクトはデフォルトでバッファを溜め込みます。
そのバッファをフラッシュすることで初めて出力先に出力されます。
(実装がCPythonの場合はCの標準ライブラリの仕様に依存していると推測できます)

printに設定されているファイル・オブジェクトのバッファを手動でフラッシュしたい場合は、キーワードflushを設定します。
このflushTrueを設定するとバッファがフラッシュされます。

:::python
print('バッファをフラッシュします', flush=True)
バッファをフラッシュします

つまり、↓と同じです。
↓の例では直接、標準出力のファイル・オブジェクトのバッファをフラッシュしています。

:::python
import sys

print('バッファをフラッシュします')
sys.stdout.flush()
バッファをフラッシュします

辞書でまとめる

今まで出てきたキーワードを辞書にまとめれば、さらにprintがコンパクトになります。
しかし、あまりこういった形で使う機会は少ないかもしれません。

:::python
import sys

opts = {
    'sep': '…',
    'end': '…っ!\n',
    'file': sys.stderr,
    'flush': True,
}
words = ['ぼくは', 'おなか', 'いっぱい', 'だなぁ']

print(*words, **opts)
ぼくは…おなか…いっぱい…だなぁ…っ!

おわりに

いかがでしたでしょうか。
printは非常によく使う関数ですが、意外にもその詳細を詳しく知っている方は少ないかもしれません。
この記事でprintを覚えて日々のプログラミングをエンジョイしていきましょう。

以上、narupoでした。