数弱の文系大学生によるブログです。

Python、Webデザイン関連の記事を投稿していけたらなと思っています。

備忘録的なブログなので、読みにくい文章だと思います。ご了承ください。

Python3の復習(書式指定)

こんにちは。

体力の衰えを感じている、かにまたごです。
バイトで久しぶりに首から下の筋肉を思いっきり使ってダウンしてました・・・。
もともと体力ある方ではないのですが、数時間作業しただけで翌日動けなくなるほどの筋肉痛になるとは思っていませんでした(;^ω^)
効率よく勉強するには健康管理も重要ですし、ランニングかなんかを少しずつ始めていきましょうかね。


さて、今回は

  • 書式指定

について、復習していきたいと思います。

本当は正規表現も一緒に記事にしようと思っていたのですが、読み返すのが面倒臭くなるくらいに長くなりそうだったので別々の記事にします。


今までのPython3 復習履歴は以下の通り。

  1. 数値・文字列
  2. リスト・タプル
  3. 辞書・集合
  4. if文・while文・for文
  5. 内包表記
  6. 関数
  7. ジェネレータ
  8. デコレータ
  9. 名前空間とスコープ
  10. アンダーバー・アンダースコアの意味
  11. エラー処理:try・except
  12. モジュール・パッケージ
  13. 標準ライブラリ
  14. オブジェクトとクラス①-クラスの定義-
  15. オブジェクトとクラス②-継承-
  16. プロパティ
  17. ポリモーフィズムとダックタイピング
  18. 特殊メソッドとその他諸々
  19. Unicodeとエンコード・デコード

書式指定

文字列にデータを挿し込む方法。
これはめちゃくちゃ使ってる。

  • 古い書式

" %データ型 " % データ の形でデータを挿し込む。
こっちの書式使ったことないな・・・。

データ型は以下。

  • %s = 文字列
  • %d = 10進整数
  • %x = 16進整数
  • %o = 8進整数
  • %f = 10進float
  • %e = 指数形式float
  • %g = 10進floatまたは指数形式float
  • %% = リテラルの%

とりあえずコード。
よく使うであろう %s %d %f に絞って試してみる。

name_str = "I'm %s." % "Kanitamago"
age_str = "I'm %d years old." % 22
height_str = "I'm %f centimeters tall." % 172.3

print(name_str)
print(age_str)
print(height_str)
I'm Kanitamago.
I'm 22 years old.
I'm 172.300000 centimeters tall


挿入されるデータの幅を指定する場合。

name_str = "I'm %20s." % "Kanitamago"
age_str = "I'm %11d years old." % 22
height_str = "I'm %19f centimeters tall." % 172.3

print(name_str)
print(age_str)
print(height_str)
I'm[          Kanitamago.] = [ から ] までの幅が20、右寄せ
I'm[          22] years old. = [ から ] までの幅が11、右寄せ
I'm[          172.300000] centimeters tall. = [ から ] までの幅が19、右寄せ

左寄せの場合は、マイナスを指定する。

name_str = "I'm %-20s." % "Kanitamago"
age_str = "I'm %-19d years old." % 22
height_str = "I'm %-19f centimeters tall." % 172.3

print(name_str)
print(age_str)
print(height_str)
I'm [Kanitamago           ]. = [ から ] までの幅が20、左寄せ
I'm [22                  ]years old. = [ から ] までの幅が19、左寄せ
I'm [172.300000          ]centimeters tall = [ から ] までの幅が19、左寄せ

複数指定の場合はタプルで渡す。

myinfo = "I'm %s. | I'm %d years old. | I'm %f centimeters tall." % ("Kanitamago", 22, 172.3)

print(myinfo)
I'm Kanitamago. | I'm 22 years old. | I'm 172.300000 centimeters tall.

小数を指定することで、文字数の上限を指定できる。

#%s = 文字数上限4
#%d = 文字数上限3(足りない分は0で埋められる)
#%f = floatの場合は、小数点以下の桁数
myinfo = "I'm %.4s. | I'm %.3d years old. | I'm %.1f centimeters tall." % ("Kanitamago", 22, 172.3)

print(myinfo)
I'm Kani. | I'm 022 years old. | I'm 172.3 centimeters tall.
  • 新しい書式

" { } ".format(データ) の形でデータを挿し込む。

さっきの例にこの書式を取り入れる。

name_str = "I'm %s." % "Kanitamago"
age_str = "I'm %d years old." % 22
height_str = "I'm %f centimeters tall" % 172.3

introduce = """
    NAME: {}
    AGE: {}
    HEIGHT: {}
            """.format(name_str, age_str, height_str)

print(introduce)
    NAME: I'm Kanitamago.
    AGE: I'm 22 years old.
    HEIGHT: I'm 172.300000 centimeters tall

幅や文字数上限等のオプションは、:(コロン)の後に続ける。

introduce = """
    NAME: {:.8}
    AGE: {:.6}
    HEIGHT: {:.9}
            """.format(name_str, age_str, height_str)

print(introduce)
    NAME: I'm Kani
    AGE: I'm 22
    HEIGHT: I'm 172.3

挿し込む位置を指定することができる。
{ }の中に引数の位置を指定する。

introduce = """
    NAME: {1}
    AGE: {2}
    HEIGHT: {0}
            """.format(height_str, name_str, age_str)

print(introduce)
    NAME: I'm Kanitamago.
    AGE: I'm 22 years old.
    HEIGHT: I'm 172.300000 centimeters tall

キーワードで挿し込むこともできる。
こちらの方が分かりやすい。

introduce = """
    NAME: {name}
    AGE: {age}
    HEIGHT: {height}
            """.format(height=height_str, name=name_str, age=age_str)

print(introduce)
    NAME: I'm Kanitamago.
    AGE: I'm 22 years old.
    HEIGHT: I'm 172.300000 centimeters tall

幅と寄せる方法の指定は、新しい書式の方が直感的に理解できる。

#幅30、右(>)寄せ
test_age = "I'm {age:>30d}".format(age=33)

print(test_age)
I'm                             33

中央寄せは ^ (ハット・キャレット)を使う。

test_age = "I'm {age:^30d}".format(age=33)

print(test_age)
I'm               33              


新しい書式で出来なくなったこと整数の文字数上限

old_style = "I'm %.7d old." % 3000
print(old_style)

new_style = "I'm {age:.7d} old.".format(age=3000)
print(new_style)
#old_style
I'm 0003000 old.
#new_style
Traceback (most recent call last):
  File "blog_test.py", line 1355, in <module>
    new_style = "I'm {age:.7d} old.".format(age=3000)
ValueError: Precision not allowed in integer format specifier


パディングのオプションも付けられる。
その際は、:(コロン)の直後、寄せる方向(>、<、^)の直前に記入する必要がある。

#幅7、右寄せ、☆で穴埋め
new_style = "I'm {age:☆>7d} old.".format(age=3000)

print(new_style)
I'm ☆☆☆3000 old.


新しい書式の方が使いやすいですね・・・。
デバッグや値の確認などでよく使うと思うので、どんどん活用していきます。


以上です。