PR

Pythonで文字列を扱う(format関数編)

Python

Pythonのstring.format()メソッドは、文字列のフォーマットを行う際に非常に便利な機能です。このメソッドを使うことで、動的な文字列の生成や変数の挿入などを簡潔に行うことができます。ここでは、string.format()メソッドの基本的な使い方から、より高度なテクニックまでを詳しく解説します。

スポンサーリンク

基本的な使い方

まずは、string.format()メソッドの基本的な使い方から見ていきましょう。このメソッドは、文字列内に {} といったプレースホルダーを配置し、それらを後から渡された値で置換することで文字列をフォーマットします。例えば、次のようなコードを見てみましょう。

name = "John"
age = 30
sentence = "My name is {} and I am {} years old.".format(name, age)
print(sentence)

このコードは、name と age の値を文字列に挿入して出力します。{} の数が渡された値の数に対応し、順番に置換されます。

位置引数を使用する

string.format()メソッドでは、プレースホルダーに数値を付けることもできます。これにより、後ろの引数の順番を指定できるようになり、より可読性の高いコードを書くことができます。

'{0}, {1}, {2}'.format('a', 'b', 'c')
→'a, b, c'
'{2}, {1}, {0}'.format('a', 'b', 'c')
→'c, b, a'
'{2}, {1}, {0}'.format(*'abc')
→'c, b, a'
'{0}{1}{0}'.format('abra', 'cad')
→'abracadabra'

基本ルールは入れたい変数が一つだったけど、複数の変数を入れたくなったからナンバリングをしてるってだけですね。

引数は0から始まっていることだけ注意すれば、1つ目と2つ目の例からformat内の前から0,1,2と対応していることも分かるし、4つ目の同じものを二回呼び出すことも問題なくできることが分かります。

3つ目の補足:formatには一つの変数しか入ってないし、謎の「*(アスタリスク)」があります。色々調べるとアスタリスクはアンパックするという指示で、ここでいう一つの文字列’abc’を’a’と’b’と’c’の3つに分けて引き渡すという事です。つまり、2つ目の別表記と考えてください。

名前付き引数を使用する

string.format()メソッドでは、プレースホルダーに名前を付けることもできます。これにより、引数の順番を気にする必要がなくなり、より可読性の高いコードを書くことができます。

sentence = "My name is {name} and I am {age} years old.".format(name="Alice", age=25)
print(sentence)

引数の属性へアクセス

string.format()メソッドでは、プレースホルダーで引数の属性にアクセスできます。これにより、事前に別の変数に値を映しておく必要がなくなり、より可読性の高いコードを書くことができます。

c = 3-5j
('The complex {0} is real part {0.real} and imag part {0.imag}.').format(c)
→'The complex (3-5j) is real part 3.0 and imag part -5.0.'

cはcomplex型を利用しているのですが、complex型にはrealとimagいうプロパティが存在しています。そのプロパティに対して普通にアクセスができるみたいです。

引数の要素へアクセス

もちろんセットやリストの要素にもindexでアクセスできます。

coord = (3, 5)
'X: {0[0]};  Y: {0[1]}'.format(coord)
→'X: 3;  Y: 5'

書式指定子を使う

string.format()メソッドでは、書式指定子を使用して出力のフォーマットを制御することもできます。例えば、小数点以下の桁数を指定したり、文字列の幅を指定したりすることができます。

出力する桁を指定する

{}内に「:(コロン)」を書く事でここからキーワード引数だという事を示しています。

pi = 3.141592653589793
formatted_pi = "The value of pi is: {:.2f}".format(pi)
print(formatted_pi)

出力するテキスト幅を指定する

文字列の場合はこんな感じで指定します。

  1. 添え字を付けずに数字を入れた場合はテキスト幅を指定すします
  2. 数字の前に「<,>,^」を入れると文字列の配置位置を決められます
  3. その前にchar(サンプルは”*“)を入れるとその指定文字で埋めてくれます

では、下のを試してみます。

'{5:+^10}'.format(1,2,3,4,5,6,7,8)
→'++++6+++++'

結果はこんな感じで、5文字目に置かれます。

図解)

基数を指定する(基数の接頭辞付での出力含む)

"int: {0:d};  hex: {0:x};  oct: {0:o}".format(42)
→'int: 42;  hex: 2a;  oct: 52'
"int: {0:d};  hex: {0:#x};  oct: {0:#o}".format(42)
→'int: 42;  hex: 0x2a;  oct: 0o52'

キーワード引数は、さっきと同様で「:(コロン)」からスタートしてますね。

なぜ「d,x,o」なのか
→10進数、8進数、16進数の英語「decimal,Octal,Hexadecimal」の略です

正負と表示桁数を指定する

'{:+f}; {:+f}'.format(3.14, -3.14)
→'+3.140000; -3.140000'
'{: f}; {: f}'.format(3.14, -3.14)
→' 3.140000; -3.140000'
'{:.2f}; {:.2f}'.format(3.14, -3.14)
→'3.14; -3.14'

fは固定小数点を示す(Fixed-point)なのかな?調べても分かりませんでした。

それより覚えとかなきゃいけないのは「f」だけ指定すると小数点以下6桁表記されてしまう事です。デフォルトが6桁で、好きな桁数にしたい場合は「f」の前に表記したい桁数を3つ目のように「.2」を付与する必要があります。

では、表示桁数を削る時に気になる。四捨五入なのか切捨てなのかを検証。

'{0:.3f}:{0:.4f}'.format(0.123456)
→'0.123:0.1235'

四捨五入を使ってるみたいです。

1000の位にカンマを打つ

'{:,}'.format(1234567890)
→'1,234,567,890'

パーセント表記にする

points = 19.5
total = 22
'Correct answers: {:.2%}'.format(points/total)
→'Correct answers: 88.64%'

勝手に%にしてくれるので、100倍して%を付与する手間がかかりません。

日付表記にする

import datetime
d = datetime.datetime(2010, 7, 4, 12, 15, 58)
'{:%Y-%m-%d %H:%M:%S}'.format(d)
→'2010-07-04 12:15:58'

他にも、string.format()メソッドを使った文字列フォーマットの応用テクニックはさまざまあります。

スポンサーリンク

まとめ

以上、Pythonのstring.format()メソッドの使い方について解説しました。このメソッドを使うことで、柔軟性の高い文字列フォーマットを行うことができます。是非、これらのテクニックを活用して効果的な文字列操作を行ってみてください。

コメント

タイトルとURLをコピーしました