Python2.6+ では、元の '%' 演算子を置き換える str.format 関数が追加されています。この使用方法は、「%」よりも直感的で柔軟です。詳しい使い方をご紹介します。
以下は '%' の使用例です:
"" "PI is %f..." % 3.14159 # => 'PI is 3.141590...' "%d + %d = %d" % (5, 6, 5+6) # => '5 + 6 = 11' "The usage of %(language)s" % {"language": "python"} # => 'The usage of python'
この形式は C 言語の printf によく似ていますね。 「%」は演算子であるため、パラメータは左右に1つしか配置できません。そのため、右側に複数の値を含める必要があり、タプルと辞書を併用することができず、柔軟性に欠けます。 。
同じ例を format メソッドを使用して書き換えます:
"PI is {0}...".format(3.14159) # => 'PI is 3.14159...' "{0} + {1} = {2}".format(5, 6, 5+6) # => '5 + 6 = 11' "The usage of {language}".format(language = "Python") # => 'The usage of Python'
とても直感的ではないでしょうか? (もちろん、C 言語を使用する場合は、前者の書式設定方法も気に入っています:-) )
文字列の書式設定
"{named} consist of intermingled character {0} and {1}".format("data", "markup", \ named = "Formats trings") format(10.0, "7.3g") # => ' 10' "My name is {0} :-{{}}".format('Fred') # => 'My name is Fred :-{}'
ステートメントを次のようにする必要がある場合は、最初の行の '' に注意してください。ラップされた場合は、末尾にバックスラッシュを付けてエスケープする必要があります。
「%」を使用すると、このようにタプルと辞書を混在させることはできません。実際、ここには Python の機能である名前付きパラメーターがあります。配列を定義するときに、*args、**kwargs 構文を使用してコレクションと辞書を拡張できます。名前付きパラメータが最後に配置されることに注意してください。
2 番目のステートメントは、format 組み込み関数を使用して単一の値をフォーマットすることを示します。
3 番目のステートメントは、{} のエスケープを表します。これは、{} が書式設定された文字列内の特殊文字であり、直接表示できないためです。エスケープ方法は、さらに 1 レベルをネストすることです。
プロパティとインデックスの使用
"My name is {0.name}".format(open('out.txt', 'w')) # => 'My name is out.txt'
'{0.name}'は、オブジェクトのプロパティ open('out.txt', 'w').name
"My name is {0[name]}".format(dict(name='Fred')) # => 'My name is Fred'
を呼び出すことと同じです
インデックスの使用も可能です。
obj[key] は obj.____getitem____('key') と同等です
標準指定子 (Specifiers)
C 言語を書いたことのあるプログラマは、printf の複雑さを知っておく必要があります。 format は、値の形式を解釈して文字列に挿入するために使用される多数の標準指定子も定義します。例:
"My name is {0:8}".format('Fred') # => 'My name is Fred '
':' の後に指定子が続きます。上の例では、指定子には '8' (最小幅) が 1 つだけあります。これは、挿入された値の幅が少なくとも 8 であることを意味します。 。 「Fred」には 4 つしかないため、さらに 4 つのスペースが追加されます。
指定子の詳細な形式は次のとおりです:
[[fill]align][sign][#][0][minimumwidth][.precision][type]
(C の printf よりも簡潔ではありません!)
注: '[]' は要素がオプションであることを意味します。したがって、すべての形式指定子はオプションです。前の例と同様に、これはほとんど使用されません (例をわかりやすくするためだけです)。実際、これらは非常に便利です。
一つずつ見てみましょう:
1. [fill]align は配置を意味します。 minimumwidth が挿入された値より大きく設定されている場合、前の例の「My name is Fred」のように空白が生じます。デフォルトでは、スペースは右側に配置されます。これは、挿入された値がデフォルトで左揃えになることを意味します。 {0:>8} を試してみると、結果は「My name is Fred」となることがわかります。
fill は、空白スペースを埋めるために使用される文字を表します。 Fill は、align が指定されている場合にのみ役立ちます。 align には次のロゴを指定できます:
< 左揃え、デフォルト
> 右揃え
= 整列ロゴの後にスペースを入れます。これは数字にのみ有効です。それはどういう意味ですか?以下で説明するように、align は数値の正負の符号を表示しますが、これも数値に対してのみ有効です。 「=」を指定すると、空白の前に数値の正負の符号が表示されます。例: format(-12, "0=8") # => '-0000012' ここでは、単一の値をフォーマットする組み込み関数の形式が使用されていることに注意してください。 「0」は空白を埋めるために使用されるfill要素で、「=」はマークで、「8」は最小幅が8であるため、空白が5つしかないことを意味します。揃えるのはどうですか? align は実際にはプラス記号とマイナス記号の表示方法を記述します。これについては後で説明しますが、ここではデフォルトの '-' が使用されます。
^ 中央揃え
2. デジタル記号を署名します。数値にのみ有効です。
+ はプラス記号とマイナス記号を表示します
- はプラス記号を表示せず、マイナス記号を表示します。最小幅を指定しない場合、負の数値は常に正の数値より 1 つ多いシンボル位置を占めます。デフォルト
' (スペース) プラス記号を空白スペースに置き換えます
3. # 表示される数値の接頭辞は 10 進数を表します (0b、0o、0x)
4 を使用します。 0の場合は0' 空白スペースを埋めてください。
5. minimumwidth は、何度も使用されている最小幅を指定します。
6. 精度 「精度」は、表示する小数点以下の桁数を示す 10 進数です。
7. 型値の型:
① 整数型:
b 2進数
c 文字型、数値をUnicodeを表す文字に変換
d 10進数
o 8進数
x 16進数、小文字表示
、スペース不可) dと同じ
②浮動小数点数
e 科学计数法表示,小写e
E 科学计数法表示,大写E
f 显示为定点数,默认小数点后六位
F 同f
g 自动选择是否用科学记数法表示
G 同g
n 同g,使用本地表示方式
% 使用百分比表示
''(空) 同g
每个对象可以重写自己的格式化说明符,例如datatime类重写了后可以这样表示:
"Today is: {0:%a %b %d %H:%M:%S %Y}".format(datetime.now())
预先转换
':'之后是格式说明符,之前还可以加预先转换的标识
!r 调用对象的_repr_方法来转换成标准字符串
!s 调用对象的_str_方法来转换成字符串
重写_format_方法
我们在格式化一个字符串时,首先格式化每个值,然后再插入字符串内。格式化值调用的就是format内置方法。format则是简单地调用该值的_format_方法。
def format(value, format_spec): return value.__format__(format_spec)
在object类内实现了_format方法,只是将本身用str()转换成字符串,然后将字符串传入内置的format方法,实际上就是调用转换为字符串后的format_方法。
class object: def __format__(self, format_spec): return format(str(self), format_spec)
int/float/str自身实现了_format_方法,前面已经介绍了它们各自的说明符。
结束语
还有一点儿是自定义Formatter,不过平常也用不到。留作下篇string模块源码解读的内容吧。建议有兴趣的朋友多看看Python标准库的源码,很有学习价值。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。
更多Python实现字符串格式化的方法小结相关文章请关注PHP中文网!