Python入門|文字列を動的に出力できるformat関数とはのイメージ画像

Python入門|文字列を動的に出力できるformat関数とは

  • 公開日:2018/04/07
  • 更新日:2018/10/19
  • 投稿者:n bit

Pythonでの文字列操作を色々と便利にしてくれるformat関数。アプリケーションを構築する際に頻繁に出てくるPythonの文字列操作はオブジェクトのタイプの違いによるエラーや、後から読み込む文字列を使って動的な出力、結合時の表示の複雑さ、表示順序や表示回数のコントロールなどがあり意外と大変な作業です。

しかし、format関数を利用することでこれらの問題をスマートに解決することができます。今回はこのformat関数を初心者にもわかりやすいよう詳しく解説します。

  • Python

この記事は約 分で読めます。(文字)

format関数とは

format関数は文字列の中に後からあなたの文字列を読み込んで動的に出力したい場合に利用します。1番オーソドックスな表記方法は下記の通りです。

text.format('引数')

format関数の基本的な使い方

実際に使ってみましょう。

text = '私は{}です'

print(text.format('太郎'))

読み込みのベースとなる文字列の中に {} (波括弧)を用意します。{}付の文字列を格納した変数に続けてフォーマット関数を記載して引数に読み込みたい文字列を与えます。

出力すると下記のように返ってきます。

私は太郎です

このようにフォーマット関数を利用すると読み込みベース文字列の {} (波括弧)部分に、読み込みたい文字列が読み込まれて出力されます。

引数には変数も使える

引数には変数を入れても大丈夫です。

text = '私は{}です'
name = '太郎'

print(text.format(name))

私は太郎です

オブジェクトのタイプを気にすることなく利用できる

format関数の便利な特徴はタイプの違うオブジェクトでもそのまま引数に与えることができることです。

通常文字列に整数などのintタイプを結合するときは1度strタイプに変更する必要があります。そのまま結合すると下記の様なタイプエラー(TypeError)が発生します。これはstrタイプとintタイプを結合しようとして起こるエラーです。

no = 1

print('私の順位は' + no + '位です')

TypeError: Can't convert 'int' object to str implicitly

タイプエラーを回避するためにはintタイプをstrタイプに変更してから結合する必要があります。

no = 1

print(type(no))
print('私の順位は' + str(no) + '位です')

<class 'int'>
私の順位は1位です

format関数であればこのようなタイプの違いを気にすることなくそのまま引数として与えてしまっても正常に出力されます。

text = '私の順位は{}位です'

no = 1 print(type(no))
print(text.format(no))
<class 'int'>
私の順位は1位です

floatタイプ(浮動小数点数)でも同じように問題ありません。

text = '私の順位は{}位です'

no = 1.0 print(type(no))
print(text.format(no))
<class 'float'>
私の順位は1.0位です

format関数で複数の文字列を読み込む

フォーマット関数では複数の文字列の読み込みにも対応しています。読み込む数だけ文字列の中に {} (波括弧)を用意するだけです。複数の引数は間を , で区切ってください。

text = '私は{}です。順位は{}位です。'

name = '太郎'
no = 1 print(text.format(name, no))

私は太郎です。順位は1位です。

今回のように複数読み込む各オブジェクトのタイプが違う場合に先程のタイプを気にしないformat関数の特性がとても便利です。

文字列の読み込む場所をインデックスで指定する

{} (波括弧)指定する読み込み位置にインデックスを指定することで読み込み順序や読み込み回数を自由にコントロールすることができます。

text = '順位{1}位のユーザ:「私は{0}です。順位は{1}位です。」'

name = '太郎'
no = 1
print(text.format(name, no))

順位1位のユーザ:「私は太郎です。順位は1位です。」

{} (波括弧)内のインデックス番号はフォーマット関数の引数の位置を表すインデックス番号となります。引数の左から0,1,2と数えていきます。

text.format(インデックス[0], インデックス[1], インデックス[2]))

文字列の読み込む場所を名前(キーワード引数)で指定する

先ほどはインデックス番号で読み込み位置を指定しましたが、名前で指定することも可能です。{} (波括弧)で指定する読み込み位置に直接名前を指定します。インデックスの時と同じで読み込む位置や、読み込み回数をコントロールできます。

text = '順位{no}位のユーザ:「私は{first_name}です。順位は{no}位です。」'

name = '太郎'
no = 1
print(text.format(first_name = name, no = no))

順位1位のユーザ:「私は太郎です。順位は1位です。」

{} (波括弧)内のキーワードと指定する変数を、フォーマット関数の()内で = で繋いで設定します。ソースコードが直感的にわかりやすくなりますので読み込み順序が複雑であったり、読み込む数が多い場合にはお勧めです。

text.format(キーワード = 変数, キーワード = 変数, キーワード = 変数))

このように関数で利用する引数を、キーワードを使って指定する方法をキーワード引数と呼びます。

format関数の応用的な使い方

少し応用的な使い方を紹介します。

フォーマット関数の引数にリストを指定する

キーワード引数でリストタイプを読み込み、読み込んだリストのインデックス番号で表示させる内容を指定することが可能です。

text = '順位{user[1]}位のユーザ:「私は{user[0]}です。順位は{user[1]}位です。」'

user_list = ['太郎', 1]
print(text.format(user = user_list))

順位1位のユーザ:「私は太郎です。順位は1位です。」

このやり方であれば大量にあるリストの文字列出力や、入れ子状になったリストなどをfor文で回して一気に表示させたりと使い方の幅が広がります。

今日のdot

フォーマット関数は読み込む文字列のオブジェクトタイプを気にすることなく読み込むことが可能で、非常に柔軟な文字列操作を行うことができます。また、引数をインデックスやキーワード引数を使って指定することで、読み込み順序や回数も自由に設定することができます。

文字列操作を行うときに非常に使いやすい関数となりますのでこれを機会に覚えておきましょう。