文字列のフォーマット

>>> mail = "hoge@hoge.com"
>>> password = "hogehoge"
>>> print "mail=%s&password=%s" % (mail, password)
mail=hoge@hoge.com&password=hogehoge
>>>
>>> year = 1989
>>> month = 11
>>> day = 25
>>> print "%d年%d月%d日" % (year, month, day)
19891125

文字列中の%変換指定(%sや%d)は引数で指定したタプルの要素で、順番に置き換えられます。書式によって右詰にしたり左詰にしたり、足りない部分を0で埋めたりといったことができます。詳しくはここを見るとよいです。


引数に辞書を渡すこともできますが、フォーマット文字列の書式が少し違います。

>>> query = {"mail":"hoge@hoge.com", "password":"hogehoge"}
>>> print "mail=%(mail)s&password=%(password)s" % query
mail=hoge@hoge.com&password=hogehoge
>>>
>>> date = {"year":1989, "month":11, "day":25}
>>> print "%(year)d年%(month)d月%(day)d日" % date
19891125


vars( )は現在参照できる変数名とその値を辞書にして返します。

>>> mail = "hoge@hoge.mail"
>>> password = "hogehoge"
>>> print "mail=%(mail)s&password=%(password)s" % vars()
mail=hoge@hoge.mail&password=hogehoge
>>>
>>> year = 1984
>>> year = 1989
>>> month = 11
>>> day = 25
>>> print "%(year)d年%(month)d月%(day)d日" % vars()
19891125

vars( )が返す辞書には必要ない変数も含まれます。当然、タプルを渡す場合と比べると遅いです。

from timeit import Timer

setup = """
mail = "hoge@hoge.com"
password = "hogehoge"
"""

stmt1 = "'mail=%s&password=%s' % (mail, password)"
stmt2 = "'mail=%(mail)s&password=%(password)s' % vars()"

print Timer(stmt1, setup).repeat(3, 100000)
print Timer(stmt2, setup).repeat(3, 100000)
[1.0013032400811277, 0.88645803650748412, 0.91006805343703379]
[2.3239804555892656, 2.3187373237902076, 2.3770830888885168]

思ったよりも差がありました。