Python3のprintを使ってみよう!

2011 Pythonアドベントカレンダー(Python3) 24日目です!

実はPython3は...というかPython自体ほとんど触ったことがなくて...
エキスパートPythonの読書会に2回(2章途中)参加したくらいの知識しかないのですが
急遽参加してみることにしました!大丈夫か!?

はじめに

記事のネタをどうしようか考えてたところに他の参加者様の記事を見て
Python3からprintが文から式に変わったというのを見つけたので
print文についてもうちょっと具体的に調べてみようかなと思いました。

環境

Mac OS X Snow Leopard 10.6.8
Python 3.2

インストール

sudo port install python32

調査結果

Python3での出力仕様

Python2までは

print "aaa"

だったのに対してPython3では

print("aaa")

となる。

Python3でのprintについて試したものを以下にまとめます。
各処理右側のコメントが処理の出力になります。

# endを指定しない場合は"\n"がdefaultとなり出力の最後で改行される
print("aaa") # -> aaa\n

# endに空文字を指定することで改行を防止できる
print("aaa", end="") # -> aaa

# 引数には出力用データを複数指定可能
# データの結合文字はsepで指定する。defaultは半角スペース
print("aaa", "bbb") # -> aaa bbb\n

# sepで結合文字を変更
print("aaa", "bbb", sep=",") # -> aaa,bbb\n

# sepとendは同時に設定可能
print("aaa", "bbb", sep=",", end="") # -> aaa,bbb

# fileで指定したファイルオブジェクトに出力できる
print("test", file=sys.stdout)
文から式へ

文は値を返さないもの。改行を伴うもの。
式は値を返すもの。文中で使用可能。

という認識だけど合ってるかな??

そこで

printが文から式になったことで何が便利かなぁと考えたときに
リスト内包表記内とかで使うと便利かも?と思いついたので試してみました。

# 単純出力
[print(x) for x in ("aaa", "bbb", "ccc")]
# -> aaa
#    bbb
#    ccc

# CSV風出力
[print(x, end=",") for x in ("aaa", "bbb", "ccc")]
# -> aaa,bbb,ccc,
# ※この場合、printが複数回呼ばれるため、sepではなくendです。

# format出力
[print("%03d" % (x * 2)) for x in (1, 2, 3)]
# -> 002
#    004
#    006

実際まだPythonのコードをほとんど書いたことがないので
本当に便利かは実感できてないですが...
こんなことも出来るようになったようです的なご紹介でした!

おまけ

下記、同じ結果になるのですが、どちらが良いのだろう??

print("aaa", "bbb", sep="")
print("aaa" + "bbb")

速度を簡単に測ってみたところ+演算子を使った方が若干速そうです。

+演算子未使用 +演算子使用
平均 0.3108s 0.2562s
1回目 0.312s 0.331s
2回目 0.298s 0.280s
3回目 0.354s 0.220s
4回目 0.271s 0.252s
5回目 0.365s 0.302s
6回目 0.295s 0.217s
7回目 0.355s 0.218s
8回目 0.292s 0.299s
9回目 0.278s 0.228s
10回目 0.288s 0.215s

テストコード

# +演算子未使用
for i in range(10000):
    print("aaa", "bbb", "ccc", sep="")

# +演算子使用
for i in range(10000):
    print("aaa" + "bbb" + "ccc")

最後25日目は2011 Pythonアドベントカレンダー(Python3)にお返ししますー。
でいいのかな?