Skip to content

🧵 3.3 F-string, format chuỗi

📖 Giới thiệu

F-string (formatted string literals) là cách hiện đại và mạnh mẽ nhất để định dạng chuỗi trong Python. Với f-string, bạn có thể dễ dàng chèn biến và biểu thức vào trong chuỗi một cách trực quan và hiệu quả.

Mục tiêu bài học:

  • Thành thạo cú pháp f-string
  • Biết các cách định dạng số, ngày tháng
  • So sánh f-string với các phương pháp khác

🔧 Cú pháp

Cú pháp f-string cơ bản:

python
# Template cơ bản
f"Văn bản {bien} văn bản"
f"Tính toán: {bieu_thuc}"
f"Định dạng: {gia_tri:format_spec}"

Các cách định dạng phổ biến:

python
# Số nguyên
f"{so:d}"           # Số nguyên
f"{so:04d}"         # Số nguyên với padding 0

# Số thực
f"{so:.2f}"         # 2 chữ số thập phân
f"{so:,.0f}"        # Phân cách hàng nghìn

# Chuỗi
f"{chuoi:>10}"      # Căn phải, độ rộng 10
f"{chuoi:<10}"      # Căn trái, độ rộng 10
f"{chuoi:^10}"      # Căn giữa, độ rộng 10

🔬 Phân tích & Giải thích chi tiết

1. 🚀 F-string là gì?

F-string (Formatted String Literals) được giới thiệu từ Python 3.6, là cách nhanh nhất và dễ đọc nhất để định dạng chuỗi.

Đặc điểm:

  • Bắt đầu với f hoặc F
  • Sử dụng {} để chèn biến/biểu thức
  • Được đánh giá tại runtime
  • Hiệu suất cao nhất

2. 📊 So sánh các phương pháp định dạng

python
ten = "Python"
tuoi = 30

# 1. Cách cũ: % formatting (không khuyến khích)
print("Tôi học %s%d tuổi" % (ten, tuoi))

# 2. Cách trung gian: .format()
print("Tôi học {}{} tuổi".format(ten, tuoi))
print("Tôi học {ten}{tuoi} tuổi".format(ten=ten, tuoi=tuoi))

# 3. Cách hiện đại: f-string (khuyến khích)
print(f"Tôi học {ten}{tuoi} tuổi")

3. 💡 Ưu điểm của f-string

Tốc độ:

python
import timeit

# F-string nhanh nhất
timeit.timeit(lambda: f"Hello {name}", number=1000000)

# .format() chậm hơn
timeit.timeit(lambda: "Hello {}".format(name), number=1000000)

# % formatting chậm nhất
timeit.timeit(lambda: "Hello %s" % name, number=1000000)

Dễ đọc:

python
# ✅ F-string - dễ đọc
print(f"Học sinh {ten} lớp {lop} điểm {diem}")

# ❌ .format() - khó đọc hơn
print("Học sinh {} lớp {} điểm {}".format(ten, lop, diem))

4. 🎨 Định dạng số với f-string

python
# Định dạng số nguyên
so = 1234
print(f"{so:d}")        # 1234
print(f"{so:05d}")      # 01234 (padding 0, độ rộng 5)
print(f"{so:,}")        # 1,234 (phân cách hàng nghìn)

# Định dạng số thực
pi = 3.14159
print(f"{pi:.2f}")      # 3.14 (2 chữ số thập phân)
print(f"{pi:.0f}")      # 3 (làm tròn, không thập phân)
print(f"{pi:8.2f}")     # "    3.14" (độ rộng 8)

# Định dạng phần trăm
ty_le = 0.85
print(f"{ty_le:.1%}")   # 85.0%

5. 📅 Định dạng ngày giờ

python
from datetime import datetime

ngay_gio = datetime.now()

# Các cách định dạng ngày
print(f"{ngay_gio:%Y-%m-%d}")           # 2024-01-15
print(f"{ngay_gio:%d/%m/%Y}")           # 15/01/2024
print(f"{ngay_gio:%A, %B %d, %Y}")      # Monday, January 15, 2024

# Định dạng giờ
print(f"{ngay_gio:%H:%M:%S}")           # 14:30:45
print(f"{ngay_gio:%I:%M %p}")           # 02:30 PM

💻 Ví dụ minh họa

Ví dụ 1: Giới thiệu bản thân

python
# gioi_thieu.py
ten = "Minh"
tuoi = 16
lop = "10A"

print(f"Xin chào, tôi là {ten}")
print(f"Tôi {tuoi} tuổi")
print(f"Tôi học lớp {lop}")

Kết quả:

Xin chào, tôi là Minh
Tôi 16 tuổi
Tôi học lớp 10A

Ví dụ 2: Tính tiền mua kẹo đơn giản

