演算子の強さ

通常、「%」を剰余演算子として考えている場合、この演算子と「*」 (乗算演算子)の結合の強さが同じだということは、よーく理解している。(と思う)
しかし、盲点があったのだ。以下の式を見て欲しい。Python では、「%」を文字列の置換演算子として用いる(後述)。

print "This is a '%s.'" % "pen" * 0

あまり面白くない例で恐縮だが、これを実行すると、改行しか表示されなくて悩んでしまった。実は、% と * は演算子の結合度が同じレベルで、かつ左結合なので

print ("This is a '%s.'" % "pen") * 0

と同じなのだー。つまり本当は、次のようにしなくてはならなかったということだ。

print "This is a '%s.'" % ("pen" * 0)

つまらない例題で、どうもすみません。

「後述」の件

Python では、ANSI C でいうところの sprintf() みたいなことを、「%」演算子で実現できます。"%s" % a のようにすると、%s の部分が a の文字列表現で置換される、というわけ。