【Python入門】文字列のフォーマット機能をマスターしよう



【Python入門】文字列のフォーマット機能をマスターしよう

プログラムの自動化処理を手伝ってくれるフォーマット機能。
今回はPython3のフォーマット/ format() についてご紹介させて頂きます。

目次
  1. 【Python入門】文字列のフォーマット機能をマスターしよう
  2. フォーマット機能とは
  3. Pythonのフォーマット機能が使われている例
  4. 基本的なformat()の使い方
  5. format()をすこし応用
  6. format() を使ったアプリを動かしてみよう
  7. Python初学者がformat()を学ぶ際の注意点
  8. まとめ

【Python入門】文字列のフォーマット機能をマスターしよう

フォーマット機能とは

Pythonにおける format() は関数の一種で、文字列の操作感を飛躍的に向上してくれます。 Webアプリケーションで使われたり、人工知能の処理プログラムで使われたりとPython学習者にとっては必見の関数でしょう。

「フォーマットとは」を説明する上で、恐らく日本語よりもPythonでコードを見てみる方が分かりやすいと思いますので簡単な例を紹介。下記画像の右下の再生マーク ▶ をクリックしてみて下さい。

format()の()内の数値が {} に代入されて処理が行われていることが解ると思います。 上記のような簡単なプログラムでは format() のスゴさが分かりにくいので、もう一例。


【カンニングされてもOKなランダムに並び替えられたテスト問題&回答を一発で作成】

ok.py を実行すると、それぞれ問題順と問題内容が異なるテストが自動作成。 format() 関数によって、ランダムに作成される問題や回答もキレイに制御してくれています。 これなら10人でも50人でもカンニングされても問題にならないテストを作成することができそうですね。

【上記動画のコード】ok.py


なんだか format() を使いこなせると、プログラムの表現力が一気にあがりそうですね。 ちなみに format() の開発サイトとPython公式内の説明は以下に公開されていますよ。

Pythonのフォーマット機能が使われている例

もう少しPythonのフォーマットについてご紹介させて頂きます。モチベーションUPにつながるよう、フォーマットのユースケースをご紹介。

■一括画像編集に■
たくさんの画像データにロゴを追加したり、サイズを変更したり、こういった一括作業にも .format() が使われます。下記コードでは、編集後のデータ・ファイル名を format() で制御。

python-format-img

Source: https://repl.it/@takayukioshima/Python-Tech2Go-LogoCreator

■音声の文字おこしに■
音声の文字起こしプログラムでもPythonの format() 使われています。下記コードでは、音声から変換されたテキストを format() で制御。

python-format-mp4

画像出典:blog.codingblocks.com

■IoT(畑監視システム)■
IoTシステムの中でもPythonの format() 活躍しています。下記コードでは、温度と湿度の値を format()で制御。

python-format-iot

画像出典:tech.recruit-mp.co.jp

■有名なWebフレームワーク Flask■
Webアプリケーションの開発に欠かせないフレームワークの中でも format() 使われています。バージョン管理やユーザー管理など。

python-format-flask

Source:GitHub.com

■自動売買のソフト開発に■
一昔前まで一般人には関係のなかったアルゴリズムトレード(自動売買)も今やPythonでサクっとできちゃいます。そのソフト開発でよく使うフレームワークでも format() 使われていますよ。

python-format-autotrade

Source:Zipline(GitHub)

いかがでしょうか、format 関数がいろいろなところで活用されていることを確認できますね。 基本的には、「たくさんのデータ」や「更新されるデータ」を format 関数で管理。プログラミング本来の「自動化」に format 関数はつながっているんですね。

それでは format() の必要性を知ったところで基本的な format() の使い方をマスターしましょう。

基本的なformat()の使い方

format() は、Webアプリや人工知能系など高度な処理プログラムでも使われますが、基本を理解しておかないと学習効率がおちますよね。 基本的な format() の使い方からチョット応用した使い方までを見ていきましょう。

print("私の誕生日は、{}です。".format("8月5日")) 

こちらのコードは、 format() 入門編っといったところでしょう。 文字列 "8月5日" を {} に挿入。 結果、以下のような出力に。

python-format-demo1

次に文字列ではなく、数値を挿入してみます。

print("私の誕生日は、{}月{}日です。".format(8,5)) 

python-format-demo2

先ほどの文字列に比べると、編集性が高まったように感じませんか?例えば、誕生日は (8,5) で一定なので、print文を日本語から英語、日本語から中国語などに変換すると、世界中の言語で誕生日を簡単に紹介することができそうではありませんか。

数値の挿入をもう少し応用してみます。

print("私の誕生日は、{}年{}月{}日です。".format(1980,8,5)) 

python-format-demo3

先ほどの文に年も追加しました。そして余談ですが、数値の挿入順は変更することが可能です。

