フォーマット済み文字列リテラル： f文字列 (f"{ }") の書き方

# この記事を書くきっかけ
Pythonのプログラミングの問題で、たまに標準出力の問題が出題されます。「N 個の数値を M けたの文字埋めで出力せよ」というような、出力の方法に指定がある問題です。そのとき、f文字列を使うことを思い出します。

しかし、整数や実数の型指定のアルファベットが何か思い出せないし、そもそも書き方自体を忘れてしまっている。結局、それ以上手が動かず、調べなければ全く書けない、なんてことが何度かありました。

頻繁には使わないけど、いざ使うときは問題なく書けるようになっておきたいf文字列。今回は、そんなf文字列についてまとめてみました。f文字列にできることを列挙しました。



# フォーマット済み文字列リテラル（f文字列）とは
フォーマット済み文字列リテラル（f文字列（f-strings））は、Python 3.6以降で利用可能な文字列フォーマットの方法です。f文字列を使うと、簡潔で読みやすいコードで文字列に変数や式を埋め込むことができます。

## 基本的な使い方
f文字列を使うには、文字列の前に f または F を付けます。埋め込みたい変数や式は {}（波括弧）で囲みます。

```python
name = "Alice"
age = 30

# f文字列の使用例
message = f"Hello, {name}. You are {age} years old."
print(message)

# 出力: Hello, Alice. You are 30 years old.
```

# フォーマット済み文字列リテラル（f文字列）で、できること
## 式の埋め込み
f文字列内では、単なる変数だけでなく、任意のPython式を埋め込むことができます。

```python
x = 10
y = 5

result = f"{x} plus {y} is {x + y}."
print(result)
# 出力: 10 plus 5 is 15.
```

## 日付と時間のフォーマット
日付や時間をフォーマットする場合も、f文字列が便利です。

```python
from datetime import datetime

now = datetime.now()

# 日付と時間のフォーマット
formatted_date = f"{now:%Y-%m-%d %H:%M:%S}"
print(formatted_date)
# 出力: 2024-07-09 14:35:22 (例)
```

## 多行f文字列
f文字列は複数行に渡る文字列でも使用できます。

```python
name = "Bob"
age = 25

# 多行f文字列
message = f"""
Name: {name}
Age: {age}
"""
print(message)
# 出力:
# Name: Bob
# Age: 25
```
## カンマで桁区切り
Pythonのf文字列では、数値フォーマットのために特別に設けられたフォーマット指定子の一つに,（カンマ）があります。これを使うことで、数値を自動的に3桁ごとに区切って表示することができます。
```python
large_number = 1234567890
print(f"{large_number:,}")  # カンマで桁区切り
# 出力: 1,234,567,890
```


## 数値の表示形式を指定する
f文字列では、フォーマット指定子を使って数値の表示形式を指定することもできます。

| 型指定文字 | 型 |アルファベットの由来|
|:-:|:-|:-|
| d  | 整数  |「decimal（十進法）」の「d」|
| f  | 実数 |「floating-point number（浮動小数点数）」の「f」|
| e  | 実数（指数表記）  |「exponential notation（指数表記）」の「e」|
| s  | 文字列  |「string（文字列）」の「s」|
| b  | ２進数  |「binary（2進法）」の「b」|
| o  | ８進数  |「octal（8進法）」の「o」|
| x  | １６進数  |「hexadecimal（16進法）」の「h」|


### 整数(d)の場合
```python
x = 42

# 3桁の整数
print(f"{x:3d}")
# 出力: " 42" (右寄せ、空白埋め)

# 3桁の整数、左に0を埋める
print(f"{x:03d}")
# 出力: "042"
```
### 実数(f)の場合
```python
value = 123.456789
print(f"{value:.2f}")  # 小数点以下2桁まで表示します。
# 出力: 123.46

print(f"{value:010.2f}")  # 10桁の幅を持たせ、左に0を埋めます。
# 出力: 0000123.46
```

### 指数表記（e）
```python
value = 123.456789
print(f"{value:.2e}")  # 小数点以下2桁までの指数表記で表示します。
# 出力: 1.23e+02
```

### 文字列（s）
```python
text = "hello"
print(f"{text:10s}")  # 10桁の幅を持たせて表示します。
# 出力: 'hello     '
```
文字列（s）のデフォルトは、左寄せ、空白埋めです。
### ２進数（b）
```python
x = 42
print(f"{x:b}")  # ２進数で表示します。
# 出力: 101010

print(f"{x:08b}")  # 8桁の幅を持たせ、左に0を埋めます。
# 出力: 00101010
```

### ８進数（o）

```python
x = 42
print(f"{x:o}")  # ８進数で表示します。
# 出力: 52

print(f"{x:05o}")  # 5桁の幅を持たせ、左に0を埋めます。
# 出力: 00052
```
### １６進数（x）
```python
x = 42
print(f"{x:x}")  # １６進数で表示します。
# 出力: 2a

print(f"{x:04x}")  # 4桁の幅を持たせ、左に0を埋めます。
# 出力: 002a
```
## 文字埋めの法則
`f"{変数: [幅埋めしたい文字][寄せ][幅][.精度][型指定]}"`

```python
f"{value:.<10.2f}"
# 出力: 123.46....
```
「value」は、フォーマットする変数。
「.」は、幅を埋める文字。
「<」は、左寄せを意味します。
「10」は、全体の表示桁数を10桁に設定します。小数点も桁に含みます。
「.2」は、小数点以下2桁まで表示します。
「f」は、浮動小数点数を意味します。
***
**寄せの記号**
寄せの指定がない場合、デフォルトでは右寄せになります。
```
# ^：中央寄せ
# >：右寄せ
# <：左寄せ
```
**埋め文字**
埋め文字を指定する場合には、寄せの指定が必要です。
埋め文字を使わない場合は寄せの指定がなくても問題ありませんが、埋め文字を使う場合には必ず寄せの指定が必要です。

ただし、数値に対して0埋めを指定する場合、寄せの指定は不要です。
その理由は、Pythonのフォーマット仕様の設計にあります。数値フォーマットで0を埋め文字として指定する場合、暗黙的に右寄せが適用されるという特別なルールがあるので、0で埋めたいときには寄せの指定は必要ありません。

``` python
value = 123.456

print(f"{value:*^10.2f}")  # *で幅を埋め、中央寄せで表示します。
# 出力: **123.46**

print(f"{value:->10.2f}")  # -で幅を埋め、右寄せで表示します。
# 出力: ----123.46

print(f"{value:.<10.2f}")  # .で幅を埋め、左寄せで表示します。
# 出力: 123.46....
```
# まとめ
一度勉強しただけでは理解しきれないf文字列。今回記事にすることで、理解が深まりました。文字埋めや実数（f）の記法は少し複雑なので、頑張って覚えたいと思います。