DHDataHọc
TheoryLesson 7/304 min read+10 XP

Định dạng chuỗi với f-string

Bạn sẽ học được

  • Cú pháp f-string và vì sao nó thay thế % và .format().
  • Định dạng số: chữ số thập phân, phân cách hàng nghìn, phần trăm.
  • Căn lề, độ rộng, đệm ký tự.
  • Dùng biểu thức và gọi hàm bên trong dấu ngoặc.
  • Mẹo debug f"{bien=}" và các lỗi thường gặp.

Khái niệm cốt lõi

f-string (formatted string literal) ra mắt từ Python 3.6, đánh dấu bằng chữ f trước dấu nháy. Bên trong chuỗi, mọi thứ trong { } được đánh giá như biểu thức Python rồi chèn vào:

code
name = "An"
age = 28
print(f"Chào {name}, bạn {age} tuổi")
code
Chào An, bạn 28 tuổi

So với hai cách cũ:

code
print("Chào " + name + ", bạn " + str(age) + " tuổi")   # nối chuỗi
print("Chào {}, bạn {} tuổi".format(name, age))          # format

f-string ngắn hơn, không cần str(), và đọc gần với câu tiếng Việt. Đây là cách chuẩn trong mã hiện đại; hai cách kia chỉ còn trong code cũ.

Định dạng số

Sau biểu thức có thể thêm : và format spec:

code
x = 3.14159
print(f"Pi ≈ {x:.2f}")
print(f"{1234567:,}")
print(f"{0.1234:.1%}")
code
Pi ≈ 3.14
1,234,567
12.3%
SpecÝ nghĩaKết quả
.2f2 chữ số thập phân3.14
,Phân cách hàng nghìn1,234,567
.1%Nhân 100, 1 chữ số thập phân, thêm %12.3%
05dSố nguyên, độ rộng 5, đệm 000042
eKý hiệu khoa học1.234000e+06
+dLuôn hiện dấu+42

Với tiền Việt Nam, dấu phân cách mặc định là dấu phẩy theo chuẩn Anh–Mỹ. Muốn định dạng kiểu Việt (1.234.567), dùng thư viện locale hoặc tự thay dấu — f-string một mình không đổi được ký tự phân cách.

Căn lề và độ rộng

code
name = "An"
print(f"[{name:>6}]")
print(f"[{name:<6}]")
print(f"[{name:^6}]")
code
[    An]
[An    ]
[  An  ]

> phải, < trái, ^ giữa. Số sau dấu hai chấm là tổng độ rộng. Có thể đệm bằng ký tự khác:

code
print(f"[{name:*^8}]")
code
[***An***]

Căn lề hữu ích khi in bảng trong terminal. Với bảng phức tạp hơn, dùng tabulate hoặc pandas thay vì tự canh.

Biểu thức trong dấu ngoặc

Bên trong { } là biểu thức đầy đủ, không chỉ tên biến:

code
price = 890000
quantity = 3
print(f"Tổng: {price * quantity:,} đồng")
print(f"Làm tròn: {round(price / 3, -3):,.0f}")
print(f"Viết hoa: {'data' * 2}")
code
Tổng: 2,670,000 đồng
Làm tròn: 297,000
Viết hoa: datadata

Có thể gọi hàm, dùng toán tử ba ngôi, truy cập dict — miễn biểu thức không chứa dấu hai chấm gây nhầm với format spec (khi đó bọc ngoặc đơn):

code
user = {"name": "An", "age": 28}
print(f"{user['name']} — {user['age']}")

user['name'] dùng nháy đơn bên trong nháy kép của f-string. Từ Python 3.12, có thể dùng cùng loại nháy và dấu gạch chéo ngược trong biểu thức; với 3.10–3.11 phải né bằng cách đổi loại nháy.

Mẹo debug

Python 3.8+ cho phép = ngay sau biểu thức để in cả tên và giá trị:

code
name = "An"
age = 28
print(f"{name=}, {age=}")
code
name='An', age=28

Đây là cách nhanh nhất để kiểm tra biến khi debug, thay cho print("name:", name). Có thể kết hợp format spec: f"{age=:03d}" in age=028.

Chuỗi nhiều dòng

code
name = "An"
city = "Hà Nội"
text = f"""
Tên: {name}
Thành phố: {city}
"""
print(text)

Ba dấu nháy giữ nguyên xuống dòng và thụt lề. Cẩn thận: thụt lề trong mã nguồn cũng vào chuỗi, nên đặt nội dung sát lề trái hoặc dùng textwrap.dedent.

Thực hành

  1. In Pi ≈ 3.14 từ 3.14159 bằng spec .2f.
  2. Định dạng 1234567 có dấu phẩy và 0.1234 thành 12.3%.
  3. In tên "An" căn phải, trái, giữa trong độ rộng 6.
  4. Tính price * quantity trực tiếp trong f-string với dấu phân cách.
  5. Dùng f"{bien=}" để in ba biến bất kỳ.
  6. In một bảng ba dòng, ba cột căn trái, dùng f-string.

Lỗi thường gặp

Triệu chứngNguyên nhânCách sửa
In ra {name} nguyên vănThiếu chữ f trước chuỗiThêm f"..."
ValueError: Invalid format specifierSpec sai cú phápKiểm tra phần sau :
SyntaxError với nháy bên trongTrùng loại nháy (Python < 3.12)Đổi nháy ngoài hoặc trong
KeyError trong f-stringDict thiếu khóaDùng .get() có mặc định
Số thực hiện 0.30000000000000004Sai số nhị phânĐịnh dạng .2f khi in
Dấu phân cách là , không phải .Chuẩn mặc định Anh–MỹDùng locale nếu cần kiểu Việt
Chuỗi nhiều dòng bị thụt lềThụt lề trong mã vào chuỗitextwrap.dedent

Tóm tắt

  • f-string đánh giá biểu thức trong { }, thay thế nối chuỗi và .format().
  • Format spec sau : điều khiển số, phần trăm, căn lề, độ rộng.
  • Biểu thức trong ngoặc có thể gọi hàm và truy cập dict.
  • f"{bien=}" là mẹo debug nhanh.
  • Chú ý loại nháy khi biểu thức chứa chuỗi (Python < 3.12).

Use ← → to move between lessons