4.1. Khái niệm chuỗi và f-string
4.1.1. Khái niệm chuỗi (String)
- 
Khái niệm: Chuỗi (String) là một dãy tuần tự các ký tự. Trong Python, chuỗi được đặt bên trong cặp dấu nháy đơn (
') hoặc nháy kép ("). - 
Chỉ số (Index): Mỗi ký tự trong chuỗi được gán một chỉ số, bắt đầu từ
0cho ký tự đầu tiên. Python cũng hỗ trợ chỉ số âm, bắt đầu từ-1cho ký tự cuối cùng. - 
Tính chất: Chuỗi trong Python là bất biến (immutable), có nghĩa là sau khi một chuỗi được tạo ra, bạn không thể thay đổi nội dung (ký tự) bên trong nó.
 
Ví dụ 1: Tạo chuỗi và truy cập ký tự
# Chuỗi có thể dùng nháy đơn hoặc nháy kép
file_log = "system.log"
vai_tro = 'admin'
# In ký tự đầu tiên (chỉ số 0)
print(file_log[0])
# In ký tự thứ 3 (chỉ số 2)
print(file_log[2])
# In ký tự cuối cùng (chỉ số -1)
print(file_log[-1])
- 
Giải thích:
- 
file_log[0]truy cập ký tự tại chỉ số 0, làs. - 
file_log[2]truy cập ký tự tại chỉ số 2, làs. - 
file_log[-1]truy cập ký tự tại chỉ số -1 (cuối cùng), làg. 
 - 
 - 
Kết quả:
s s g 
4.1.2. f-string (Định dạng chuỗi)
- 
Công dụng: f-string (Formatted String Literals) là cách thức hiện đại, ngắn gọn và dễ đọc nhất để chèn giá trị của biến vào bên trong một chuỗi.
Cú pháp: Bắt đầu chuỗi bằng chữ
f(hoặcF) ngay trước dấu nháy. Đặt tên biến hoặc biểu thức bạn muốn chèn vào trong cặp dấu ngoặc nhọn{}. 
Ví dụ 2: Sử dụng f-string
username = "admin"
port = 8080
status = True
# Cách cũ (dùng toán tử +) rất rườm rà và dễ lỗi
# Phải dùng str() để ép kiểu số và boolean sang chuỗi
print("User: " + username + " running on port " + str(port) + " status " + str(status))
# Dùng f-string
# Tự động chuyển đổi các kiểu dữ liệu sang chuỗi
thong_bao = f"User: {username} running on port {port} status {status}"
print(thong_bao)
- 
Giải thích:
- 
Dòng 6 (cách cũ) yêu cầu nối chuỗi bằng
+và phải ép kiểu thủ côngportvàstatussang chuỗi bằng hàmstr(). - 
Dòng 10 (f-string) đơn giản hơn nhiều. Chỉ cần đặt biến vào trong
{}. f-string tự động xử lý việc chuyển đổi kiểu dữ liệu. 
 - 
 
Kết quả (cho cả 2 cách): User: admin running on port 8080 status True
4.2. Các phương thức chuỗi cơ bản
Phương thức (method) là các hàm được tích hợp sẵn, gắn liền với đối tượng (ở đây là chuỗi). Chúng không làm thay đổi chuỗi gốc (vì chuỗi là bất biến), mà sẽ trả về một chuỗi mới đã qua xử lý.
- 
Cú pháp:
ten_bien_chuoi.ten_phuong_thuc() 
| Phương thức | Ý nghĩa | 
upper() | 
 Trả về một chuỗi mới đã được viết hoa toàn bộ.  | 
lower() | 
 Trả về một chuỗi mới đã được viết thường toàn bộ.  | 
strip() | 
 Trả về một chuỗi mới đã loại bỏ các ký tự khoảng trắng (space, tab, enter) ở hai đầu chuỗi.  | 
Ví dụ 3: Chuẩn hóa dữ liệu đầu vào
# Dữ liệu nhập từ người dùng thường không nhất quán
# Có thể có khoảng trắng thừa, viết hoa/thường lẫn lộn
vai_tro_nhap = "   Admin   "
# 1. Dùng strip() để loại bỏ khoảng trắng thừa ở hai đầu
vai_tro_sach = vai_tro_nhap.strip()
print(f"Sau khi strip: '{vai_tro_sach}'")
# 2. Dùng lower() để chuyển về chữ thường (thường dùng để so sánh)
vai_tro_thuong = vai_tro_sach.lower()
print(f"Sau khi lower: '{vai_tro_thuong}'")
# 3. Dùng upper() để chuyển về chữ hoa
vai_tro_hoa = vai_tro_sach.upper()
print(f"Sau khi upper: '{vai_tro_hoa}'")
# Có thể kết hợp (chaining) các phương thức
# Thực thi từ trái sang phải
vai_tro_chuan_hoa = vai_tro_nhap.strip().lower()
print(f"Đã chuẩn hóa: '{vai_tro_chuan_hoa}'")
- 
Giải thích:
- 
vai_tro_nhaplà" Admin ". - 
Dòng 6:
strip()loại bỏ khoảng trắng,vai_tro_sachlà"Admin". - 
Dòng 10:
lower()chuyển"Admin"thành"admin". - 
Dòng 14:
upper()chuyển"Admin"thành"ADMIN". - 
Dòng 18: Kết hợp
strip()rồilower(), kết quả cuối cùng là"admin". Đây là kỹ thuật rất quan trọng để chuẩn hóa dữ liệu trước khi kiểm tra. 
 - 
 - 
Kết quả:
Sau khi strip: 'Admin' Sau khi lower: 'admin' Sau khi upper: 'ADMIN' Đã chuẩn hóa: 'admin' 
4.3. Cắt và nối chuỗi
4.3.1. Nối chuỗi (Concatenation)
- 
Công dụng: Ghép hai hay nhiều chuỗi lại với nhau bằng toán tử
+. - 
Lưu ý: Chỉ có thể nối chuỗi với chuỗi. Nếu muốn nối chuỗi với số, phải dùng
str()để ép kiểu số sang chuỗi, hoặc dùng f-string (khuyến khích). 
Ví dụ 4: Nối chuỗi
ho = "Lê"
ten = "Minh"
# Nối chuỗi, phải tự thêm dấu cách
ho_ten = ho + " " + ten
print(ho_ten)
- 
Kết quả:
Lê Minh 
4.3.2. Cắt chuỗi (Slicing)
- 
Công dụng: Trích xuất một phần của chuỗi (một chuỗi con) bằng cách sử dụng các chỉ số (index).
 - 
Cú pháp:
ten_bien[bat_dau:ket_thuc]- 
bat_dau: Chỉ số bắt đầu (bao gồm). Nếu bỏ trống, mặc định là0(đầu chuỗi). - 
ket_thuc: Chỉ số kết thúc (nhưng không bao gồm). Nếu bỏ trống, mặc định là đến hết chuỗi. 
 - 
 
Ví dụ 5: Cắt chuỗi
# Chỉ số:   0 1 2 3 4 5 6 7 8 9
# Ký tự:   s y s t e m . l o g
# Chỉ số âm:-10-9-8-7-6-5-4-3-2-1
file_log = "system.log"
# 1. Lấy từ chỉ số 0 đến chỉ số 5 (tức là ký tự 6)
ten_file = file_log[0:6]
print(f"Tên file: {ten_file}")
# 2. Lấy từ đầu (bỏ trống bat_dau) đến chỉ số 6
ten_file_2 = file_log[:6]
print(f"Tên file 2: {ten_file_2}")
# 3. Lấy từ chỉ số 7 đến hết (bỏ trống ket_thuc)
duoi_file = file_log[7:]
print(f"Đuôi file: {duoi_file}")
# 4. Lấy 3 ký tự cuối cùng (dùng chỉ số âm)
duoi_file_2 = file_log[-3:]
print(f"Đuôi file 2: {duoi_file_2}")
- 
Giải thích:
- 
[0:6]lấy từ index 0 (s) đến index 5 (m). Kết quả:system. - 
[:6]tương tự như[0:6]. Kết quả:system. - 
[7:]lấy từ index 7 (l) đến hết chuỗi. Kết quả:log. - 
[-3:]lấy 3 ký tự tính từ cuối chuỗi. Kết quả:log. 
 - 
 - 
Kết quả:
Tên file: system Tên file 2: system Đuôi file: log Đuôi file 2: log 
Bài Tập 4.1: Chuẩn hóa Tên Người Dùng (Cấp độ: Dễ – strip() và lower())
Khi tạo tài khoản người dùng, tên đăng nhập thường phải chuẩn hóa (viết thường và không có khoảng trắng thừa).
Sử dụng input() để hỏi người dùng nhập một tên đăng nhập vào biến
ten_nhap. (Khuyến khích học sinh nhập thử tên có khoảng trắng ở đầu hoặc cuối).Áp dụng phương thức strip() để loại bỏ các khoảng trắng thừa.
Áp dụng phương thức lower() để chuyển toàn bộ tên đăng nhập sang chữ thường.
In ra màn hình thông báo Tên đăng nhập đã được chuẩn hóa.
Sản phẩm: Lưu với tên File baitap41_chuanhoa_ten.py
						Bài Tập 4.2: Trích xuất Mã lỗi Thiết bị (Cấp độ: Trung bình – Cắt chuỗi/Slicing)
Giả sử mã tài sản của thiết bị mạng luôn có cấu trúc cố định: [2 ký tự loại thiết bị][4 ký tự ngày mua][3 ký tự mã vùng]. Ví dụ: SW2024HN.
Khai báo biến
ma_tai_san = "RT2023HCM".Sử dụng kỹ thuật cắt chuỗi (Slicing) để trích xuất các thông tin sau:
loai_thiet_bi: 2 ký tự đầu tiên (Ví dụ:RT).nam_mua: 4 ký tự ở giữa (Ví dụ:2023).ma_vung: 3 ký tự cuối cùng (Ví dụ:HCM).
Sử dụng f−string để in ra báo cáo tóm tắt cấu trúc này.
Sản phẩm: Lưu với tên File baitap42_trichxuat_ma.py
						Bài Tập 4.3: Phân tích Địa chỉ Mạng (Cấp độ: Nâng cao – split() và List)
Địa chỉ IP là chuỗi số được phân tách bởi dấu chấm (.).
Sử dụng input() để hỏi người dùng nhập một địa chỉ IP (ví dụ:
192.168.1.100).Sử dụng phương thức $split(‘.’) để tách chuỗi IP thành 4 Octet và lưu vào biến
octet_list.In ra Octet 1, Octet 3, và Octet 4 bằng cách truy cập các chỉ mục tương ứng trong
octet_list.Sử dụng f−string để in ra thông báo:
“IP: [Octet 1].[Octet 2].[Octet 3].[Octet 4]\nOctet mạng (Octet 3): [Octet 3]”
Sản phẩm: Lưu với tên File baitap43_phantich_ip.py
						Bài Tập 4.4: Công cụ Dịch mã Log Tự động (Cấp độ: Khó nhất – Tích hợp split() và replace())
Bạn nhận được một dòng Log hệ thống có cấu trúc như sau (phân tách bằng dấu phẩy ,):
du_lieu_log = "  09:30:00, ERROR , Code: 404, Mô tả: File không tồn tại "
Bạn hãy viết chương trình xử lý dòng Log này:
Làm sạch: Dùng strip() trên chuỗi
du_lieu_logđể loại bỏ khoảng trắng thừa ở hai đầu.Phân tách: Dùng phương thức $split(‘,’) để tách chuỗi đã làm sạch thành các phần tử.
Trích xuất: Trích xuất Thời gian (phần tử 0) và Mô tả (phần tử 3). Đảm bảo dùng strip() lên cả các phần tử này để loại bỏ khoảng trắng thừa bên trong.
Dịch mã: Dùng phương thức replace() lên phần tử Mô tả để thay thế từ
"File không tồn tại"thành"Không tìm thấy tài nguyên (Resource Not Found)".In báo cáo: In ra báo cáo cuối cùng với f−string:
[Thời gian trích xuất] – [Mô tả đã dịch] Mức độ Lỗi: ERROR
