Bài 24

Xâu kí tự

Hiểu được xâu kí tự là kiểu dữ liệu cơ bản của Python, biết và thực hiện được lệnh for để xử lí xâu kí tự.

🚀

1. Khởi động (Engagement)

Em đã biết dữ liệu xâu kí tự (gọi tắt là xâu) từ Bài 16 và chúng ta có thể tạo các biến kiểu xâu kí tự theo nhiều cách như sau:

s = "Thời khoá biểu"
xau = 'Hoa học trò'
Cau_tho = """ Mình về mình có nhớ ta
Mười lăm năm ấy thiết tha mặn nông"""
Python Script

💡 Câu hỏi suy ngẫm: Liệu có lệnh nào trích ra từng kí tự của một xâu kí tự? Đếm số kí tự của một xâu?

Xâu kí tự là kiểu dữ liệu rất quan trọng trong Python, dùng để lưu trữ và xử lý văn bản, tên, thông điệp, và nhiều loại dữ liệu khác.

📖

2. Hình thành kiến thức (Knowledge)

1. Xâu là một dãy các kí tự

a) Cấu trúc của xâu kí tự

Một xâu kí tự được hiểu là một dãy các kí tự. Tương tự danh sách, ta có thể truy cập từng kí tự của xâu thông qua chỉ số, chỉ số bắt đầu từ 0.

Ví dụ:

s = "Thời khoá biểu"
len(s)      # 14 - độ dài của xâu
s[0]        # 'T' - kí tự đầu tiên
s[10]       # 'b' - kí tự tại chỉ số 10
Python Script

Lệnh len() sẽ tính độ dài của xâu hay số lượng các kí tự có trong xâu.

b) Sự khác nhau giữa xâu và danh sách

Điểm giống nhau:

  • Cả hai đều là dãy các phần tử
  • Đều có chỉ số bắt đầu từ 0
  • Đều có thể dùng len() để tính độ dài
  • Đều có thể duyệt bằng for

Điểm khác nhau quan trọng:

# Danh sách có thể thay đổi
d = ["a", "b", "c"]
d[0] = "A"  # OK

# Xâu không thể thay đổi từng kí tự
s = "abc"
s[0] = "A"  # TypeError: 'str' object does not support item assignment
Python Script

Python không cho phép thay đổi từng kí tự của một xâu. Điều này khác với danh sách.

2. Các đặc điểm quan trọng của xâu kí tự

a) Không có kiểu dữ liệu kí tự riêng

Python không có kiểu dữ liệu kí tự. Kí tự chính là xâu có độ dài 1.

ky_tu = 'A'      # Đây là xâu có độ dài 1
empty = ""        # Xâu rỗng có độ dài 0
Python Script

b) Xâu là dãy các kí tự Unicode

Xâu kí tự trong Python là dãy các kí tự Unicode, cho phép hiển thị nhiều ngôn ngữ khác nhau.

c) Xâu không thay đổi được (Immutable)

Xâu có thể được coi là danh sách các kí tự nhưng không thay đổi từng kí tự của xâu. Truy cập từng kí tự của xâu qua chỉ số, chỉ số từ 0 đến độ dài len() – 1.

3. Duyệt kí tự của xâu

Có hai cách duyệt kí tự của xâu kí tự bằng lệnh for: theo chỉ số và theo phần tử của xâu kí tự.

a) Duyệt theo chỉ số

s = "Thời khoá biểu"
for i in range(len(s)):
    print(s[i], end = "")
# Kết quả: T h ời k h o á b i ể u
Python Script

Biến i lần lượt chạy theo chỉ số của xâu kí tự s, từ 0 đến len(s) – 1. Kí tự tại chỉ số i là s[i].

b) Duyệt theo từng kí tự

s = "Thời khoá biểu"
for ch in s:
    print(ch, end = "")
# Kết quả: T h ời k h o á b i ể u
Python Script

Biến ch sẽ được gán lần lượt các kí tự của xâu s từ đầu đến cuối.

4. Toán tử in với xâu

