🧵 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:
# 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:
# 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
fhoặcF - 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
ten = "Python"
tuoi = 30
# 1. Cách cũ: % formatting (không khuyến khích)
print("Tôi học %s và %d tuổi" % (ten, tuoi))
# 2. Cách trung gian: .format()
print("Tôi học {} và {} tuổi".format(ten, tuoi))
print("Tôi học {ten} và {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} và {tuoi} tuổi")3. 💡 Ưu điểm của f-string
Tốc độ:
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:
# ✅ 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
# Đị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ờ
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
# 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 10AVí dụ 2: Tính tiền mua kẹo đơn giản
# 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
# 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
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
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:30Best practices:
- 🚀 Luôn dùng f-string khi có thể
- 🎨 Định dạng số tiền với dấu phân cách
- 📊 Căn chỉnh column trong bảng
- 📅 Định dạng ngày theo địa phương
- 🔍 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!