開発言語 Python(その11)

【連載】

にわか管理者のためのLinux運用入門

【第172回】開発言語 Python(その11)

[2019/04/02 09:45]後藤大地 ブックマーク ブックマーク

サーバ/ストレージ

文字列フォーマット

The Python Tutorial」では、モジュールおよびパッケージの説明した後、プログラミング言語としてPythonを使う場合に必要となる最低限の関数の使い方などが紹介されていく。最初に取り上げられるのは文字列のフォーマットに関してだ。

Pythonは、もともとC言語のprintfで使われるのとよく似た「%」を使った文字列のフォーマットに対応している。C言語やC言語のprintf()と同じ系列のフォーマットを採用しているプログラミング言語の経験のある方であれば、これが最も学習しやすいフォーマットの方法だろう。

%を使った文字列のフォーマット例は以下のようになる。

>>> import math
>>> print('The value of pi is approximately %5.3f.' % math.pi)
The value of pi is approximately 3.142.
>>>

新しいPythonでは、%ではなく{}およびformat()を使ったフォーマット機能が提供されている。こちらのほうが多機能でさまざまな表現がしやすいと考えられているからだ。例えば、最も簡単な{}の使用例は、次のようになる。

>>> year = 2019
>>> month = 5
>>> gengo = '令和'
>>> '{year}年{month}月 - 元号: {gengo}'
'{year}年{month}月 - 元号: {gengo}'
>>> f'{year}年{month}月 - 元号: {gengo}'
'2019年5月 - 元号: 令和'
>>>

上記のように{}で囲むことで、その変数の内容を出力させることができる。シングルクォーテーションの前に「f」または「F」を指定すると、フォーマットが解釈された出力が行われる。上記では{}の例を示したが、実際のコーディングでは、format()が使われることが多いかもしれない。

format()

最近のPythonでは、基本的にformat()を使ってフォーマットを行うものだと考えておくとよいだろう。基本的な使い方は次のとおりだ。

>>> yes_votes = 42_572_654
>>> no_votes = 43_132_495
>>> percentage = yes_votes / (yes_votes + no_votes)
>>> '{:-9} YES votes  {:2.2%}'.format(yes_votes, percentage)
' 42572654 YES votes  49.67%'
>>>

{}とformat()の中の引数が対応しており、{}の中に変数名ではなくフォーマットを指定する仕組みになっている。

format()でどのようなフォーマットの指定ができるかは、チュートリアルに掲載されている次のサンプルを見るとよくわかると思う。