Toán tử in dùng để kiểm tra một xâu con có nằm trong xâu khác không:

"a" in "abcd"        # True
"abc" in "abcd"      # True
"xyz" in "abcd"      # False
Python Script

s₁ in s₂ trả lại giá trị True nếu s₁ là xâu con của s₂.

🧩

3. Luyện tập (Practice)

Bài tập thực hành

Bài tập 1:

Các xâu kí tự sau có hợp lệ không? a) "123&*()+-ABC" b) "10101108&101001" c) "Tây Nguyên" d) 11111111 = 256

Bài tập 2:

Mỗi xâu hợp lệ ở Câu 1 có độ dài bằng bao nhiêu?

Bài tập 3:

Sau khi thực hiện các lệnh sau, biến skq sẽ có giá trị bao nhiêu?

s = "81723"
skq = ""
for ch in s:
    if int(ch) % 2 != 0:
        skq = skq + ch
Python Script

Bài tập 4:

Cho s1 = "abc", s2 = "ababcabca". Các biểu thức logic sau cho kết quả là đúng hay sai? a) s1 in s2 b) s1 + s1 in s2 c) "abcabca" in s2 d) "abc123" in s2

Thực hành tại máy:

Viết chương trình nhập số tự nhiên n là số học sinh, sau đó nhập họ và tên học sinh. Lưu họ và tên học sinh vào một danh sách. In danh sách ra màn hình, mỗi họ tên trên một dòng.

Chương trình mẫu:

n = int(input("Nhập số học sinh trong lớp: "))
ds_lop = []
for i in range(n):
    ho_ten = input("Nhập họ và tên học sinh thứ " + str(i+1) + ": ")
    ds_lop.append(ho_ten)

print("Danh sách học sinh:")
for ten in ds_lop:
    print(ten)
Python Script
🌟

4. Vận dụng (Application)

Bài tập vận dụng

Bài tập 1: Đếm kí tự đặc biệt

Viết chương trình nhập một xâu kí tự và đếm xem có bao nhiêu kí tự là chữ số, bao nhiêu kí tự là chữ cái, bao nhiêu kí tự là ký tự khác.

Gợi ý:

s = input("Nhập xâu kí tự: ")
chu_so = chu_cai = khac = 0

for ch in s:
    if ch.isdigit():
        chu_so += 1
    elif ch.isalpha():
        chu_cai += 1
    else:
        khac += 1

print("Chữ số:", chu_so)
print("Chữ cái:", chu_cai)
print("Khác:", khac)
Python Script

Bài tập 2: Đảo ngược xâu

Viết chương trình nhập một xâu và in ra xâu đảo ngược.

Gợi ý:

s = input("Nhập xâu: ")
dao_nguoc = ""
for ch in s:
    dao_nguoc = ch + dao_nguoc
print("Xâu đảo ngược:", dao_nguoc)
Python Script

Bài tập 3: Kiểm tra xâu đối xứng

Viết chương trình kiểm tra xem một xâu có đối xứng không (đọc từ trái sang phải hay từ phải sang trái đều như nhau).

Ví dụ: "radar", "level" là xâu đối xứng.

Gợi ý: So sánh xâu với xâu đảo ngược của nó.

Thảo luận:

  • Tại sao xâu trong Python lại không thể thay đổi từng kí tự?
  • Khi nào nên dùng duyệt theo chỉ số, khi nào nên dùng duyệt theo phần tử?
  • Lợi ích của việc xâu không thay đổi được là gì?

Ghi nhớ kiến thức 🎯

  • ✅ Xâu là dãy các kí tự Unicode, đặt trong '' hoặc "".
  • ✅ Chỉ số bắt đầu từ 0, truy cập bằng xau[chỉ_số].
  • ✅ len() tính độ dài xâu.
  • ✅ Xâu không thể thay đổi từng kí tự (immutable).
  • ✅ for...in duyệt từng kí tự của xâu.
  • ✅ toán tử in kiểm tra xâu con.

Chúc mừng bạn đã hoàn thành bài học này! 🏆