Làm việc với chuỗi (Strings) trong Python

Python Tutorial | by Hoc Python

Trong lập trình, chuỗi là kiểu dữ liệu cơ bản và phổ biến nhất để làm việc với văn bản. Từ tên người, địa chỉ email, tin nhắn chào mừng, cho đến nội dung bài viết hay cả những đoạn code bạn đang đọc – tất cả đều là chuỗi.Việc thành thạo cách tạo, thao tác và quản lý chuỗi là một kỹ năng không thể thiếu đối với bất kỳ lập trình viên Python nào. Chuỗi không chỉ giúp chúng ta hiển thị thông tin một cách có ý nghĩa mà còn cho phép chúng ta xử lý và trích xuất dữ liệu từ văn bản một cách hiệu quả.

Trong bài viết này,mình sẽ cùng nhau tìm hiểu mọi thứ về chuỗi trong Python, từ những khái niệm cơ bản nhất như cách tạo chuỗi, các phép toán đơn giản, cho đến các kỹ thuật truy cập ký tự, cắt chuỗi và sử dụng các phương thức mạnh mẽ để biến hóa văn bản theo ý muốn. Hãy cùng bắt đầu hành trình tìm hiểu và làm chủ chuỗi trong Python nhé!

Chuỗi là gì?

Khái niệm: Chuỗi là một dãy các ký tự (chữ, số, ký hiệu) được đặt trong dấu nháy đơn (' ') hoặc nháy kép (" ").

Trong lập trình, chuỗi (trong tiếng Anh là String, thường được viết tắt là str) là kiểu dữ liệu dùng để biểu diễn văn bản. Bất kỳ thứ gì bạn muốn máy tính coi là chữ, số, hoặc ký hiệu được sắp xếp theo một thứ tự nhất định, đều được thể hiện dưới dạng chuỗi.

