ビギナー
Python少しずつ触れてみてるんですけど…
先生
何か困ったことでもあったの?
ビギナー
文字列を出力するときのフォーマットがいつもわからなくなるんです。
先生
いくつか種類もあるし、こんがらがるかもね。
ビギナー
何とかならないですか?
先生
では、一つずつ解説していきましょう。今回はprintf形式ね。
printf形式の文字列書式
print内の書式の変更やファイル出力時のフォーマット指定(fmt=**)の際に用いられているように感じます。この形式はCを踏襲しているみたいです。(C未履修民なので詳しくは知りません。)
ちなみに、日本語訳の注釈部に以下の記述があったので私は基本そちらを使うことにしてます。
注釈 ここで述べる書式化演算には様々な癖があり、よく間違いの元になっています (タプルや辞書を正しく表示できないなど)。新しい フォーマット文字列リテラル や str.format() インタフェースの方が間違いにくく、より強力で、柔軟で、さらに拡張可能です。
基本ルール
以下のルール(原文日本語訳まま整形)に従い、以下の出てくる順に指定することで書式が指定されていきます。
- 指定子の開始を示す文字 ‘%’
- マップキー (オプション)丸括弧で囲った文字列からなります (例えば (somename)) 。
- 変換フラグ (オプション)一部の変換型の結果に影響します。
- 最小のフィールド幅 (オプション)‘*’ (アスタリスク) を指定した場合、実際の文字列幅が valuesタプルの次の要素から読み出されます。タプルには最小フィールド幅やオプションの精度指定の後に変換したいオブジェクトがくるようにします。
- 精度 (オプション)‘.’ (ドット) とその後に続く精度で与えられます。’*’ (アスタリスク) を指定した場合、精度の桁数はvaluesタプルの次の要素から読み出されます。タプルには精度指定の後に変換したい値がくるようにします。
- 精度長変換子 (オプション)
- 変換型
分からないので解読していく
私はこれを読んで、唯一分かったのは最初に%が必要っていうことぐらい。一緒に例があったのでそれをヒントに実践しつつ解読していきます。
print('%(lang)s has %(num)03d quote types.' %{"lang": "Python", "num": 2}) >>>Python has 002 quote types.
- 1つ目は%を付けることでそこに何か変数(定数)を入力できる。なお、その変数は後ろに%を付けて呼び出す。
- 2つ目は変数が複数あるような場合、呼び出すモノの名前を()で書けば指定できる。
図解)
管理人
%が
lang
とnum
の2つあるよね。そのうちの一つに注目するとlang
って名札がついたモノを後ろに置いておくからそれを挿入してね。ちなみにlang
の名札がついている文字はPythonという文字だよ。って感じです。- 3つ目は型変換のフラグ例えばdと書けば、10進数とかsと書けば文字列が返ってくる。
以下に頻出のものを並べておきます。なお、%とフラグの間に2つ目に示した変数名を入れる場合は%(name)s
のようになります。
変換フラグ | 何に変換されるか |
---|---|
%d, %i | 符号つき 10 進整数 |
%o | 符号つき 8 進整数 |
%x, %X | 符号つき 16 進整数(大文字・小文字は区別されて表記される) |
%e, %E | 指数表記の浮動小数点数 |
%r | 文字列(Pythonオブジェクトをrepr()で変換) |
%s | 文字列(Pythonオブジェクトをstr()で変換) |
4.以降は。。。。僕は使ったことないので一旦置いときます。必要に駆られて使うようになって意味が分かったら追記します。