"""順番の入れ替え"""
print("私の誕生日は、{0}年{1}月{2}日です。".format(1980,8,5))
print("私の誕生日は、{2}年{1}月{0}日です。".format(1980,8,5))

python-format-demo4

format() の挿入順は、目には見えませんが .format() の カッコ内の前から順番に 1番目,2番目,3番目 ・・・ となっています。挿入される側の {} には、1番目を入れる場合は {0}、2番目を入れる場合は {1}、後は順番です。 基本的には format() 内の数値をベースに {} 内の番号を変えて操作する方法が一般的でしょう。

次は変数と format() を組み合わせて使ってみます。

format()をすこし応用

y=1980
m=8
d=5
print("私の誕生日は、{}年{}月{}日です。".format(y,m,d))

python-format-demo5

先程までは、 .format() の中に数値が入力されていましたが、今度は変数に変わりました。 これにより更に編集性が高まり、アプリ開発への足がかりとなりそうですね。

次は、変数に format() がある場合はどうか、という点をプログラムしてみます。

open_string = "私の誕生日は、 {}です。"
print(open_string.format("8月5日"))

python-format-demo6

なんだかパズルみたいな感じで、挿入・代入が交錯してきます。 この変数に format() が文字列として代入される使い方は、サンプルアプリなどでもよく見かけます。 単語と () {} をよく目で追って、もしくはマーキングしてドコとドコがつながっているのか確認しておきましょう。

今度は、 "8月5日" の部分に変数を割り当ててみます。

open_string = "私の誕生日は、{}月{}日です。"
m=8
d=5
print(open_string.format(m,d))

python-format-demoLast-1

最後にこんな書き方もあるよ、という参考程度に1行で変数と format() を使って誕生日を紹介。

print("{who}の{event}は、{m}月{d}日です。".format(who="わたし",event="誕生日",m="8",d="5"))

python-format-demoLast

format() を使ったアプリを動かしてみよう

今回は、500名ぐらいのユーザーの中から今日誕生日の人を教えてくれるアプリを作ってみます。 facebookの「今日は●●さんの誕生日です」みたいな機能です。とりあえずjupyterもしくはターミナルからコードを実行してみて下さい。

import csv
from datetime import datetime
today = datetime.now().date().strftime("%m%d")
print("本日:",today)

with open("b.csv") as f:
    has_birthday = [user for user, birthday in csv.reader(f) if birthday == today]
    frm = "{} さんは、今日誕生日!!" if len(has_birthday) > 0 else "{}"
    print(frm.format(" さんと ".join(has_birthday or ["今日誕生日の方はおられません"])))

【ダウンロード】
birthday.pyb.csv

■結果■ python-format-sample

前半で本日の日付を取得。後半のCSVデータ読み込みと照合して、本日誕生日の方をピックアップします。

【上記サンプルの参考ポイント】

  • PythonでCSVファイルを読み込んで処理している
  • format() を条件分岐と組み合わせている
  • ユーザー数が膨大になってもすぐに誕生日の人がわかる

Python初学者がformat()を学ぶ際の注意点

ネット上で「Python format」もしくは「Python フォーマット」と、使い方を調べているとPython2の方が多くピックアップされているように思います。 Python2 と Python3 では format() の書き方が異なりますので注意しましょう。 間違って Python2 の format() も理解しちゃうと、より一層 format() が複雑化されて、学習時間が肥大化します。

【Python2のフォーマット】
Python3では、 .format() と関数宣言するのに対して、Python2では % で宣言。またPython2の場合、 print 文では () を使わないのでどちらのバージョンでコードを書いているか注意しましょう。

""" Python2のフォーマット文 """
print 'I am learning Python %s . but this code is Python %s ...' % ('3', '2')
""" Python3のフォーマット文 """
print("I am learning Python{}. so this code is not Python {} ...".format(3,2))

【出力結果】

python2-python3-competision

まとめ

format()、これが分かると自動化処理の仕組み理解に大いに役立ちます。 私自身本稿制作にあたって「おもしろいサンプルはないかな」と思い、調べながらプログラムしながら format() を改めて学習しました。 思ったことは「頭で理解する」のと「できる」のは、『大きく違う』ということ。 参考書やWebの記事を見ただけで format() を理解したと思っている方、要注意ですよ。

「format()以前に、変数や挿入、代入、、、わからない」という方、CodeCampで効率よくPythonスキルを身につけてみませんか? 「オンライン・マンツーマン・現役講師」がウリ・・CodeCampは、お試しレッスンも受付中ですよ。


【補足】
Pythonの format() には今回ご紹介した機能以外に、数値の取り扱いやスペースの取り扱いなどがあります。 もっと format() について知りたい、Pythonについて知りたいという方は参考書やPythonチュートリアル(digitalocean.comなど)をご参考下さい。


オシママサラ
この記事を書いた人
オシママサラ
\ 無料体験開催中!/自分のペースで確実に習得!
オンライン・プログラミングレッスンNo.1のCodeCamp