無粋な日々に

日々の技術メモ(データ分析界隈)

Python: print関数の仕様

print関数って、意識せず使ってたけどこんな仕様なんですねぇ 面白かったので、いくつか見てみましょう。

複数引数がとれて、一気にprintできる

複数引数を渡すと、スペースで区切られて出力される

# 複数引数を与えてみる
print('str1', 'str2', 'str3')

#> str1 str2 str3

セパレタも選択できる

複数引数を出力する際のデフォルトのセパレタはスペースですが、これも変えられる これって、Rでいうpasteとprintを両方兼ね添えた感じですね

# セパレタを変えてみる
print('str1', 'str2', 'str3', sep=':')

#> str1:str2:str3

ってことはlistをアンパックしたりすればこんな事もできますね

# リストをアンパックして渡して、全部の要素を接続
x = ['a', 'b', 'c']
print(*x, sep='')

#> abc

引数渡さなくてもいい(笑)

何も引数を渡さないと、end仮引数でデフォルトで指定されている\n改行が出力される。 endを指定することで、第1引数の出力後のお尻を何で締めくくるか決めれるみたい

# エラーにはならず、改行が出力(見えんけど)
print()

#>

# end引数に値を渡すと、出力のお尻を何で締めくくるか決められる
print('str1', end='end')

#> str1end

出力先も変えられる

標準出力(sys.stdout)以外にもwrite(string) メソッドを持つオブジェクトならなんでも出力できるみたいです。 例えば普通にファイルにも出力できる

# out.txtファイルに`str`が出力されます
with open('out.txt', 'w') as f:
    print('str', file=f)

flushオプションはわからん

バッファするかどうか、指定するみたいですが私にはわからなかったのでどう使うのか、誰か教えてください。

ドキュメントに書いてること

2. 組み込み関数 print

print(*objects, sep=‘ ’, end=‘\n’, file=sys.stdout, flush=False)
objects (単数でも複数でも可) を sep で区切りながらテキストストリーム file に表示し、最後に end を表示します。sep、end、file を与える場合、キーワード引数として与える必要があります。 キーワードなしの引数はすべて、 str() がするように文字列に変換され、 sep で区切られながらストリームに書き出され、最後に end が続きます。 sep と end の両方とも、文字列でなければなりません。これらを None にすると、デフォルトの値が使われます。 objects が与えられなければ、 print() は end だけを書き出します。 file 引数は、 write(string) メソッドを持つオブジェクトでなければなりません。指定されないか、 None である場合、 sys.stdout が使われます。表示される引数は全てテキスト文字列に変換されますから、 print() はバイナリモードファイルオブジェクトには使用できません。代わりに file.write(…) を使ってください。 出力がバッファ化されるかどうかは通常 file で決まりますが、flush キーワード引数が真ならストリームは強制的にフラッシュされます。 バージョン 3.3 で変更: キーワード引数 flush が追加されました。

ではごきげんよう。