Nối chuỗi bằng toán tử cộng và định dạng chuỗi f-string trong Python

Python Tutorial | by Hoc Python

Kết hợp chuỗi (string concatenation)định dạng chuỗi (string formatting). Khi làm việc với văn bản, chúng ta hiếm khi chỉ cần in ra một chuỗi cố định. Thay vào đó, bạn sẽ thường xuyên cần ghép nhiều phần văn bản lại với nhau, hoặc chèn giá trị của các biến (như tên người dùng, số lượng sản phẩm, điểm số...) vào trong một thông điệp để tạo ra nội dung động và ý nghĩa.

Python cung cấp nhiều cách để thực hiện điều này, mỗi cách có những ưu và nhược điểm riêng. Trong bài viết này, chúng ta sẽ tập trung vào hai phương pháp phổ biến và hữu ích nhất: sử dụng toán tử cộng (+) để nối chuỗi một cách trực tiếp, và đặc biệt là kỹ thuật hiện đại, mạnh mẽ và được khuyến nghị sử dụng: f-strings.

Hãy cùng chi tiết cách hoạt động của từng phương pháp và hiểu rõ khi nào nên sử dụng chúng để làm cho code của bạn trở nên rõ ràng và hiệu quả hơn nhé!

Nối chuỗi bằng Toán tử Cộng (+) trong Python

Khái niệm: Dùng dấu cộng (+) để ghép hai hoặc nhiều chuỗi lại với nhau thành một chuỗi mới.

Toán tử cộng (+) không chỉ dùng để thực hiện phép cộng số học mà còn có thể được sử dụng để "cộng" các chuỗi lại với nhau. Khi áp dụng cho chuỗi, nó sẽ nối chuỗi này vào cuối chuỗi kia, tạo thành một chuỗi mới dài hơn.

Cách dùng: chuoi_1 + chuoi_2 + ...

Bạn chỉ cần đặt dấu + giữa các chuỗi mà bạn muốn nối. Bạn có thể nối hai, ba hoặc nhiều chuỗi liên tiếp trong cùng một biểu thức.

Ví dụ cơ bản:

loi_chao = "Xin chào"
ten = "Lan"
dau_cham_than = "!"

# Nối hai chuỗi
cau_don_gian = loi_chao + ten
print(f"'{loi_chao}' + '{ten}' = '{cau_don_gian}'") # Kết quả: 'Xin chào' + 'Lan' = 'Xin chàoLan'

# Nối nhiều chuỗi, thêm khoảng trắng và ký tự khác
thong_diep_hoan_chinh = loi_chao + " " + ten + dau_cham_than
print(f"'{loi_chao}' + ' ' + '{ten}' + '{dau_cham_than}' = '{thong_diep_hoan_chinh}'")
# Kết quả: 'Xin chào' + ' ' + 'Lan' + '!' = 'Xin chào Lan!'
  • Như bạn thấy, để có khoảng trắng giữa các từ, bạn phải tự thêm chuỗi khoảng trắng (" ") vào giữa chúng.

Lưu ý quan trọng:

Chỉ nối được chuỗi với chuỗi: Đây là quy tắc vàng khi sử dụng toán tử + để nối chuỗi. Python yêu cầu tất cả các toán hạng phải là kiểu chuỗi (str). Bạn không thể nối trực tiếp một chuỗi với một số nguyên (int), số thực (float), giá trị Boolean (bool), hoặc bất kỳ kiểu dữ liệu nào khác không phải chuỗi.

  • Ví dụ về lỗi TypeError:

tuoi = 25 # Đây là một số nguyên (int)
# print("Tuổi của tôi là: " + tuoi) # Dòng này sẽ gây lỗi!
# TypeError: can only concatenate str (not "int") to str

Lỗi này có nghĩa là bạn chỉ có thể nối chuỗi (str) với chuỗi khác (str).

Phải ép kiểu (cast) nếu có số/kiểu khác: Để khắc phục lỗi trên, bạn cần chuyển đổi (ép kiểu) các giá trị không phải chuỗi thành chuỗi trước khi nối chúng bằng toán tử +. Bạn sử dụng hàm str() để thực hiện việc này.

  • Ví dụ về cách sửa lỗi:

tuoi = 25 # Số nguyên
print("Tuổi của tôi là: " + str(tuoi) + " tuổi.")
# Kết quả: Tuổi của tôi là: 25 tuổi.

