文字列のフォーマット format() を使ってみたメモ
//編集中 2012/12/05 追記
//formatで変数の展開、kw,list,辞書,変数を*で展開、**で展開、について触れる。
//第6回 Pythonicな文字列フォーマットforamat()メソッド http://gihyo.jp/dev/serial/01/pythonhacks/0006
文字列出力のpythonicな方法
これまでは、C-likeな使い方。「print "%d %s" % (10, "hoge")」 みたいな。
%演算子を使うに当たってPython以外の知識を覚えなければならない。
辞書のキーを指定した埋め込みではまったく違う表記を使うなど,アドホックな仕様もあった。
format()は、pythonの記法に近い方法で、C由来の方法を置きかえる目的で追加された。
PEP 3101 -- Advanced String Formattingとして記載(ver.2.6で追加された)
なので、%記法は近い将来廃止予定(非推奨)
一応3.2ではsupportはまだされている。
例
#! /usr/bin/env python # -*- coding: utf-8 -*- #-------------------------------------- # これまでのやりかた(Cのやりかたを踏襲) #-------------------------------------- # タプル渡し print "%d %d %s" % (1, 3, "unpopo") # 辞書渡し hoge="HOGE" print "%(hoge)s" % locals() print "%(fuga)s" % {"fuga":"FUGA"} #exit() #--------------------- # formatを使ったやり方 #--------------------- # formatとは、文字列のmethodでこんな感じで使える。 print "{0} {1} {2}".format("unpopo", 12345, "popopo-") # <基礎編> # (1-1)リスト渡し: {N}(Nは整数,0オリジン)でformatの要素を表示する # Index指定で、要素の順番を入れ替えられる fmt_list1 = "list-1 {0} {1} {2} {3}" ret = fmt_list1.format( 0, 10, 20, 30 ) print ret fmt_list2 = "list-2 {0} {3} {1} {2}" ret = fmt_list2.format( 0, 10, 20, 30 ) print ret # *を指定するとリスト展開後の要素にアクセスできる(他の関数と同様) l1 = [0, 10, 20, 30] ret = fmt_list2.format(*l1) print ret # {N[key]}で辞書の要素にアクセスできる d1 = {'x':"xxx", 'y':"yyy"} fmt_list3 = "list-3 {0[x]} {0[y]}" ret = fmt_list3.format( d1 ) print ret print "------------" #exit() # (1-2)K/W渡し: {key} でformatに渡したキーワードを展開して表示する fmt_dict1 = "dict-1 {hoge} {moge} {hoge}" ret = fmt_dict1.format( hoge="hogehoge", moge=12345 ) print ret # {key[key]}で辞書の要素にアクセスできる d2 = {'a':"aaa", 'b':"bbb"} fmt_dict2 = "dict-2 {hoge[a]} {hoge[b]}" ret = fmt_dict2.format( hoge=d2 ) print ret # **を指定するとK/W展開後の要素にアクセスできる(他の関数と同様) fmt_dict3 = "dict-3 {a} {b}" ret = fmt_dict3.format( **d2 ) print ret #exit() print "------------" # (1-3)オブジェクト渡し: クラスオブジェクトや、モジュールを渡して、 # "."で指定して要素にアクセスさせる class Unpopo(object): def __init__(self, l, m, n): self.l = l self.m = m self.n = n u1 = Unpopo("abc",123,"xyz") fmt_obj1 = "{0.l} {0.m} {0.n}" ret = fmt_obj1.format( u1 ) print ret fmt_obj2 = "{unpopo.l} {unpopo.m} {unpopo.n}" ret = fmt_obj2.format( unpopo=u1 ) print ret fmt_obj3 = "python version: {0.version}" import sys ret = fmt_obj3.format( sys ) print ret print "------------" # (2-1) フォーマットコントロール # 領域と、幅寄せ print "{0:10} {1} {2:>20}".format("hogehoge","|","fugafuga") # 他にもいろいろアルがそれはmanual参照