> **GESP等级：二级 | 考级考点：GESP Python 二级**

# f-string 格式说明书

## GESP #27b #27c

---

## 📥 导入：太多小数位了！

```python
import turtle
t = turtle.Turtle()
t.forward(120)
print(t.xcor())   # 120.000000  ← 后面全是0！
```

### 用 `:.2f` 变整齐

```python
print(f"{t.xcor():.2f}")   # 120.00  ← 干净！
```

| 混乱版本 | 整齐版本 |
|:---------:|:---------:|
| `120.000000` | `120.00` |

---

## 📖 知识点①：f-string 基础

```python
name = "小明"
age = 10
print(f"我叫{name}，今年{age}岁")
# 我叫小明，今年10岁
```

**规则：** `f"..."` 中 `{变量}` 会被替换为变量的值

### 转义花括号

```python
value = 5
print(f"集合包含 {{ {value} }} 个元素")
# 集合包含 { 5 } 个元素
```

> 🌟 **记忆：** `{{` → `{`, `}}` → `}`

---

## 🔢 知识点②：`{value:.2f}` 控制小数位数

```python
score = 3.1415926535
print(f"{score:.2f}")     # 3.14   ← 保留2位
print(f"{score:.3f}")     # 3.142  ← 四舍五入！
print(f"{score:.1f}")     # 3.1
print(f"{score:.0f}")     # 3
```

| 格式 | 输入 3.14159 | 含义 |
|:----:|:-----------:|:----:|
| `:.1f` | `3.1` | 保留1位小数 |
| `:.2f` | `3.14` | 保留2位小数 |
| `:.3f` | `3.142` | 保留3位小数（四舍五入） |

> 🌟 **本质：** `.2` = 小数位数，`f` = float（浮点数）

---

## 🔢 知识点③：`{value:d}` 整数格式

```python
num = 42
print(f"{num:d}")          # 42
print(f"{num:,d}")         # 42  ← 大数才用,

big = 1000000
print(f"{big:,d}")         # 1,000,000  ← 容易读！
```

**⚠ 注意：`:d` 不能用于浮点数！**

```python
# print(f"{3.14:d}")  ❌ 报错！
```

| 格式 | 适用 | 示例 | 结果 |
|:----:|:----:|:----:|:----:|
| `:.2f` | 浮点数 | `{3.14:.2f}` | `3.14` |
| `:d` | 整数 | `{42:d}` | `42` |
| `:,d` | 大整数 | `{1000000:,d}` | `1,000,000` |

---

## 📐 知识点④：`{value:>10}` 右对齐

```python
name = "小明"
print(f"|{name:>10}|")
# |        小明|  ← 右边站，左边空
```

**格式拆解：**
- `>` = 右对齐（箭头向右 = 文字靠右）
- `10` = 总宽度 10 个字符
- 空白自动补齐

> 🌟 **生活类比：** 值日排座位，往右站，左边留空位

---

## 📐 知识点⑤：`{value:<10}` 和 `{value:^10}`

```python
name = "小明"
print(f"|{name:<10}|")   # |小明        |  ← 左对齐
print(f"|{name:^10}|")   # |    小明    |  ← 居中对齐
```

| 符号 | 含义 | 口诀 | 示例（宽度8） |
|:----:|:----:|:----:|:------------:|
| `<` | 左对齐 | 向左指 = 靠左 | `小明    ` |
| `>` | 右对齐 | 向右指 = 靠右 | `   小明` |
| `^` | 居中 | 尖尖在中间 | `  小明  ` |

### 组合使用

```python
print(f"| {name:^6} | {chinese:>5} | {math:>5.1f} |")
```

---

## 🎬 演示①：π 的格式化

```python
import math
print(f"π ≈ {math.pi}")          # 3.141592653589793
print(f"π ≈ {math.pi:.2f}")      # 3.14    ← 学生猜！
print(f"π ≈ {math.pi:.4f}")      # 3.1416  ← 四舍五入！
print(f"π ≈ {math.pi:.1f}")      # 3.1
print(f"π ≈ {math.pi:.0f}")      # 3
```