python
# mua_keo.py
ten_keo = "kẹo dừa"
so_luong = 5
gia = 2000

tong_tien = so_luong * gia

print(f"Mua {so_luong} viên {ten_keo}")
print(f"Giá mỗi viên: {gia} đồng")
print(f"Tổng tiền: {tong_tien} đồng")

Ví dụ 3: Bảng cửu chương

python
# cuu_chuong.py
so = 7
print(f"Bảng cửu chương {so}:")
print(f"{so} x 1 = {so * 1}")
print(f"{so} x 2 = {so * 2}")
print(f"{so} x 3 = {so * 3}")

print(f"Đã đạt: {doanh_thu:,.0f} VNĐ")

Progress bar

bar_length = 20 filled_length = int(bar_length * ty_le_hoan_thanh / 100) bar = "█" * filled_length + "░" * (bar_length - filled_length) print(f"[{bar}] {ty_le_hoan_thanh:.1f}%")

Phân tích

if ty_le_hoan_thanh >= 100: trang_thai = "🎉 Đã hoàn thành mục tiêu!" elif ty_le_hoan_thanh >= 80: trang_thai = "⭐ Sắp đạt mục tiêu!" elif ty_le_hoan_thanh >= 50: trang_thai = "💪 Đang tiến bộ tốt!" else: trang_thai = "🔥 Cần nỗ lực hơn!"

print(f"\n{trang_thai}")


## 🏋️ Thực hành

### Bài tập 1: Thông tin cá nhân

**Nhiệm vụ:** Nhập và hiển thị thông tin
```python
ten = input("Tên: ")
tuoi = input("Tuổi: ")
print(f"Xin chào {ten}, bạn {tuoi} tuổi")

Bài tập 2: Tính tổng hai số

Nhiệm vụ: Tính và hiển thị tổng

python
a = int(input("Số thứ nhất: "))
b = int(input("Số thứ hai: "))
tong = a + b
print(f"{a} + {b} = {tong}")

Bài tập 3: Bảng nhân đơn giản

Nhiệm vụ: Hiển thị phép nhân

python
so = 5
print(f"{so} x 1 = {so * 1}")
print(f"{so} x 2 = {so * 2}")
print(f"{so} x 3 = {so * 3}")
print("1. 🔢 Format số")
print("2. 💰 Format tiền")
print("3. 📊 Format phần trăm")
print("4. 📅 Format ngày")
print("0. ❌ Thoát")

lua_chon = input("Chọn: ")

if lua_chon == "1":
    format_so()
elif lua_chon == "2":
    format_tien()
elif lua_chon == "3":
    format_phan_tram()
elif lua_chon == "4":
    format_ngay()
elif lua_chon == "0":
    print("👋 Tạm biệt!")
    break
else:
    print("❌ Lựa chọn không hợp lệ!")

## 📋 Tóm tắt

### F-string vs các phương pháp khác:

| Phương pháp | Cú pháp | Tốc độ | Dễ đọc | Khuyến nghị |
|-------------|---------|--------|--------|-------------|
| **f-string** | `f"Hi {name}"` | ⭐⭐⭐ | ⭐⭐⭐ | ✅ Dùng |
| **.format()** | `"Hi {}".format(name)` | ⭐⭐ | ⭐⭐ | 🆗 OK |
| **% formatting** | `"Hi %s" % name` | ⭐ | ⭐ | ❌ Tránh |

### Cú pháp định dạng quan trọng:

```python
# Số
f"{so:d}"           # Số nguyên
f"{so:.2f}"         # 2 chữ số thập phân
f"{so:,}"           # Phân cách hàng nghìn
f"{so:.1%}"         # Phần trăm

# Chuỗi  
f"{text:>10}"       # Căn phải, rộng 10
f"{text:<10}"       # Căn trái, rộng 10
f"{text:^10}"       # Căn giữa, rộng 10

# Ngày giờ
f"{ngay:%d/%m/%Y}"  # 01/01/2024
f"{ngay:%H:%M}"     # 14:30

Best practices:

  1. 🚀 Luôn dùng f-string khi có thể
  2. 🎨 Định dạng số tiền với dấu phân cách
  3. 📊 Căn chỉnh column trong bảng
  4. 📅 Định dạng ngày theo địa phương
  5. 🔍 Debug bằng f-string thay vì print nhiều lần

Chuẩn bị cho bài tiếp theo:

Bài tiếp theo sẽ học về 🏷️ Khai báo biến - cách lưu trữ và quản lý dữ liệu trong Python!


💡 Mẹo: F-string không chỉ nhanh mà còn giúp code dễ đọc. Hãy sử dụng nó trong mọi dự án!

🎨 Thực hành: Thử format một bảng dữ liệu với alignment để thấy sức mạnh của f-string!

🐍 Khóa học Python căn bản bằng tiếng Việt