Bài Tập Về Chuỗi (Strings)
Giới Thiệu
Chuỗi trong Python như những câu chuyện được viết ra. Chúng ta có thể đọc, chỉnh sửa, cắt ghép, và trang trí những câu chuyện này theo nhiều cách khác nhau.
Bài Tập 1: Tạo và Hiển Thị Chuỗi
Đề bài: Làm quen với các cách tạo chuỗi
# Giải pháp
# Cách 1: Dấu nháy đơn
ten_1 = 'Nguyễn Văn An'
# Cách 2: Dấu nháy kép
ten_2 = "Trần Thị Bình"
# Cách 3: Ba dấu nháy (cho chuỗi nhiều dòng)
mo_ta = """
Đây là một câu chuyện dài
về một chàng trai tên An
và cô gái tên Bình
"""
# Cách 4: Chuỗi với ký tự đặc biệt
cau_noi = "Anh ấy nói: \"Tôi yêu lập trình Python!\""
duong_dan = "C:\\Users\\An\\Documents\\python_code.py"
print("=== CÁC CÁCH TẠO CHUỖI ===")
print(f"Tên 1: {ten_1}")
print(f"Tên 2: {ten_2}")
print(f"Mô tả: {mo_ta}")
print(f"Câu nói: {cau_noi}")
print(f"Đường dẫn: {duong_dan}")
Giải thích:
- Dấu nháy đơn và kép như hai cách viết khác nhau
- Ba dấu nháy như viết thư dài nhiều dòng
\"
như cách viết dấu nháy trong câu nói\\
như cách viết dấu gạch chéo
Bài Tập 2: Nối Chuỗi (String Concatenation)
Đề bài: Ghép các chuỗi lại với nhau
# Giải pháp
ho = "Nguyễn"
ten_dem = "Văn"
ten = "An"
# Cách 1: Dùng dấu +
ho_ten_1 = ho + " " + ten_dem + " " + ten
print(f"Cách 1: {ho_ten_1}")
# Cách 2: Dùng join()
ho_ten_2 = " ".join([ho, ten_dem, ten])
print(f"Cách 2: {ho_ten_2}")
# Cách 3: Dùng f-string (tốt nhất)
ho_ten_3 = f"{ho} {ten_dem} {ten}"
print(f"Cách 3: {ho_ten_3}")
# Cách 4: Dùng format()
ho_ten_4 = "{} {} {}".format(ho, ten_dem, ten)
print(f"Cách 4: {ho_ten_4}")
# Cách 5: Dùng % (cách cũ)
ho_ten_5 = "%s %s %s" % (ho, ten_dem, ten)
print(f"Cách 5: {ho_ten_5}")
# Ví dụ thực tế: Tạo thông điệp chào
tuoi = 20
thong_diep = f"Xin chào! Tôi là {ho_ten_3}, {tuoi} tuổi. Rất vui được gặp bạn!"
print(f"\nThông điệp: {thong_diep}")
Bài Tập 3: Độ Dài và Truy Cập Ký Tự
Đề bài: Đếm ký tự và truy cập từng ký tự trong chuỗi
# Giải pháp
cau_noi = "Python là ngôn ngữ tuyệt vời!"
# Độ dài chuỗi
do_dai = len(cau_noi)
print(f"Câu: '{cau_noi}'")
print(f"Độ dài: {do_dai} ký tự")
print("\n=== TRUY CẬP KỲ TỰ ===")
# Truy cập ký tự đầu tiên (index 0)
ky_tu_dau = cau_noi[0]
print(f"Ký tự đầu tiên: '{ky_tu_dau}'")
# Truy cập ký tự cuối cùng
ky_tu_cuoi = cau_noi[-1]
print(f"Ký tự cuối cùng: '{ky_tu_cuoi}'")
# Truy cập ký tự ở vị trí 7
ky_tu_7 = cau_noi[7]
print(f"Ký tự ở vị trí 7: '{ky_tu_7}'")
print("\n=== DUYỆT QUA TỪNG KÝ TỰ ===")
# Cách 1: Dùng for trực tiếp
print("Cách 1:")
for ky_tu in cau_noi:
print(ky_tu, end=" ")
print()
# Cách 2: Dùng index
print("\nCách 2 (với vị trí):")
for i in range(len(cau_noi)):
print(f"[{i}]: '{cau_noi[i]}'", end=" ")
if (i + 1) % 10 == 0: # Xuống dòng sau mỗi 10 ký tự
print()
print("\n\n=== THỐNG KÊ KÝ TỰ ===")
# Đếm ký tự đặc biệt
chu_cai = sum(1 for c in cau_noi if c.isalpha())
chu_so = sum(1 for c in cau_noi if c.isdigit())
khoang_trang = sum(1 for c in cau_noi if c.isspace())
ky_tu_dac_biet = len(cau_noi) - chu_cai - chu_so - khoang_trang
print(f"Chữ cái: {chu_cai}")
print(f"Chữ số: {chu_so}")
print(f"Khoảng trắng: {khoang_trang}")
print(f"Ký tự đặc biệt: {ky_tu_dac_biet}")
Bài Tập 4: Cắt Chuỗi (String Slicing)
Đề bài: Cắt và lấy một phần của chuỗi
# Giải pháp
van_ban = "Học Python rất thú vị và bổ ích"
print(f"Văn bản gốc: '{van_ban}'")
print(f"Độ dài: {len(van_ban)} ký tự")
print("\n=== CÁC CÁCH CẮT CHUỖI ===")
# Lấy từ đầu đến vị trí 10
phan_1 = van_ban[:11] # "Học Python"
print(f"Từ đầu đến vị trí 10: '{phan_1}'")
# Lấy từ vị trí 4 đến cuối
phan_2 = van_ban[4:] # "Python rất thú vị và bổ ích"
print(f"Từ vị trí 4 đến cuối: '{phan_2}'")
# Lấy từ vị trí 4 đến 10
phan_3 = van_ban[4:11] # "Python"
print(f"Từ vị trí 4 đến 10: '{phan_3}'")
# Lấy 5 ký tự cuối
phan_4 = van_ban[-7:] # "bổ ích"
print(f"5 ký tự cuối: '{phan_4}'")
# Cắt ngược (từ cuối về đầu)
nguoc = van_ban[::-1]
print(f"Chuỗi ngược: '{nguoc}'")
# Lấy ký tự cách nhau 2 vị trí
cach_2 = van_ban[::2]
print(f"Ký tự cách nhau 2 vị trí: '{cach_2}'")
print("\n=== TÁCH TỪ ===")
# Tách thành danh sách từ
cac_tu = van_ban.split()
print(f"Các từ: {cac_tu}")
print(f"Số từ: {len(cac_tu)}")
# Lấy từ đầu tiên và cuối cùng
tu_dau = cac_tu[0]
tu_cuoi = cac_tu[-1]
print(f"Từ đầu: '{tu_dau}', Từ cuối: '{tu_cuoi}'")
Bài Tập 5: Các Phương Thức Chuỗi Cơ Bản
Đề bài: Sử dụng các phương thức để xử lý chuỗi
# Giải pháp
def demo_chuoi_methods():
"""Demo các phương thức xử lý chuỗi"""
# Chuỗi mẫu
chuoi_goc = " Python Là Ngôn Ngữ Lập TrìNh Tuyệt Vời! "
print(f"Chuỗi gốc: '{chuoi_goc}'")
print("\n=== XỬ LÝ KHOẢNG TRẮNG ===")
# Xóa khoảng trắng
xoa_2_dau = chuoi_goc.strip()
xoa_dau = chuoi_goc.lstrip()
xoa_cuoi = chuoi_goc.rstrip()
print(f"Xóa 2 đầu: '{xoa_2_dau}'")
print(f"Xóa đầu: '{xoa_dau}'")
print(f"Xóa cuối: '{xoa_cuoi}'")
print("\n=== CHUYỂN ĐỔI CHỮ HOA/THƯỜNG ===")
chu_thuong = xoa_2_dau.lower()
chu_hoa = xoa_2_dau.upper()
chu_hoa_dau_tu = xoa_2_dau.title()
chu_hoa_dau_cau = xoa_2_dau.capitalize()
print(f"Chữ thường: '{chu_thuong}'")
print(f"Chữ hoa: '{chu_hoa}'")
print(f"Hoa đầu từ: '{chu_hoa_dau_tu}'")
print(f"Hoa đầu câu: '{chu_hoa_dau_cau}'")
print("\n=== KIỂM TRA CHUỖI ===")
print(f"Là chữ cái: {xoa_2_dau.isalpha()}")
print(f"Là chữ số: {xoa_2_dau.isdigit()}")
print(f"Là chữ cái + số: {xoa_2_dau.isalnum()}")
print(f"Chỉ chữ thường: {xoa_2_dau.islower()}")
print(f"Chỉ chữ hoa: {xoa_2_dau.isupper()}")
print(f"Bắt đầu bằng 'Python': {xoa_2_dau.startswith('Python')}")
print(f"Kết thúc bằng 'Vời!': {xoa_2_dau.endswith('Vời!')}")
print("\n=== TÌM KIẾM VÀ THAY THẾ ===")
# Tìm vị trí
vi_tri_python = xoa_2_dau.find('Python')
vi_tri_java = xoa_2_dau.find('Java') # Không tìm thấy = -1
print(f"Vị trí 'Python': {vi_tri_python}")
print(f"Vị trí 'Java': {vi_tri_java}")
# Đếm số lần xuất hiện
so_lan_n = xoa_2_dau.count('n')
so_lan_la = xoa_2_dau.lower().count('là')
print(f"Số lần xuất hiện 'n': {so_lan_n}")
print(f"Số lần xuất hiện 'là': {so_lan_la}")
# Thay thế
thay_the_1 = xoa_2_dau.replace('Python', 'Java')
thay_the_2 = xoa_2_dau.replace('Tuyệt Vời', 'Fantastic')
print(f"Thay Python thành Java: '{thay_the_1}'")
print(f"Thay Tuyệt Vời thành Fantastic: '{thay_the_2}'")
demo_chuoi_methods()
Bài Tập 6: Định Dạng Chuỗi (String Formatting)
Đề bài: Học cách định dạng chuỗi chuyên nghiệp
# Giải pháp
def demo_dinh_dang():
"""Demo c ác cách định dạng chuỗi"""
# Dữ liệu mẫu
ten = "Nguyễn Văn An"
tuoi = 25
diem_tb = 8.567
tien_luong = 15000000
ngay_sinh = "15/03/1998"
print("=== F-STRING (CÁCH TỐT NHẤT) ===")
# Cơ bản
gioi_thieu = f"Tôi tên {ten}, {tuoi} tuổi"
print(gioi_thieu)
# Làm tròn số
diem_lam_tron = f"Điểm TB: {diem_tb:.2f}"
print(diem_lam_tron)
# Định dạng tiền tệ
tien_dinh_dang = f"Lương: {tien_luong:,} VNĐ"
print(tien_dinh_dang)
# Căn lề
ten_can_trai = f"Tên: {ten:<20}|" # Căn trái, độ rộng 20
ten_can_phai = f"Tên: {ten:>20}|" # Căn phải
ten_can_giua = f"Tên: {ten:^20}|" # Căn giữa
print(ten_can_trai)
print(ten_can_phai)
print(ten_can_giua)
# Padding với ký tự
so_padding = f"Số: {42:0>5}" # Thêm số 0 ở đầu
chuoi_padding = f"Text: {ten:-^30}" # Thêm dấu - ở 2 bên
print(so_padding)
print(chuoi_padding)
print("\n=== FORMAT() METHOD ===")
# Cơ bản
template_1 = "Tên: {}, Tuổi: {}, Điểm: {:.1f}"
ket_qua_1 = template_1.format(ten, tuoi, diem_tb)
print(ket_qua_1)
# Với tên tham số
template_2 = "Tên: {name}, Tuổi: {age}, Điểm: {score:.2f}"
ket_qua_2 = template_2.format(name=ten, age=tuoi, score=diem_tb)
print(ket_qua_2)
# Với index
template_3 = "Tên: {0}, Tuổi: {1}, Tên lại: {0}"
ket_qua_3 = template_3.format(ten, tuoi)
print(ket_qua_3)
print("\n=== TEMPLATE STRINGS ===")
from string import Template
template = Template("Tôi là $name, $age tuổi, điểm TB $score")
ket_qua = template.substitute(name=ten, age=tuoi, score=diem_tb)
print(ket_qua)
print("\n=== BÀI TẬP THỰC TẾ: TẠO HÓA ĐƠN ===")
# Dữ liệu hóa đơn
san_pham = [
{"ten": "Laptop", "gia": 15000000, "so_luong": 1},
{"ten": "Chuột", "gia": 200000, "so_luong": 2},
{"ten": "Bàn phím", "gia": 800000, "so_luong": 1}
]
# Header hóa đơn
print("=" * 60)
print(f"{'HÓA ĐƠN BÁN HÀNG':^60}")
print("=" * 60)
print(f"{'Sản phẩm':<20} {'Giá':<12} {'SL':<4} {'Thành tiền':<15}")
print("-" * 60)
tong_tien = 0
for sp in san_pham:
thanh_tien = sp['gia'] * sp['so_luong']
tong_tien += thanh_tien
print(f"{sp['ten']:<20} {sp['gia']:>10,} đ {sp['so_luong']:>2} "
f"{thanh_tien:>12,} đ")
print("-" * 60)
print(f"{'TỔNG CỘNG:':<37} {tong_tien:>12,} đ")
print("=" * 60)
demo_dinh_dang()
Bài Tập 7: Xử Lý Chuỗi Nâng Cao
Đề bài: Các kỹ thuật xử lý chuỗi phức tạp
# Giải pháp
import re
from collections import Counter
def xu_ly_chuoi_nang_cao():
"""Các kỹ thuật xử lý chuỗi nâng cao"""
van_ban = """
Python là một ngôn ngữ lập trình bậc cao,
thông dịch, tương tác và hướng đối tượng.
Python được thiết kế với triết lý mã nguồn
rất dễ đọc và cú pháp cho phép lập trình viên
diễn đạt ý tưởng bằng ít dòng code hơn.
"""
print("=== VĂN BẢN GỐC ===")
print(van_ban.strip())
print("\n=== TIỀN XỬ LÝ ===")
# Làm sạch văn bản
van_ban_sach = re.sub(r'\s+', ' ', van_ban.strip()) # Gộp khoảng trắng
van_ban_sach = re.sub(r'[^\w\sàáảãạăắằẳẵặâấầẩẫậèéẻẽẹêếềểễệìíỉĩịòóỏõọôốồổỗộơớờởỡợùúủũụưứừửữựỳýỷỹỵđ]', '', van_ban_sach)
print(f"Sau khi làm sạch: {van_ban_sach}")
print("\n=== THỐNG KÊ TỪযখন ===")
# Tách từ
cac_tu = van_ban_sach.lower().split()
# Đếm từ
dem_tu = Counter(cac_tu)
print(f"Tổng số từ: {len(cac_tu)}")
print(f"Số từ unique: {len(dem_tu)}")
print("\n5 từ xuất hiện nhiều nhất:")
for tu, so_lan in dem_tu.most_common(5):
print(f" '{tu}': {so_lan} lần")
print("\n=== TÌM KIẾM PATTERN ===")
# Tìm từ có chứa "trình"
tu_chua_trinh = [tu for tu in cac_tu if 'trình' in tu]
print(f"Từ chứa 'trình': {tu_chua_trinh}")
# Tìm từ bắt đầu bằng "th"
tu_bat_dau_th = [tu for tu in cac_tu if tu.startswith('th')]
print(f"Từ bắt đầu 'th': {tu_bat_dau_th}")
# Tìm từ có độ dài > 5 ký tự
tu_dai = [tu for tu in cac_tu if len(tu) > 5]
print(f"Từ dài (>5 ký tự): {tu_dai}")
print("\n=== REGEX PATTERNS ===")
# Tìm email (giả định có email trong text)
email_pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
emails = re.findall(email_pattern, van_ban)
print(f"Emails tìm được: {emails}")
# Tìm số điện thoại (pattern Việt Nam)
phone_pattern = r'(0|\+84)[3|5|7|8|9][0-9]{8}'
phones = re.findall(phone_pattern, van_ban)
print(f"Số điện thoại: {phones}")
print("\n=== TẠO CHỈ MỤC TỪ ===")
# Tạo chỉ mục cho mỗi từ
chi_muc_tu = {}
for i, tu in enumerate(cac_tu):
if tu not in chi_muc_tu:
chi_muc_tu[tu] = []
chi_muc_tu[tu].append(i)
# Hiển thị chỉ mục của một số từ
tu_quan_trong = ['python', 'ngôn', 'lập', 'trình']
for tu in tu_quan_trong:
if tu in chi_muc_tu:
print(f"Từ '{tu}' xuất hiện ở vị trí: {chi_muc_tu[tu]}")
xu_ly_chuoi_nang_cao()