1. Khái niệm chuỗi
Chuỗi (str) là kiểu dữ liệu cơ bản và phổ biến nhất trong Python, được tạo bằng cách bao quanh ký tự hoặc dãy ký tự bởi dấu nháy đơn ('...'), nháy kép ("...") hoặc ba dấu nháy ('''...''' hoặc """...""").
text_a = 'Xin chào thế giới'
text_b = "Python lập trình"
print(type(text_a)) # <class 'str'>
print(type(text_b)) # <class 'str'>
1.1 Các dạng khai báo chuỗi
- Nháy đơn/nháy kép: dùng cho chuỗi một dòng.
ten_1 = 'An'
ten_2 = "Bình"
- Ba dấu nháy: hỗ trợ đa dòng và giữ nguyên định dạng xuống dòng.
gioi_thieu_1 = '''Tôi tên là An,
sống tại Hà Nội.'''
gioi_thieu_2 = """Tôi tên là Bình,
làm việc tại TP.HCM."""
print(gioi_thieu_1)
# Tôi tên là An,
# sống tại Hà Nội.
Khi cần chứa ký tự đặc biệt như dấu nháy trong chuỗi, có thể dùng ký tự thoát (\') hoặc đổi loại nháy:
cau = "An nói: 'Xin chào!'"
cau_khac = 'An nói: \'Xin chào!\''
1.2 Định dạng đầu ra chuỗi
Có nhiều cách để chèn giá trị vào chuỗi:
ho_ten = "Lan"
print("Tên tôi là", ho_ten) # Cách cơ bản
print("Tên tôi là %s" % ho_ten) # Dạng % formatting
print("Tên tôi là {}".format(ho_ten)) # Dạng .format()
print(f"Tên tôi là {ho_ten}") # f-string (ưu tiên)
1.3 Nhập liệu từ người dùng
Hàm input() luôn trả về chuỗi — kể cả khi người dùng nhập số:
ten = input("Nhập tên bạn: ")
mat_khau = input("Nhập mật khẩu: ")
print(f"Tên: '{ten}' (kiểu {type(ten)})")
print(f"Mật khẩu: '{mat_khau}' (kiểu {type(mat_khau)})")
2. Truy cập ký tự qua chỉ số (index)
Mỗi ký tự trong chuỗi có một vị trí xác định bắt đầu từ 0. Chỉ số âm đếm ngược từ cuối (-1 là ký tự cuối cùng).
chuoi = "Python"
print(chuoi[0]) # 'P'
print(chuoi[2]) # 't'
print(chuoi[-1]) # 'n'
print(chuoi[-3]) # 'h'
3. Cắt chuỗi (slicing)
Cú pháp: [start:end:step], trong đó:
start: chỉ số bắt đầu (mặc định = 0)end: chỉ số kết thúc (không bao gồm phần tử tạiend; mặc định = độ dài chuỗi)step: bước nhảy (mặc định = 1; âm → đảo ngược thứ tự)
data = "programming"
print(data[2:7]) # "ogram"
print(data[:5]) # "progr"
print(data[5:]) # "amming"
print(data[::2]) # "prormn"
print(data[::-1]) # "gnimmargorp"
print(data[-6:-2]) # "ammi"
Ví dụ chia chuỗi thành các đoạn cố định:
du_lieu = "ABCDEFGHIJKL"
do_dai_doan = 4
ket_qua = [du_lieu[i:i + do_dai_doan] for i in range(0, len(du_lieu), do_dai_doan)]
print(ket_qua) # ['ABCD', 'EFGH', 'IJKL']
4. Các phương thức xử lý chuỗi
4.1 Tìm kiếm vị trí và tần suất xuất hiện
find(sub[, start[, end]]): trả về chỉ số đầu tiên củasub, hoặc-1nếu không tìm thấy.rfind(...): tìm từ phải sang trái.index(...)vàrindex(...): tương tự nhưng ném ngoại lệValueErrornếu không tìm thấy.count(sub[, start[, end]]): đếm số lần xuất hiện.
s = "apple banana apple cherry apple"
print(s.find("apple")) # 0
print(s.rfind("apple")) # 27
print(s.count("apple")) # 3
print(s.count("apple", 5)) # 2 (bắt đầu từ vị trí 5)
4.2 Biến đổi chuỗi
Chuỗi trong Python là bất biến — mọi thao tác đều tạo chuỗi mới.
replace(old, new[, count]): thay thế tất cả hoặc tối đacountlần.split(sep=None, maxsplit=-1): phân tách thành danh sách theosep.rsplit(...): phân tách từ phải sang trái.join(iterable): nối các phần tử trongiterablebằng chuỗi gọi hàm.upper(),lower(),title(),capitalize(),swapcase()strip([chars]),lstrip([chars]),rstrip([chars]): loại bỏ ký tự ở hai đầu hoặc một bên.ljust(width[, fillchar]),rjust(...),center(...): căn lề với ký tự điền.
s = " Hello World! "
print(s.strip()) # "Hello World!"
print(s.upper()) # " HELLO WORLD! "
print("-".join(["A", "B", "C"])) # "A-B-C"
print("code".center(10, "*")) # "***code***"
4.3 Kiểm tra tính chất chuỗi
Các phương thức trả về True hoặc False:
startswith(prefix[, start[, end]]),endswith(...)isalpha(),isdigit(),isalnum(),isspace()isupper(),islower()- Toán tử
in: kiểm tra sự tồn tại của chuỗi con.
s = "Python3.10"
print(s.startswith("Py")) # True
print(s.isalnum()) # True
print(s.isdigit()) # False
print("thon" in s) # True
5. Xử lý chuỗi động (mutable string)
Vì chuỗi không thể thay đổi trực tiếp, để mô phỏng "chuỗi có thể sửa", ta dùng io.StringIO:
import io
chuoi_goc = "Hello World"
buffer = io.StringIO(chuoi_goc)
# Di chuyển con trỏ và ghi đè
buffer.seek(6) # tới vị trí ký tự thứ 7 ('W')
buffer.write("Python!") # ghi đè từ đây
ket_qua = buffer.getvalue()
print(ket_qua) # "Hello Python!"
buffer.close()
Lưu ý: Đây không phải là thay đổi chuỗi gốc mà là thao tác trên vùng đệm bộ nhớ — phù hợp cho các tác vụ xây dựng chuỗi phức tạp hiệu quả hơn việc nối chuỗi liên tục.