KNIMEST’s diary

KNIME使いがPythonも使いたくて勉強中

【Python学習帳】030_f文字列

初学者を対象としている京都大学の無料Python教材の学習中です。
「プログラミング演習 Python 2021」
Version2021_10_08_01.pdf

hdl.handle.net

CC-BY-NC-NDライセンスに従って引用します。

第5章の制御構造の勉強をしています。

5.9 数値を表示する際のフォーマット指定

まで学びました。

knimest.hatenablog.com

そして

gammasoft.jp

を読んで

今回はPython3ならばどのバージョンでも使えるformat()メソッドについて説明しますが、Python3.6以上に限定できるのであればf文字列の方が直感的で使いやすいです。

とあったのでf文字列を体験しようとしています。

BingChatにひとまず教材にf文字列に関しての記述があるかを聞いてみたところ、

PDF全てを検索して記載がなかったのか、例を自作して説明を始めてくれました。

f文字列とは、Python 3.6以降で導入された、文字列の中に変数や式を埋め込むことができる機能です。例えば、次のように書くと、変数nameとageの値が文字列に反映されます。

name = "Alice"
age = 20
message = f"Hello, {name}. You are {age} years old."
print(message)

 

出力:
Hello, Alice. You are 20 years old.

 

f文字列は、文字列の先頭にfを付けることで使えます。また、{}の中には任意のPython式を書くことができます。例えば、次のように書くと、計算結果が文字列に反映されます。

a = 10
b = 5
message = f"{a} + {b} = {a + b}"
print(message)

出力:
10 + 5 = 15

f文字列は、文字列のフォーマットや結合を簡単に行うことができる便利な機能です。詳しくは、Pythonの公式ドキュメントやオンラインマニュアルを参照してください。

今回は下記の記事を引用させていただきつつ学習を進めます。

gammasoft.jp

f文字列(f-string)はフォーマット済み文字列リテラル( formatted string literal )ともいうようです。

f文字列とは、クウォートで囲んだ文字列の前にfまたはFを付けたもので、その中に波かっこで囲まれた変数名や式があると実行時に置換してくれます。

f文字列の追加により、format()メソッドを使わないでも、文字列の中に書式を指定して数値などの値を埋め込めるようになりました。{0}や{1}のようにインデックス番号ではなく、変数名で直接指定できるので、直感的で可読性も良くなります。

前回のコードを元にformat()メソッドからf文字列への変換をしてみます。

print(f"光速は{c:12.8g} m/s, アボガドロ数は {na:12.8g} mol**(-1) です")
と{  }の中に表示したい引数とその表示形式を書き込むので直観的にわかりやすいというのは頷けます。

 

併せて読むと良さそうな記事も紹介しておきます。

qiita.com

こちらだと特定の文字のエスケープのさせ方についての例が豊富でした。

f-stringsの文字列中で、{}の括弧の記号をそのまま出力した場合にバックスラッシュでのエスケープは利きません。試してみるとエラーになります。」
「もし{}の括弧をエスケープしたい場合には{}の括弧を二重({{}}といったように)書くとエスケープすることができます。

なるほどと思って、上述のf文字列表記を一部{}でエスケープさせて

光速は{2.9979246e+08} m/s, アボガドロ数は 6.0221408e+23 mol**(-1) です
と出力させようと思ったのですが
以下の通り失敗しました。恥ずかしいけども正直に記録してみました。

 

print(f"光速は{{c:12.8g}} m/s, アボガドロ数は {na:12.8g} mol**(-1) です")

 

出力は

光速は{c:12.8g} m/s, アボガドロ数は 6.0221408e+23 mol**(-1) ですこの場合、{{ と }} を使用して、{ と } をエスケープしています。ただし、この方法では値が表示されず、書式指定子そのものが表示されます。

次の私の大間違いも記録します。

 

print(f"光速は{{}{c:12.8g}{}} m/s, アボガドロ数は {na:12.8g} mol**(-1) です")

 

文法エラー

SyntaxError: f-string: single '}' is not allowed

 

正直お作法が全くわかってませんでした。

そこでBingChatに相談したら

 

f-string の中で、} を表示するには、}} と書く必要があります。} は f-string の中で特別な意味を持つため、そのままでは表示することができません。代わりに、}} と書くことで、} をエスケープして表示することができます。

ただし、上記のコードでは、{{} のように {} の前に { があるため、エラーが発生しています。この場合、Python は {} をエスケープされた { と解釈し、その後の } が単独で存在すると判断してエラーを発生させます。

上記のコードを修正するには、次のように書くことができます。

 

print(f"光速は{{{c:12.8g}}} m/s, アボガドロ数は {na:12.8g} mol**(-1) です")

 

これで

光速は{2.9979246e+08} m/s, アボガドロ数は 6.0221408e+23 mol**(-1) です

と目的の表示にできました。
{{は{
}}は}
エスケープされるんですね。

十二分に寄り道していますがもう少し。

光速は”2.9979246e+08” m/s, アボガドロ数は 6.0221408e+23 mol**(-1) です
表示させたい場合は

print(f"光速は{"{c:12.8g}}" m/s, アボガドロ数は {na:12.8g} mol**(-1) です")

じゃないですよ。一般的なエスケープ文字「\」を使って

print(f"光速は\"{c:12.8g}\" m/s, アボガドロ数は {na:12.8g} mol**(-1) です")

 

では本題に戻るとしましょう。次は第5章の総括の力試しです。

knimest.hatenablog.com