Điều quan trọng nhất để định nghĩa một chuỗi trong Python là bạn phải đặt nó bên trong dấu nháy đơn (') hoặc dấu nháy kép (").

Ví dụ:

  • "Hello World" (một chuỗi văn bản thông thường)

  • 'Python là ngôn ngữ tuyệt vời' (chuỗi được đặt trong nháy đơn)

  • "12345" (một chuỗi chứa các chữ số, nhưng vẫn là văn bản, không phải số để tính toán)

  • 'Chào mừng bạn đến với lập trình!'

  • "[email protected]" (địa chỉ email)

  • "$#%^&*" (chuỗi chứa ký hiệu đặc biệt)

Tại sao cần chuỗi?

Chuỗi là một kiểu dữ liệu cực kỳ quan trọng vì chúng là cách chính để máy tính và con người giao tiếp bằng văn bản. Chúng ta cần chuỗi để:

Biểu diễn văn bản: Đây là mục đích chính. Mọi thứ từ một câu chuyện, một đoạn tin nhắn, một bài báo, đều được lưu trữ và xử lý dưới dạng chuỗi.

bai_tho = "Trăm năm trong cõi người ta,\nChữ tài chữ mệnh khéo là ghét nhau."
print(bai_tho)
# Kết quả:
# Trăm năm trong cõi người ta,
# Chữ tài chữ mệnh khéo là ghét nhau.

Lưu trữ tên, địa chỉ, thông tin cá nhân: Thông tin về con người hoặc địa điểm thường ở dạng văn bản.

ten_nguoi_dung = "Trần Văn An"
dia_chi_email = "[email protected]"
print(f"Tên: {ten_nguoi_dung}, Email: {dia_chi_email}")

Tạo thông báo, tin nhắn: Giao diện người dùng thường hiển thị các thông báo hoặc hướng dẫn bằng văn bản.

thong_bao_chao_mung = "Chào mừng bạn đã đăng nhập thành công!"
print(thong_bao_chao_mung)

Xử lý dữ liệu văn bản: Từ các file văn bản, dữ liệu trên web, hay nhập liệu từ người dùng, tất cả đều được đọc và xử lý dưới dạng chuỗi trước khi chuyển đổi sang các kiểu dữ liệu khác (nếu cần).

# Dữ liệu từ file hoặc web
du_lieu_thoi_tiet = "Hà Nội: 30 độ C, có mây"
print(f"Dữ liệu thời tiết: {du_lieu_thoi_tiet}")

Ví dụ code cơ bản về cách tạo và in chuỗi:

# Tạo chuỗi bằng dấu nháy kép
thong_diep_1 = "Hello Python!"
print(thong_diep_1)

# Tạo chuỗi bằng dấu nháy đơn
thong_diep_2 = 'Học lập trình thật thú vị.'
print(thong_diep_2)

# Chuỗi chứa các con số (nhưng vẫn là văn bản)
ma_san_pham = "SPYTHON123"
print(f"Mã sản phẩm: {ma_san_pham}")

# In trực tiếp một chuỗi
print("Đây là một chuỗi được in trực tiếp.")

# Kiểm tra kiểu dữ liệu của biến chuỗi
print(f"Kiểu dữ liệu của 'thong_diep_1': {type(thong_diep_1)}") # Kết quả: <class 'str'>

Cách tạo chuỗi trong Python

Trong Python, có một vài cách linh hoạt để định nghĩa và tạo chuỗi. Việc lựa chọn cách nào thường phụ thuộc vào nội dung của chuỗi và sở thích cá nhân, nhưng điều quan trọng là bạn phải tuân thủ đúng cú pháp.

Dùng dấu nháy đơn (' ') hoặc nháy kép (" ")

Đây là cách phổ biến nhất để tạo chuỗi trong Python. Bạn có thể sử dụng dấu nháy đơn hoặc dấu nháy kép để bao quanh các ký tự của chuỗi.

  • Quan trọng: Khi đã chọn một loại dấu nháy để bắt đầu chuỗi, bạn phải sử dụng cùng loại dấu nháy đó để kết thúc chuỗi.

Ví dụ:

# Tạo chuỗi bằng dấu nháy kép
ten = "Alice"
print(f"Tên: {ten}")
print(f"Kiểu dữ liệu của 'ten': {type(ten)}") # Kết quả: <class 'str'>

# Tạo chuỗi bằng dấu nháy đơn
loi_chao = 'Xin chào thế giới!'
print(f"Lời chào: {loi_chao}")
print(f"Kiểu dữ liệu của 'loi_chao': {type(loi_chao)}") # Kết quả: <class 'str'>

Khi nào dùng loại nháy nào?

  • Nháy kép (""): Thường được ưu tiên khi chuỗi của bạn có chứa dấu nháy đơn bên trong. Điều này giúp bạn không cần phải "thoát" (escape) dấu nháy đơn bằng ký tự đặc biệt.

cau_noi = "Anh ấy nói 'Hello!'" # Dễ đọc hơn
print(cau_noi)

Nháy đơn (''): Thường được ưu tiên khi chuỗi của bạn có chứa dấu nháy kép bên trong.

ten_sach = 'Cuốn sách "Lập trình Python" rất hay.' # Dễ đọc hơn
print(ten_sach)
  • Nếu chuỗi của bạn không chứa dấu nháy nào, bạn có thể dùng loại nào cũng được. Quan trọng là sự đồng nhất trong toàn bộ dự án hoặc tập tin code của bạn để dễ đọc và dễ bảo trì.

Chuỗi nhiều dòng: Dùng ba dấu nháy đơn hoặc ba dấu nháy kép (''' ''' hoặc """ """)

Khi bạn cần tạo một chuỗi văn bản dài, trải dài qua nhiều dòng, việc sử dụng ba dấu nháy (Triple Quotes) là cách tiện lợi nhất. Python sẽ tự động giữ lại định dạng xuống dòng và khoảng trắng mà bạn đã gõ.

  • Bạn có thể dùng ba dấu nháy đơn (''') hoặc ba dấu nháy kép ("""). Cú pháp này được thiết kế đặc biệt để tạo các chuỗi đa dòng.

Ví dụ:

# Tạo chuỗi nhiều dòng bằng ba dấu nháy kép
tho = """Đây là dòng thứ nhất.
Đây là dòng thứ hai của bài thơ.
Và đây là dòng cuối cùng."""
print(tho)
# Kết quả:
# Đây là dòng thứ nhất.
# Đây là dòng thứ hai của bài thơ.
# Và đây là dòng cuối cùng.

print("-" * 30)

# Tạo chuỗi nhiều dòng bằng ba dấu nháy đơn
ghi_chu = '''Lưu ý:
1. Đảm bảo kết nối internet.
2. Kiểm tra thông tin đăng nhập.
3. Liên hệ hỗ trợ nếu gặp vấn đề.'''
print(ghi_chu)
# Kết quả:
# Lưu ý:
# 1. Đảm bảo kết nối internet.
# 2. Kiểm tra thông tin đăng nhập.
# 3. Liên hệ hỗ trợ nếu gặp vấn đề.

Lợi ích của chuỗi nhiều dòng:

  • Dễ đọc: Giúp bạn viết các đoạn văn bản dài mà không cần dùng ký tự xuống dòng \n thủ công.

  • Dùng làm Docstrings: Trong Python, chuỗi ba dấu nháy thường được dùng để viết tài liệu cho hàm, lớp (class) hoặc module.

Hiểu rõ các cách tạo chuỗi này sẽ giúp bạn linh hoạt hơn rất nhiều khi làm việc với văn bản trong các chương trình Python của mình. Tiếp theo, chúng ta sẽ xem xét các thao tác cơ bản với chuỗi nhé!

Các thao tác cơ bản với chuỗi trong Python

Nối chuỗi (Concatenation)

Nối chuỗi là quá trình kết hợp hai hay nhiều chuỗi lại với nhau để tạo thành một chuỗi dài hơn. Trong Python, bạn sử dụng dấu cộng (+) để thực hiện thao tác này.

  • Mục đích: Kết hợp các phần văn bản rời rạc thành một thông điệp hoàn chỉnh.

Ví dụ code:

chuoi1 = "Xin"
chuoi2 = " chào!"
ket_qua_noi = chuoi1 + chuoi2
print(f"'{chuoi1}' + '{chuoi2}' = '{ket_qua_noi}'") # Kết quả: 'Xin' + ' chào!' = 'Xin chào!'

ten = "Alice"
ho = "Nguyễn"
ho_ten = ho + " " + ten # Nối ba chuỗi: họ, dấu cách, và tên
print(f"Họ tên đầy đủ: {ho_ten}") # Kết quả: Họ tên đầy đủ: Nguyễn Alice

Lưu ý quan trọng: Chỉ nối được chuỗi với chuỗi. Bạn không thể nối một chuỗi với một kiểu dữ liệu khác (như số nguyên hoặc số thực) trực tiếp bằng dấu +. Nếu cố gắng, Python sẽ báo lỗi TypeError. Để nối chuỗi với số (hoặc các kiểu dữ liệu khác), bạn cần ép kiểu giá trị đó thành chuỗi bằng hàm str() trước.

Ví dụ lỗi và cách khắc phục:

so_luong = 5 # Đây là số nguyên (int)

# Lỗi: Không thể nối chuỗi với số nguyên
# print("Số lượng: " + so_luong)
# => TypeError: can only concatenate str (not "int") to str

# Đúng: Ép kiểu số nguyên sang chuỗi trước khi nối
print("Số lượng: " + str(so_luong)) # Kết quả: Số lượng: 5

Lặp chuỗi (Repetition)

Lặp chuỗi là thao tác tạo ra một chuỗi mới bằng cách lặp lại một chuỗi gốc nhiều lần. Bạn sử dụng dấu nhân (*) để thực hiện việc này.

  • Mục đích: Tạo ra các chuỗi có nội dung lặp đi lặp lại, thường dùng cho các mục đích hiển thị hoặc tạo dữ liệu mẫu.

  • Cú pháp: chuoi * so_lan_lap hoặc so_lan_lap * chuoi

Ví dụ code:

chuoi_can_lap = "Ha"
lan_lap = 3
ket_qua_lap = chuoi_can_lap * lan_lap
print(f"'{chuoi_can_lap}' * {lan_lap} = '{ket_qua_lap}'") # Kết quả: 'Ha' * 3 = 'HaHaHa'

dau_phan_cach = "=" * 20 # Tạo một dòng dấu bằng dài 20 ký tự
print(dau_phan_cach) # Kết quả: ====================

thong_bao_quan_trong = "Cảnh báo! " * 2 + "Nguy hiểm!"
print(thong_bao_quan_trong) # Kết quả: Cảnh báo! Cảnh báo! Nguy hiểm!
  • Lưu ý rằng số lần lặp phải là một số nguyên dương.

Lấy độ dài chuỗi (Length)

Lấy độ dài chuỗi là việc xác định số lượng ký tự có trong một chuỗi. Python cung cấp hàm len() (viết tắt của length) để thực hiện thao tác này.

  • Mục đích: Biết được chuỗi có bao nhiêu ký tự, hữu ích cho việc kiểm tra giới hạn nhập liệu, phân tích văn bản, hoặc trong các vòng lặp.

  • Cú pháp: len(chuoi)

Ví dụ code:​

van_ban = "Python là ngôn ngữ lập trình tuyệt vời."
do_dai = len(van_ban)
print(f"Chuỗi: '{van_ban}'")
print(f"Độ dài của chuỗi là: {do_dai} ký tự.") # Kết quả: Độ dài của chuỗi là: 39 ký tự.

ten_ngan = "An"
print(f"Độ dài của tên '{ten_ngan}' là: {len(ten_ngan)} ký tự.") # Kết quả: 2

chuoi_rong = ""
print(f"Độ dài của chuỗi rỗng: {len(chuoi_rong)} ký tự.") # Kết quả: 0
  • Hàm len() đếm cả dấu cách và các ký tự đặc biệt như dấu chấm, dấu phẩy, v.v.

Những thao tác cơ bản này là nền tảng để bạn có thể bắt đầu làm việc hiệu quả với chuỗi trong Python. Tiếp theo, chúng ta sẽ tìm hiểu cách truy cập và cắt các phần của chuỗi!

Truy cập ký tự trong chuỗi (Indexing) và Cắt chuỗi (Slicing) trong Python

Truy cập ký tự (Indexing)

Khái niệm: Truy cập ký tự là hành động lấy ra một ký tự cụ thể từ một chuỗi dựa vào vị trí của nó. Hãy hình dung chuỗi như một dãy các ô, mỗi ô chứa một ký tự và có một địa chỉ duy nhất.

Vị trí (index): Trong Python (và nhiều ngôn ngữ lập trình khác), các vị trí trong chuỗi được gọi là chỉ mục (index) và chúng bắt đầu đếm từ 0.

Bạn cũng có thể dùng chỉ mục âm để đếm từ cuối chuỗi:

  • Ký tự đầu tiên có chỉ mục là 0.

  • Ký tự thứ hai có chỉ mục là 1, và cứ thế tiếp tục.

  • [-1] là ký tự cuối cùng.

  • [-2] là ký tự kế cuối, v.v.

  • Cú pháp: Để truy cập một ký tự, bạn đặt chỉ mục của nó trong cặp dấu ngoặc vuông [] ngay sau tên biến chuỗi: ten_chuoi[index]

Ví dụ code:

ngon_ngu = "PYTHON"
# Chỉ mục dương: Đếm từ trái sang (bắt đầu từ 0)
ky_tu_dau = ngon_ngu[0]  # Ký tự ở vị trí 0 là 'P'
print(f"Ký tự đầu tiên của '{ngon_ngu}': '{ky_tu_dau}'") # Kết quả: 'P'

ky_tu_thu_3 = ngon_ngu[2] # Ký tự ở vị trí 2 (thực ra là ký tự thứ 3) là 'T'
print(f"Ký tự thứ 3 của '{ngon_ngu}': '{ky_tu_thu_3}'") # Kết quả: 'T'

# Chỉ mục âm: Đếm từ phải sang (bắt đầu từ -1)
ky_tu_cuoi = ngon_ngu[-1] # Ký tự ở vị trí -1 (cuối cùng) là 'N'
print(f"Ký tự cuối cùng của '{ngon_ngu}': '{ky_tu_cuoi}'") # Kết quả: 'N'

ky_tu_ke_cuoi = ngon_ngu[-2] # Ký tự ở vị trí -2 (kế cuối) là 'O'
print(f"Ký tự kế cuối của '{ngon_ngu}': '{ky_tu_ke_cuoi}'") # Kết quả: 'O'
  • Lưu ý quan trọng: Nếu bạn cố gắng truy cập một chỉ mục nằm ngoài phạm vi của chuỗi (ví dụ: ngon_ngu[10] khi chuỗi chỉ có 6 ký tự), Python sẽ báo lỗi IndexError.

Cắt chuỗi (Slicing)

Khái niệm: Cắt chuỗi là kỹ thuật lấy ra một phần (một đoạn con) của chuỗi, thay vì chỉ một ký tự đơn lẻ. Nó giống như việc bạn cắt một lát từ một chiếc bánh dài.

Cú pháp cơ bản: chuoi[start:end]

Quy tắc "end-1": Điều này rất quan trọng! Ký tự tại chỉ mục end sẽ KHÔNG được bao gồm trong kết quả. Ví dụ: chuoi[0:3] sẽ lấy các ký tự ở chỉ mục 0, 1, 2 (tổng cộng 3 ký tự).

  • start: Chỉ mục nơi bạn muốn bắt đầu cắt (bao gồm ký tự tại chỉ mục này). Nếu bỏ trống, mặc định là 0 (bắt đầu từ đầu chuỗi).

  • end: Chỉ mục nơi bạn muốn kết thúc cắt (không bao gồm ký tự tại chỉ mục này). Nếu bỏ trống, mặc định là hết chuỗi.

Cú pháp đầy đủ với bước nhảy: chuoi[start:end:step]

  • step: Bước nhảy (jump). Mặc định là 1 (lấy từng ký tự một). Nếu bạn đặt step2, nó sẽ lấy ký tự thứ nhất, bỏ qua ký tự thứ hai, lấy ký tự thứ ba, v.v.

Ví dụ code:

chuoi_goc = "Xin chao Python"
print(f"Chuỗi gốc: '{chuoi_goc}'")
print("-" * 30)

# 1. Cắt từ đầu đến một vị trí cụ thể (không bao gồm vị trí đó)
cat_1 = chuoi_goc[0:3] # Lấy ký tự ở index 0, 1, 2
print(f"chuoi_goc[0:3] -> '{cat_1}'") # Kết quả: "Xin"

# 2. Cắt từ một vị trí cụ thể đến hết chuỗi
cat_2 = chuoi_goc[9:] # Lấy từ index 9 đến hết (P, y, t, h, o, n)
print(f"chuoi_goc[9:]  -> '{cat_2}'") # Kết quả: "Python"

# 3. Cắt từ đầu chuỗi đến một vị trí cụ thể (khi bỏ trống 'start')
cat_3 = chuoi_goc[:7] # Lấy từ đầu đến index 6 (X, i, n, , c, h, a)
print(f"chuoi_goc[:7]  -> '{cat_3}'") # Kết quả: "Xin cha"

# 4. Cắt toàn bộ chuỗi (khi bỏ trống cả 'start' và 'end')
cat_4 = chuoi_goc[:]
print(f"chuoi_goc[:]   -> '{cat_4}'") # Kết quả: "Xin chao Python"

print("-" * 30)

# 5. Cắt chuỗi với bước nhảy (step)
# Lấy các ký tự ở vị trí 0, 2, 4, 6...
cat_5 = chuoi_goc[::2]
print(f"chuoi_goc[::2] -> '{cat_5}'") # Kết quả: "Xn aoPto"

# 6. Đảo ngược chuỗi (dùng bước nhảy âm -1)
dao_nguoc = chuoi_goc[::-1]
print(f"chuoi_goc[::-1] -> '{dao_nguoc}'") # Kết quả: "nohtyP oahc niX"

Truy cập ký tự và cắt chuỗi là những kỹ thuật cực kỳ linh hoạt và được sử dụng rất nhiều khi bạn cần trích xuất hoặc thao tác với các phần cụ thể của văn bản. Việc nắm vững chúng sẽ giúp bạn xử lý dữ liệu chuỗi một cách hiệu quả hơn rất nhiều!

Chuỗi là bất biến (Immutable) trong Python

Một trong những đặc điểm quan trọng nhất của chuỗi trong Python là chúng bất biến (immutable). Điều này có nghĩa là khi một chuỗi đã được tạo ra, bạn không thể thay đổi từng ký tự riêng lẻ hoặc sửa đổi nội dung của nó tại chỗ.

Khái niệm: Khi một chuỗi được tạo ra, bạn không thể thay đổi từng ký tự riêng lẻ của nó.

Hãy tưởng tượng một chuỗi như một bản ghi đã được khắc lên đá. Bạn không thể tẩy xóa hay sửa đổi một phần nhỏ của nó. Mỗi ký tự trong chuỗi có một vị trí cố định và không thể bị thay thế trực tiếp.

Ví dụ về lỗi khi cố gắng thay đổi ký tự:

ten = "An"
print(f"Chuỗi ban đầu: '{ten}'")

# Cố gắng thay đổi ký tự đầu tiên
# ten[0] = 'B'
# Khi chạy dòng này, Python sẽ báo lỗi:
# TypeError: 'str' object does not support item assignment
# (Đối tượng 'str' không hỗ trợ gán phần tử)

Cách "thay đổi": Để "thay đổi" một chuỗi, bạn phải tạo ra một chuỗi MỚI dựa trên chuỗi cũ.

Vì chuỗi là bất biến, nếu bạn muốn có một chuỗi với nội dung đã sửa đổi, bạn phải thực hiện các thao tác (như nối chuỗi, cắt chuỗi, hoặc sử dụng các phương thức) để tạo ra một chuỗi hoàn toàn mới và sau đó gán chuỗi mới đó cho biến (hoặc một biến khác). Chuỗi gốc vẫn sẽ tồn tại trong bộ nhớ cho đến khi không còn được tham chiếu nữa.

Ví dụ:

ten_cu = "An"
print(f"Chuỗi cũ: '{ten_cu}'")

# Để đổi 'An' thành 'Bn', chúng ta không thể sửa ký tự 'A'
# Thay vào đó, chúng ta tạo một chuỗi mới bằng cách nối 'B' với phần còn lại của chuỗi cũ
ten_moi = "B" + ten_cu[1:] # ten_cu[1:] sẽ lấy 'n'
print(f"Chuỗi mới: '{ten_moi}'")

# Kiểm tra địa chỉ bộ nhớ để thấy chúng là 2 đối tượng khác nhau
# (id() trả về địa chỉ bộ nhớ của đối tượng)
print(f"Địa chỉ bộ nhớ của '{ten_cu}': {id(ten_cu)}")
print(f"Địa chỉ bộ nhớ của '{ten_moi}': {id(ten_moi)}")
# Bạn sẽ thấy hai địa chỉ này khác nhau, chứng tỏ chúng là hai chuỗi riêng biệt.

Tính bất biến của chuỗi có những lợi ích về hiệu suất và tính an toàn trong một số trường hợp, mặc dù ban đầu có thể hơi khó hiểu.

Một số phương thức chuỗi phổ biến (String Methods) trong Python

Python cung cấp một bộ sưu tập phong phú các phương thức (methods) tích hợp sẵn cho chuỗi. Các phương thức này là các hàm đặc biệt được "gắn liền" với đối tượng chuỗi, cho phép bạn thực hiện rất nhiều thao tác hữu ích một cách dễ dàng mà không cần phải tự viết code phức tạp.

Khái niệm: Các hàm tích hợp sẵn giúp bạn thao tác với chuỗi dễ dàng.

Cú pháp chung: chuoi.ten_phuong_thuc(tham_so_neu_co)

  • Bạn gọi phương thức bằng cách đặt dấu chấm (.) sau tên biến chuỗi (hoặc chuỗi trực tiếp), sau đó là tên phương thức và cặp ngoặc đơn ().

  • Một số phương thức yêu cầu thêm thông tin (tham số) bên trong dấu ngoặc đơn.

Lưu ý quan trọng: Vì chuỗi là bất biến, hầu hết các phương thức chuỗi sẽ trả về một chuỗi MỚI với kết quả đã thay đổi, chứ không sửa đổi chuỗi gốc.

Ví dụ về các phương thức chuỗi phổ biến:

upper(): Chuyển tất cả các ký tự thành chữ HOA.

chuoi_goc = "hello world"
chuoi_hoa = chuoi_goc.upper()
print(f"'{chuoi_goc}'.upper() -> '{chuoi_hoa}'") # Kết quả: 'hello world'.upper() -> 'HELLO WORLD'

lower(): Chuyển tất cả các ký tự thành chữ thường.

chuoi_hoa_goc = "PYTHON LÀ TUYỆT VỜI"
chuoi_thuong = chuoi_hoa_goc.lower()
print(f"'{chuoi_hoa_goc}'.lower() -> '{chuoi_thuong}'") # Kết quả: 'PYTHON LÀ TUYỆT VỜI'.lower() -> 'python là tuyệt vời'

strip(): Xóa khoảng trắng (hoặc ký tự chỉ định) thừa ở đầu và cuối chuỗi.

chuoi_co_khoang_trang = "  abc def  "
chuoi_khong_khoang_trang = chuoi_co_khoang_trang.strip()
print(f"'{chuoi_co_khoang_trang}'.strip() -> '{chuoi_khong_khoang_trang}'") # Kết quả: '  abc def  '.strip() -> 'abc def'

# Bạn cũng có thể dùng .lstrip() để xóa khoảng trắng bên trái, .rstrip() bên phải
print(f"'  abc  '.lstrip() -> '{"  abc  ".lstrip()}'") # Kết quả: 'abc  '
print(f"'  abc  '.rstrip() -> '{"  abc  ".rstrip()}'") # Kết quả: '  abc'

replace(old, new): Thay thế tất cả các lần xuất hiện của chuỗi con old bằng chuỗi con new.

cau_van = "Tôi yêu lập trình, lập trình rất vui."
cau_moi = cau_van.replace("lập trình", "Python")
print(f"'{cau_van}'.replace('lập trình', 'Python') -> '{cau_moi}'") # Kết quả: 'Tôi yêu lập trình, lập trình rất vui.'.replace('lập trình', 'Python') -> 'Tôi yêu Python, Python rất vui.'

split(delimiter): Tách chuỗi thành một danh sách các chuỗi con dựa trên một ký tự hoặc chuỗi phân cách (delimiter). Nếu không có delimiter, nó sẽ tách theo khoảng trắng.

danh_sach_mon_an = "phở,bún chả,nem"
ket_qua_split = danh_sach_mon_an.split(",")
print(f"'{danh_sach_mon_an}'.split(',') -> {ket_qua_split}") # Kết quả: ['phở', 'bún chả', 'nem']

cau_don_gian = "Học Python rất dễ"
tu_da_tach = cau_don_gian.split() # Mặc định tách theo khoảng trắng
print(f"'{cau_don_gian}'.split() -> {tu_da_tach}") # Kết quả: ['Học', 'Python', 'rất', 'dễ']

find(sub): Tìm vị trí (chỉ mục) xuất hiện đầu tiên của chuỗi con (sub). Trả về -1 nếu không tìm thấy.

vi_du_find = "hello world"
vi_tri_ll = vi_du_find.find("ll")
print(f"'{vi_du_find}'.find('ll') -> {vi_tri_ll}") # Kết quả: 2 (ký tự 'l' đầu tiên của "ll" nằm ở index 2)

vi_tri_non_existent = vi_du_find.find("xyz")
print(f"'{vi_du_find}'.find('xyz') -> {vi_tri_non_existent}") # Kết quả: -1 (không tìm thấy)

startswith(prefix)endswith(suffix): Kiểm tra xem chuỗi có bắt đầu (startswith) hoặc kết thúc (endswith) bằng một chuỗi con cụ thể hay không. Trả về True hoặc False.

ten_file = "document.txt"
kiem_tra_txt = ten_file.endswith(".txt")
print(f"'{ten_file}'.endswith('.txt') -> {kiem_tra_txt}") # Kết quả: True

kiem_tra_doc = ten_file.endswith(".doc")
print(f"'{ten_file}'.endswith('.doc') -> {kiem_tra_doc}") # Kết quả: False

kiem_tra_bat_dau = "Python is fun".startswith("Python")
print(f"'Python is fun'.startswith('Python') -> {kiem_tra_bat_dau}") # Kết quả: True

Các phương thức chuỗi này là công cụ không thể thiếu khi bạn làm việc với văn bản trong Python, giúp bạn thực hiện các tác vụ từ đơn giản đến phức tạp một cách hiệu quả và gọn gàng.

Định dạng chuỗi (String Formatting) trong Python

Khi bạn làm việc với chuỗi, việc hiển thị thông tin thường không chỉ đơn thuần là in ra một chuỗi cố định. Bạn sẽ cần chèn giá trị của các biến vào trong chuỗi đó để tạo ra các thông điệp động. Định dạng chuỗi là kỹ thuật cho phép bạn làm điều này một cách có cấu trúc và dễ kiểm soát.

Mục đích: Chèn giá trị của biến vào chuỗi một cách dễ đọc.

Thay vì phải nối chuỗi thủ công bằng dấu + và ép kiểu liên tục (như chúng ta đã thấy ở phần trước), định dạng chuỗi cung cấp các cách thanh lịch hơn để "điền" các giá trị vào các "chỗ trống" trong một chuỗi mẫu.

Ví dụ về vấn đề không định dạng:

ten_hoc_sinh = "Minh Anh"
diem_toan = 8.5
diem_van = 7.0

# Cách nối chuỗi thủ công (có thể dài dòng và khó đọc)
# thong_bao = "Học sinh: " + ten_hoc_sinh + ", Điểm Toán: " + str(diem_toan) + ", Điểm Văn: " + str(diem_van)
# print(thong_bao)

Rõ ràng, cách trên rất dài và dễ gây lỗi TypeError nếu quên str(). Định dạng chuỗi giải quyết vấn đề này.

Các cách định dạng chuỗi phổ biến trong Python:

Có nhiều cách để định dạng chuỗi trong Python, nhưng hai cách sau đây là phổ biến và được khuyên dùng nhất:

1. f-strings (Formatted String Literals) - Khuyên dùng

f-strings được giới thiệu từ Python 3.6 và nhanh chóng trở thành cách định dạng chuỗi được ưa chuộng nhất vì tính ngắn gọn, dễ đọc và hiệu suất cao.

  • Cách dùng: Đặt chữ f (hoặc F) ngay trước dấu nháy mở đầu của chuỗi. Sau đó, bạn có thể đặt tên biến hoặc biểu thức Python trực tiếp 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.

Đặc điểm:

  • Dễ đọc: Cú pháp rất trực quan, bạn thấy ngay biến nào sẽ điền vào đâu.

  • Tự động ép kiểu: f-strings tự động chuyển đổi các giá trị không phải chuỗi (như số, boolean) thành chuỗi, loại bỏ nhu cầu gọi str() tường minh.

  • Hỗ trợ biểu thức: Bạn có thể đặt cả các phép tính hoặc lời gọi hàm vào bên trong {}.

Ví dụ code:

ten = "Lan"
tuoi = 20
mon_hoc_yeu_thich = "Lập trình"

# Ví dụ cơ bản
print(f"Tên: {ten}, Tuổi: {tuoi}")
# Kết quả: Tên: Lan, Tuổi: 20

# Ví dụ với biểu thức
so_luong = 5
gia_don_vi = 15.5
print(f"Tổng tiền cho {so_luong} sản phẩm là: {so_luong * gia_don_vi} USD.")
# Kết quả: Tổng tiền cho 5 sản phẩm là: 77.5 USD.

# Ví dụ với hàm
print(f"Tên của bạn viết hoa là: {ten.upper()}")
# Kết quả: Tên của bạn viết hoa là: LAN

# Với các kiểu dữ liệu khác
dang_hoc = True
print(f"Tên: {ten}, Đang học: {dang_hoc}.")
# Kết quả: Tên: Lan, Đang học: True.

Phương thức .format()

Phương thức .format() là cách định dạng chuỗi truyền thống hơn, được sử dụng rộng rãi trước khi f-strings ra đời. Nó vẫn hoàn toàn hợp lệ và hữu ích trong nhiều trường hợp.

  • Cách dùng: Bạn tạo một chuỗi mẫu với các cặp dấu ngoặc nhọn {} làm "chỗ giữ chỗ". Sau đó, bạn gọi phương thức .format() trên chuỗi đó và truyền các giá trị muốn chèn vào làm đối số.

Đặc điểm:

  • Linh hoạt về thứ tự: Bạn có thể để trống {} (thứ tự mặc định), hoặc đặt số chỉ mục ({0}, {1}) hoặc tên biến ({ten}) vào trong {}.

  • Không tự động ép kiểu biểu thức: Chỉ chấp nhận biến hoặc giá trị trực tiếp, không phải biểu thức.

Ví dụ code:

ten_sv = "Hùng"
diem_tb = 8.75

# Cách 1: Chỗ giữ chỗ rỗng (thứ tự theo đối số)
print("Tên sinh viên: {}, Điểm trung bình: {}".format(ten_sv, diem_tb))
# Kết quả: Tên sinh viên: Hùng, Điểm trung bình: 8.75

# Cách 2: Sử dụng chỉ mục để xác định thứ tự
print("Điểm trung bình: {1}, Tên sinh viên: {0}.".format(ten_sv, diem_tb))
# Kết quả: Điểm trung bình: 8.75, Tên sinh viên: Hùng.

# Cách 3: Sử dụng tên để dễ đọc hơn (phải truyền đối số dưới dạng key=value)
print("Tên: {name}, Điểm: {score}".format(name=ten_sv, score=diem_tb))
# Kết quả: Tên: Hùng, Điểm: 8.75

So sánh .format() và f-strings:

  • f-strings thường được ưa chuộng hơn vì cú pháp ngắn gọn, dễ đọc và hiệu suất tốt hơn trong hầu hết các trường hợp. Nó rất mạnh mẽ khi bạn muốn nhúng biến hoặc biểu thức trực tiếp.

  • .format() vẫn hữu ích khi bạn cần kiểm soát chặt chẽ hơn về thứ tự các giá trị hoặc khi làm việc với các phiên bản Python cũ hơn (trước 3.6).

Việc sử dụng định dạng chuỗi giúp code của bạn sạch sẽ, dễ hiểu và chuyên nghiệp hơn rất nhiều khi hiển thị thông tin ra màn hình hoặc ghi vào file. Bạn sẽ sử dụng kỹ thuật này rất thường xuyên trong lập trình Python!

Kết bài

Bạn đã cùng tôi tìm hiểu thế giới rộng lớn của chuỗi (Strings) trong Python – một kiểu dữ liệu không thể thiếu khi bạn làm việc với văn bản. Từ việc tạo chuỗi bằng các loại dấu nháy, thực hiện các phép toán cơ bản như nối và lặp, cho đến các kỹ thuật nâng cao như truy cập ký tự, cắt chuỗi, và sử dụng hàng loạt các phương thức hữu ích.

Hãy luôn ghi nhớ những điểm then chốt này:

  • Chuỗi là bất biến: Điều này có nghĩa là bạn không thể thay đổi một chuỗi đã tồn tại. Mọi thao tác "sửa đổi" thực chất là tạo ra một chuỗi mới.

  • Chỉ mục (Indexing) và Cắt chuỗi (Slicing): Là hai công cụ mạnh mẽ giúp bạn trích xuất hoặc lấy ra các phần cụ thể của chuỗi một cách linh hoạt.

  • Phương thức chuỗi (String Methods): Python cung cấp rất nhiều hàm tích hợp sẵn (ví dụ: upper(), lower(), replace(), split()) giúp bạn thao tác với chuỗi một cách hiệu quả và gọn gàng.

  • Định dạng chuỗi (String Formatting): Kỹ thuật này, đặc biệt là với f-strings, giúp bạn chèn các giá trị của biến vào chuỗi một cách dễ đọc và chuyên nghiệp, thay vì phải nối chuỗi thủ công.

Việc thành thạo làm việc với chuỗi sẽ mở ra vô vàn khả năng cho các chương trình của bạn, từ việc xử lý dữ liệu văn bản, tạo ra các giao diện người dùng thân thiện, cho đến phân tích dữ liệu lớn. Hãy tiếp tục thực hành để biến những kiến thức này thành kỹ năng lập trình vững chắc nhé!

Bài viết liên quan