diem = 9.5 # Số thực
print("Điểm trung bình: " + str(diem))
# Kết quả: Điểm trung bình: 9.5

dang_hoc_python = True # Boolean
print("Trạng thái học Python: " + str(dang_hoc_python))
# Kết quả: Trạng thái học Python: True

Ưu điểm và nhược điểm:

Ưu điểm:

Đơn giản, dễ hiểu: Đối với các trường hợp nối chỉ hai hoặc ba chuỗi đơn giản, cú pháp của toán tử + rất trực quan.

Nhược điểm:

  • Dài dòng và khó đọc: Khi bạn cần nối nhiều chuỗi con hoặc chèn nhiều biến (đặc biệt là các biến không phải chuỗi), đoạn code sẽ trở nên dài dòng và khó đọc vì bạn phải liên tục thêm dấu + và gọi str().

# Ví dụ nhược điểm:
ten_san_pham = "Bánh mì"
gia_san_pham = 15000
so_luong_mua = 3

thong_bao_phuc_tap = "Bạn đã mua " + str(so_luong_mua) + " cái " + \
                     ten_san_pham + " với tổng giá " + \
                     str(gia_san_pham * so_luong_mua) + " VND."
print(thong_bao_phuc_tap)

Dễ gây lỗi TypeError: Rất dễ quên ép kiểu str() cho các biến số, dẫn đến lỗi runtime.

Mặc dù toán tử + là cách cơ bản để nối chuỗi, nhưng vì những nhược điểm trên, trong nhiều trường hợp, các phương pháp định dạng chuỗi hiện đại hơn (như f-strings mà chúng ta sẽ tìm hiểu tiếp theo) thường được ưu tiên sử dụng để code gọn gàng và ít lỗi hơn.

Định dạng chuỗi bằng f-strings trong Python

f-strings (Formatted String Literals) là một cách hiện đại và mạnh mẽ để nhúng giá trị của biểu thức Python (bao gồm biến) vào bên trong chuỗi.

Được giới thiệu từ Python 3.6, f-strings đã cách mạng hóa việc định dạng chuỗi. Thay vì phải "nối" từng mảnh như với toán tử +, f-strings cho phép bạn tạo ra một chuỗi mẫu và "điền" các giá trị vào đó một cách trực tiếp và tự nhiên. Hãy hình dung bạn có một mẫu thư và chỉ cần điền thông tin vào các ô trống đã được đánh dấu sẵn.

Để sử dụng f-strings, bạn thực hiện hai bước đơn giản:

Đặt chữ f (hoặc F) ngay trước dấu nháy mở đầu của chuỗi. Ví dụ: f"..." hoặc F'...'.

Đặt tên biến hoặc biểu thức Python mà bạn muốn chèn vào bên trong cặp dấu ngoặc nhọn {} trong chuỗi. Python sẽ tự động thay thế {} bằng giá trị tương ứng của biến hoặc kết quả của biểu thức đó.

Ví dụ cơ bản:

san_pham = "Áo phông"
gia = 150000
so_luong = 2

# Sử dụng f-string để tạo thông tin đơn hàng
thong_tin_don_hang = f"Bạn đã mua {so_luong} sản phẩm {san_pham} với tổng giá {gia * so_luong} VND."
print(thong_tin_don_hang)
# Kết quả: Bạn đã mua 2 sản phẩm Áo phông với tổng giá 300000 VND.

Trong ví dụ trên, {so_luong} được thay bằng giá trị của biến so_luong, {san_pham} bằng giá trị của san_pham, và {gia * so_luong} được thay bằng kết quả của phép nhân.

Ưu điểm vượt trội:

f-strings nhanh chóng trở thành phương pháp định dạng chuỗi được ưa chuộng nhất nhờ những ưu điểm nổi bật sau:

Rất dễ đọc: Cú pháp trực quan, cho phép bạn thấy ngay biến nào sẽ xuất hiện ở đâu trong chuỗi, giúp mã của bạn dễ hiểu hơn rất nhiều so với việc nối chuỗi bằng + hoặc các phương pháp định dạng cũ.

