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)にお返ししますー。
でいいのかな?