> 💡 **让学生逐行猜结果，感受四舍五入**

---

## 🎬 演示②：多列对齐表格

```python
print(f"{'姓名':>8} {'语文':>8} {'数学':>8} {'英语':>8}")
print(f"{'小明':>8} {95:>8} {88.5:>8.1f} {92:>8.1f}")
print(f"{'小红':>8} {92:>8} {96:>8} {89.5:>8.1f}")
print(f"{'小刚':>8} {80:>8} {76.5:>8.1f} {85:>8.1f}")
```

```
     姓名        语文        数学        英语
     小明         95       88.5       92.0
     小红         92         96       89.5
     小刚         80       76.5       85.0
```

---

## 🎬 演示③：千位分隔

```python
population = 1411750000
print(f"中国人口：{population}")         # 1411750000
print(f"中国人口：{population:,d}")      # 1,411,750,000
```

> 💡 **没有逗号 → 数零数半天；有逗号 → 一眼就看懂！**

---

## 🎯 实操①：格式配对填空

```python
score = 3.14159
```

| 格式 | 输出 | 配对 |
|:----:|:----:|:----:|
| A. `{score:.1f}` | ① 3.14 | → __ |
| B. `{score:.2f}` | ② 3.1 | → __ |
| C. `{score:.3f}` | ③ 3 | → __ |
| D. `{score:.0f}` | ④ 3.142 | → __ |

**答案：** A→②  B→①  C→④  D→③

---

## 🎯 实操②：补全 f-string

```python
# ① 输出 "价格：99.50元"
price = 99.5
print(f"价格：{______}元")   # price:.2f

# ② 左对齐宽度12
name = "小林"
print(f"|{______}|")       # name:<12

# ③ 右对齐宽度12
print(f"|{______}|")       # name:>12

# ④ 居中对齐宽度12
print(f"|{______}|")       # name:^12

# ⑤ 千位分隔
big = 1000000
print(f"{______}")          # big:,d
```

---

## 🎯 实操③：乌龟状态仪表盘

```python
import turtle
t = turtle.Turtle()
t.forward(120)
t.right(45)
t.forward(80)

print("=" * 35)
print(f"| {'乌龟状态仪表盘':^27} |")
print("=" * 35)
print(f"| {'x坐标':>8} | {t.xcor():>10.2f} |")
print(f"| {'y坐标':>8} | {t.ycor():>10.2f} |")
print(f"| {'朝向角度':>8} | {t.heading():>10.1f} |")
print("=" * 35)
```

```
===================================
|          乌龟状态仪表盘          |
===================================
|     x坐标 |      120.00 |
|     y坐标 |       80.00 |
|   朝向角度 |       45.0 |
===================================
```

---

## 📝 小测

```
1. print(f"{3.14159:.2f}") 输出什么？
   A. 3.14    B. 3.14159    C. 3.1    D. 3.141

2. print(f"|{'abc':>8}|") 输出什么？
   A. |abc     |    B. |     abc|    C. |  abc   |    D. |abc|

3. print(f"{123:d}") 输出什么？
   A. 123     B. 123.0    C. "123"    D. 报错

4. 哪个格式输出 "1,234,567"？
   A. {1234567:.2f}    B. {1234567:,d}
   C. {1234567:>10}    D. {1234567:d}

5. f-string 中输出 { 本身怎么写？
   A. \{    B. {    C. {{    D. \escape
```

---

## 📖 课堂总结

```
f-string 格式说明书
{变量:格式控制符}

:.2f  管小数   1位、2位、3位任你选
:d    管整数   加上逗号更好读
:>10  右对齐   向左看齐排排站
:<10  左对齐   向右看齐整整齐
:^10  居中对齐 两边对称真美观
```

### 🌟 记忆钩子

**"f-string冒号后控格式：:.2f管小数 :d管整数 :>10管对齐"**