Tự động ép kiểu: f-strings tự động chuyển đổi các giá trị không phải chuỗi (như số nguyên, số thực, boolean, list, dictionary, v.v.) thành chuỗi. Điều này loại bỏ hoàn toàn nhu cầu phải gọi hàm str() tường minh, giúp code gọn gàng và ít lỗi TypeError hơn.

so_nguyen = 10
so_thuc = 3.14
co_hieu_luc = True
print(f"Số nguyên: {so_nguyen}, Số thực: {so_thuc}, Có hiệu lực: {co_hieu_luc}.")
# Kết quả: Số nguyên: 10, Số thực: 3.14, Có hiệu lực: True.

Hỗ trợ biểu thức: Bạn có thể đặt thẳng các phép tính, lời gọi hàm, hoặc bất kỳ biểu thức Python hợp lệ nào vào bên trong {}. Kết quả của biểu thức đó sẽ được tính toán và chèn vào chuỗi.

chieu_rong = 5
chieu_dai = 8
print(f"Diện tích hình chữ nhật là: {chieu_rong * chieu_dai} mét vuông.")
# Kết quả: Diện tích hình chữ nhật là: 40 mét vuông.

# Gọi hàm trong f-string
ten_hoc_sinh = "nguyen van a"
print(f"Tên viết hoa đầu chữ: {ten_hoc_sinh.title()}") # .title() viết hoa chữ cái đầu mỗi từ
# Kết quả: Tên viết hoa đầu chữ: Nguyen Van A

Hiệu suất tốt: f-strings thường nhanh hơn các phương pháp định dạng chuỗi cũ hơn (như toán tử % hoặc phương thức .format()) vì chúng được xử lý hiệu quả hơn ở cấp độ máy ảo Python.

Ứng dụng thực tế:

f-strings là công cụ đa năng, được sử dụng rộng rãi trong nhiều tình huống:

Tạo các thông báo động cho người dùng: Từ lời chào cá nhân hóa đến các thông báo trạng thái phức tạp.

username = "admin_user"
so_luong_tin_nhan_moi = 7
print(f"Chào mừng, {username}! Bạn có {so_luong_tin_nhan_moi} tin nhắn mới.")

In thông tin debug (gỡ lỗi): Khi cần kiểm tra giá trị của biến tại một điểm cụ thể trong chương trình.\

x = 10
y = 20
print(f"DEBUG: Giá trị của x là {x}, y là 2025, tổng là {x + y}.")

Xây dựng chuỗi truy vấn cơ sở dữ liệu (cần cẩn thận với SQL Injection): Mặc dù tiện lợi, nhưng khi dùng f-strings để tạo các câu lệnh SQL, bạn cần đặc biệt lưu ý về vấn đề bảo mật SQL Injection. Đối với truy vấn cơ sở dữ liệu, hãy ưu tiên sử dụng các thư viện với parameterized queries.

# VÍ DỤ MINH HỌA (CẦN THẬN TRỌNG TRONG THỰC TẾ VÌ VẤN ĐỀ BẢO MẬT)
user_id = 123
query = f"SELECT * FROM users WHERE id = {user_id};"
print(query)
# Kết quả: SELECT * FROM users WHERE id = 123;

Tạo các đường dẫn file, URL động:

ten_file = "report"
thang = "10"
nam = "2023"
duong_dan = f"/data/reports/{nam}/{thang}/{ten_file}.xlsx"
print(f"Đường dẫn file: {duong_dan}")
# Kết quả: Đường dẫn file: /data/reports/2023/10/report.xlsx

Nên dùng cách nào để nối và định dạng chuỗi?

Sau khi đã tìm hiểu cả toán tử cộng (+) và f-strings, câu hỏi đặt ra là: khi nào thì nên sử dụng phương pháp nào?

Trong Python hiện đại, câu trả lời khá rõ ràng:

Ưu tiên sử dụng f-strings trong hầu hết các trường hợp

Lý do:

Dễ đọc và rõ ràng: f-strings cho phép bạn nhúng biến và biểu thức trực tiếp vào chuỗi, tạo ra một cú pháp rất trực quan. Bạn có thể dễ dàng nhìn thấy thông tin nào đang được chèn vào đâu.

# Rất dễ đọc với f-string
ten = "An"
tuoi = 30
print(f"Xin chào, tôi là {ten} và tôi {tuoi} tuổi.")

