Kiểu định dạng bạn sẽ dùng nhiều nhất
f-string là cách mặc định để code Python hiện đại chèn giá trị vào văn bản. Đặt chữ f trước dấu nháy mở, và mọi thứ trong {...} sẽ trở thành một biểu thức được tính trực tiếp:
Có ba điều cần để ý. Tiền tố f biến cả chuỗi thành một khuôn mẫu (template). Cặp ngoặc nhọn là những chỗ được thay giá trị. Và biểu thức bên trong ngoặc nhọn được tính tại thời điểm print chạy, không phải lúc bạn viết chuỗi.
Bạn sẽ viết f-string thường xuyên hơn hẳn mọi kiểu định dạng khác. Nó ngắn hơn "Hello, " + name + ".", rõ ràng hơn "Hello, %s." % name và linh hoạt hơn .format().
Bất cứ thứ gì tính được đều đặt vào được
Ngoặc nhọn không chỉ dành cho tên biến. Biểu thức Python nào cũng dùng được:
Gọi phương thức, truy cập chỉ số, phép tính, biểu thức điều kiện: đều ổn cả. Quy tắc duy nhất: giữ phần nằm giữa ngoặc nhọn thật ngắn. Nếu bạn đang viết một phép tính dài ba dòng trong một chỗ giữ chỗ, hãy tính trước vào một biến có tên rồi đặt tên đó vào.
Định dạng số
Dấu hai chấm sau biểu thức mở ra một format spec, một ngôn ngữ nhỏ để điều khiển cách giá trị được hiển thị:
Tóm tắt nhanh ý nghĩa của từng phần:
.2f: số thực, hai chữ số sau dấu thập phân. Làm tròn khi hiển thị.,: dấu phẩy làm dấu phân cách hàng nghìn. Dùng được cho int và float..1%: nhân với 100 và thêm%. Rất hợp cho tỷ lệ và tỷ suất..2e: ký hiệu khoa học với hai chữ số thập phân.
Bạn có thể kết hợp chúng. f"{total:,.2f}" cho ra "1,234.57".
Phần đệm, độ rộng và căn lề
Để căn thẳng các cột trong đầu ra:
<10 nghĩa là "căn trái, đệm cho đủ ít nhất 10 ký tự." >5 nghĩa là "căn phải, đệm cho đủ 5." Bạn cũng có thể dùng ^ để căn giữa.
Muốn đệm bằng ký tự khác dấu cách, hãy đặt ký tự đệm trước ký hiệu căn lề:
Định dạng ngày tháng
Cú pháp {value:spec} cũng dùng được cho các đối tượng datetime:
Phần spec sau dấu hai chấm là một chuỗi định dạng strftime. Mọi mã % mà strftime hỗ trợ đều dùng được ở đây; chúng ta sẽ tìm hiểu chi tiết ở trang về datetime.
Mẹo = để gỡ lỗi
Một trong những tính năng nhỏ mà hữu ích nhất: đặt = sau biểu thức, Python sẽ in ra cả mã nguồn của biểu thức lẫn giá trị của nó:
Bạn nhận được count=7, price=19.99, count * price=139.93. Chỉ ba ký tự mà làm được việc của cả một câu print("count =", count). Đáng nhớ cho lần tới khi bạn gỡ lỗi và muốn in nhanh vài giá trị.
Thoát ký tự ngoặc nhọn
Nếu cần một dấu { hoặc } thật trong đầu ra, hãy viết gấp đôi:
Ngoặc nhọn đơn mở một biểu thức; {{ và }} đại diện cho { và } trong đầu ra.
f-string nhiều dòng
f-string kết hợp tốt với dấu ba nháy, rất tiện khi bạn dựng nhanh những khuôn mẫu nhỏ ngay trong code:
Bạn cũng có thể tách một f-string dài thành nhiều chuỗi đặt liền nhau, Python sẽ tự động nối chúng lại:
Khi các kiểu cũ vẫn xuất hiện
Bạn sẽ bắt gặp hai kiểu định dạng cũ hơn trong code có sẵn:
Cả ba cho ra cùng một kết quả. f-string thắng về độ dễ đọc trong chín trên mười trường hợp. Dùng .format() khi bạn cần tạo một khuôn mẫu một lần rồi áp dụng nhiều lần; chỉ dùng % khi bạn bảo trì code cũ vốn đã dùng nó.
Những chỗ không nên dùng
Có hai tình huống cần đến công cụ khác.
Tạo câu truy vấn SQL. Đừng bao giờ chèn dữ liệu người dùng nhập vào chuỗi SQL bằng f-string. Hãy dùng truy vấn có tham số (parameterized query) của thư viện cơ sở dữ liệu. Dùng f-string ở đây chính là cách lỗi SQL injection xảy ra.
Tạo văn bản giao diện cần dịch. Nếu ứng dụng hỗ trợ nhiều ngôn ngữ, bạn cần một khuôn mẫu mà các công cụ dịch bên ngoài có thể nhận diện, thường là _(...) của gettext hoặc một hàm hỗ trợ riêng của framework. f-string gắn cấu trúc câu vào mã nguồn, khiến việc dịch khó hơn nhiều.
Với mọi việc khác, như ghi log, in ra console, tạo URL, dựng chuỗi cấu hình, định dạng số để hiển thị, f-string là lựa chọn đúng.
Tiếp theo: số và boolean
f-string được dùng rất nhiều để định dạng số, nên bạn nên hiểu sâu hơn một chút về các kiểu số. Đó là bài tiếp theo.
Câu hỏi thường gặp
f-string trong Python là gì?
f-string là một chuỗi ký tự có tiền tố f, trong đó mọi thứ nằm trong {...} được thay bằng giá trị của biểu thức khi chương trình chạy. f"Hello, {name}" chèn giá trị hiện tại của name vào chuỗi.
f-string có trong Python từ phiên bản nào?
Từ Python 3.6. Mọi phiên bản Python hiện đại đều hỗ trợ, nên bạn có thể dùng f-string ở bất cứ đâu khi viết code Python 3 ngày nay. Các kiểu định dạng cũ hơn (% và .format()) vẫn dùng được nhưng trong đa số trường hợp khó đọc hơn.
Làm sao để định dạng số với 2 chữ số thập phân trong Python?
Dùng một format spec sau dấu hai chấm bên trong ngoặc nhọn: f"{price:.2f}". .2f nghĩa là 'số thực với hai chữ số sau dấu thập phân.' Chỉ giá trị hiển thị được làm tròn; con số gốc không thay đổi.
Có thể đặt bất kỳ biểu thức nào vào f-string không?
Có: phép tính, gọi phương thức, gọi hàm, biểu thức điều kiện. f"{name.upper()}" và f"{price * 1.2:.2f}" đều chạy được. Hãy giữ biểu thức ngắn gọn; nếu code trong ngoặc nhọn bắt đầu rối, hãy tính trước vào một biến.