>>> print('We are the {} who say "{}!"'.format('knights', 'Ni'))
We are the knights who say "Ni!"
>>> print('{0} and {1}'.format('spam', 'eggs'))
spam and eggs
>>> print('{1} and {0}'.format('spam', 'eggs'))
eggs and spam
>>> print('This {food} is {adjective}.'.format(
...     food='spam', adjective='absolutely horrible'))
This spam is absolutely horrible.
>>> print('The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred',
...     other='Georg'))
The story of Bill, Manfred, and Georg.
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print('Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; '
...     'Dcab: {0[Dcab]:d}'.format(table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print('Jack: {Jack:d}; Sjoerd: {Sjoerd:d}; Dcab: {Dcab:d}'.format(**table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
>>> for x in range(1, 11):
...     print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x))
... 
 1   1    1
 2   4    8
 3   9   27
 4  16   64
 5  25  125
 6  36  216
 7  49  343
 8  64  512
 9  81  729
10 100 1000
>>>

上記では、数値の桁数の指定のほか、位置パラメータによる変数の指定、名前を付けた変数の指定、ハッシュテーブルを使った指定などが行われている。

また、次のようにrjust()を使うと右揃えで値を出力させることができる。

>>> for x in range(1, 11):
...     print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ')
...     # Note use of 'end' on previous line
...     print(repr(x*x*x).rjust(4))
... 
 1   1    1
 2   4    8
 3   9   27
 4  16   64
 5  25  125
 6  36  216
 7  49  343
 8  64  512
 9  81  729
10 100 1000
>>>

IDや数値は特定桁数をゼロ埋め(前ゼロ)された状態で使われることも多い。Pythonではzfill()を使うことでこれを実現することができる。

>>> '12'.zfill(5)
'00012'
>>> '-3.14'.zfill(7)
'-003.14'
>>> '3.14159265359'.zfill(5)
'3.14159265359'
>>>

変数には、フォーマットされる前に値を変換する方法として「!a」「!s」「!r」という指定方法も用意されている。「!a」はascii()、「!s」はstr()、「!r」はrepr()を意味しており、それぞれの関数が提供された結果がフォーマットの対象となるようになる。

>>> animals = 'eels'
>>> print(f'My hovercraft is full of {animals}.')
My hovercraft is full of eels.
>>> print(f'My hovercraft is full of {animals!r}.')
My hovercraft is full of 'eels'.
>>>

また、「math」をimportすると、次のように代表的な数値演算向けの値が利用できるようになる。

>>> import math
>>> print(f'The value of pi is approximately {math.pi:.3f}.')
The value of pi is approximately 3.142.
>>>

str()とrepr()

チュートリアルではformat()のようにフォーマッティングを目的とするのではなく、中の文字列の確認やデバッグに用いる目的でstr()とrepr()についても触れている。str()は人間が読みやすい状態の文字列として表示する関数、repr()はそのままインタプリタで指定できる状態の文字列を表示する関数だ。両関数の基本的な使い方を以下に示す。

>>> s = 'Hello, world.'
>>> str(s)
'Hello, world.'
>>> repr(s)
"'Hello, world.'"
>>> str(1/7)
'0.14285714285714285'
>>> x = 10 * 3.25
>>> y = 200 * 200
'0.14285714285714285'
>>> # The repr() of a string adds string quotes and backslashes:
... hello = 'hello, world\n'
>>> hellos = repr(hello)
>>> print(hellos)
'hello, world\n'
>>> # The argument to repr() may be any Python object:
... repr((x, y, ('spam', 'eggs')))
"(32.5, 40000, ('spam', 'eggs'))"
>>>

str()の使い方は直感的でわかりやすいだろう。repr()のほうは、人間の目には少し読みにくくなるが、そのままインタプリタにかませることができる状態になっていることがわかる。

* * *

C言語の%を使ったフォーマットに慣れていると、ついつい%を使った方法を使いがちだが、より柔軟な書き方ができるのはformat()と{}を使った方法だ。どちらを使うかは結局は好みの話になるが、format()と{}を使ったプログラムも読めるくらいにはなっておこう。

【参考資料】
The Python Tutorial

※ 本記事は掲載時点の情報であり、最新のものとは異なる場合がございます。予めご了承ください。

一覧はこちら

連載目次

もっと知りたい!こちらもオススメ

なぜ今、統合システムなのか? 押さえておくべき「3つのインパクト」

なぜ今、統合システムなのか? 押さえておくべき「3つのインパクト」

ガートナー ジャパンは10月31日~11月2日、都内で「Gartner Symposium/ITxpo 2017」を開催。11月1日には同社 主席アナリストの青山浩子氏が登壇し「CIOが理解すべき統合システムの3大インパクト」と題する講演を行った。本稿では、講演の内容をダイジェストでお届けする。

関連リンク

この記事に興味を持ったら"いいね!"を Click
Facebook で IT Search+ の人気記事をお届けします

会員登録(無料)

注目の特集/連載
[解説動画] Googleアナリティクス分析&活用講座 - Webサイト改善の正しい考え方
知りたい! カナコさん 皆で話そうAIのコト
教えてカナコさん! これならわかるAI入門
対話システムをつくろう! Python超入門
Kubernetes入門
AWSで作るクラウドネイティブアプリケーションの基本
ソフトウェア開発自動化入門
PowerShell Core入門
徹底研究! ハイブリッドクラウド
マイナビニュース スペシャルセミナー 講演レポート/当日講演資料 まとめ
セキュリティアワード特設ページ

一覧はこちら

今注目のIT用語の意味を事典でチェック!

一覧はこちら

ページの先頭に戻る