Linh hoạt và mạnh mẽ: Bạn có thể đặt bất kỳ biểu thức Python hợp lệ nào (biến, phép toán, lời gọi hàm, v.v.) vào bên trong cặp {}.

gia_tri_goc = 12.3456
# Định dạng số thập phân, làm tròn trong f-string
print(f"Giá trị đã làm tròn: {gia_tri_goc:.2f}") # Kết quả: Giá trị đã làm tròn: 12.35

Tự động ép kiểu: f-strings tự động xử lý việc chuyển đổi các kiểu dữ liệu khác (như số, boolean) thành chuỗi, loại bỏ nhu cầu phải gọi str() thủ công, giúp tránh lỗi TypeError phổ biến.

so_san_pham = 5
gia_moi_sp = 10.5
# Không cần str() cho số
print(f"Tổng cộng: {so_san_pham * gia_moi_sp} USD.") # Kết quả: Tổng cộng: 52.5 USD.

Hiệu suất tốt: f-strings thường có hiệu suất tốt hơn so với việc nối chuỗi bằng + khi bạn xử lý nhiều phần chuỗi hoặc các chuỗi lớn, vì chúng được tối ưu hóa ở cấp độ thấp hơn.

Khi nào có thể dùng toán tử cộng (+)?

Mặc dù f-strings được khuyến nghị, toán tử + vẫn có chỗ đứng trong một số trường hợp rất đơn giản:

Nối hai hoặc ba chuỗi cố định: Nếu bạn chỉ cần ghép một vài chuỗi văn bản đã biết trước mà không có bất kỳ biến số hay biểu thức nào, + có thể vẫn là lựa chọn đơn giản và dễ hiểu.

# Trường hợp đơn giản, chấp nhận được
loi_chao_co_dinh = "Chào buổi sáng" + "!"
print(loi_chao_co_dinh) # Kết quả: Chào buổi sáng!

Không có biến số hoặc kiểu dữ liệu khác chuỗi: Khi bạn chắc chắn rằng tất cả các phần bạn nối đều là chuỗi, + sẽ hoạt động mà không gây lỗi TypeError.

Ví dụ không nên dùng +:

# Code trở nên dài dòng và khó đọc khi dùng + với nhiều biến và ép kiểu
ten_khach = "Minh"
san_pham_mua = "Máy tính"
gia_tien = 12000000
thong_bao_dai = "Khách hàng " + ten_khach + " đã mua sản phẩm " + san_pham_mua + \
                " với giá " + str(gia_tien) + " VND."
print(thong_bao_dai)

Thay vào đó, với f-string:

# Gọn gàng và dễ đọc hơn nhiều với f-string
ten_khach = "Minh"
san_pham_mua = "Máy tính"
gia_tien = 12000000
thong_bao_dai_fstring = f"Khách hàng {ten_khach} đã mua sản phẩm {san_pham_mua} với giá {gia_tien} VND."
print(thong_bao_dai_fstring)

Kết bài

Bạn đã cùng tôi tìm hiểu hai cách phổ biến để làm việc với chuỗi trong Python: nối chuỗi bằng toán tử cộng (+)định dạng chuỗi bằng f-strings. Mỗi phương pháp đều có ưu và nhược điểm riêng, nhưng việc hiểu rõ chúng sẽ giúp bạn viết code linh hoạt và hiệu quả hơn.

Hãy luôn ghi nhớ những điểm chính sau:

  • Toán tử cộng (+) đơn giản và trực quan cho việc ghép các chuỗi cố định. Tuy nhiên, nó trở nên cồng kềnh, dễ gây lỗi TypeError và khó đọc khi bạn cần chèn nhiều biến (đặc biệt là các biến không phải chuỗi), đòi hỏi phải dùng str() liên tục.

  • f-strings là phương pháp được khuyên dùng nhất trong Python hiện đại. Chúng cực kỳ dễ đọc, tự động ép kiểu dữ liệu, cho phép nhúng các biểu thức phức tạp trực tiếp vào chuỗi, và thường có hiệu suất tốt hơn.

Trong hầu hết các tình huống thực tế, đặc biệt khi bạn cần chèn giá trị của biến hoặc thực hiện các phép tính ngay trong chuỗi, hãy ưu tiên sử dụng f-strings. Chúng sẽ giúp code của bạn gọn gàng hơn, dễ bảo trì hơn và ít gặp lỗi hơn.

Bài viết liên quan