Bài 24: Xâu kí tự – Tin học 10 | Lý thuyết, Sơ đồ tư duy

I. Lý thuyết trọng tâm

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

a) Khái niệm và cách tạo xâu

Xâu kí tự (string, gọi tắt là xâu) là một dãy các kí tự Unicode. Trong Python, xâu được tạo bằng cặp dấu nháy đơn '...', nháy kép "...", hoặc ba dấu nháy """...""" (cho xâu nhiều dòng).

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"""

Xâu rỗng (không chứa kí tự nào): empty = ""

Python không có kiểu dữ liệu kí tự riêng — một kí tự đơn lẻ chính là xâu có độ dài 1.

b) Truy cập kí tự qua chỉ số

Tương tự danh sách, mỗi kí tự trong xâu được đánh chỉ số bắt đầu từ 0. Truy cập bằng s[i], chỉ số hợp lệ từ 0 đến len(s) - 1.

>>> s = "Thời khoá biểu"
>>> len(s)        # đếm số kí tự (kể cả dấu cách)
14
>>> s[0]
'T'
>>> s[10]
'b'
Chỉ số 0 1 2 3 4 5 6 7 8 9 10 11 12 13
Kí tự T h i k h o á b i u

c) Khác biệt quan trọng giữa xâu và danh sách

Đặc điểm Danh sách (list) Xâu kí tự (string)
Thay đổi phần tử d[0] = "A" — được s[0] = "A"lỗi TypeError
Truy cập qua chỉ số
Dùng len()
Phần tử Đa kiểu (số, xâu, logic…) Chỉ là kí tự
>>> d = ["a", "b", "c"]
>>> d[0] = "A"          # danh sách: cho phép thay đổi
>>> s = "abc"
>>> s[0] = "A"          # xâu: BÁO LỖI
TypeError: 'str' object does not support item assignment

Ghi nhớ: Xâu có thể coi là danh sách các kí tự nhưng không được phép thay đổi từng kí tự.

Câu hỏi kiểm tra nhanh: Các xâu kí tự sau có hợp lệ không? Nếu hợp lệ, độ dài bằng bao nhiêu?

Biểu thức Hợp lệ? Độ dài Giải thích
"123&*()+-ABC" 13 Xâu chứa số, kí tự đặc biệt, chữ cái — đều là kí tự Unicode hợp lệ
"1010110&0101001" 15 Xâu gồm chữ số và kí tự &
"Tây Nguyên" 10 Xâu tiếng Việt có dấu, kể cả dấu cách
11111111 = 256 Không có dấu nháy bao quanh → đây là lệnh gán biến số, không phải xâu

2. Lệnh duyệt kí tự của xâu

a) Hai cách duyệt bằng for

Cách 1 – Duyệt theo chỉ số (dùng range()):

s = "Thời khoá biểu"
for i in range(len(s)):
    print(s[i], end=" ")

Biến i chạy từ 0 đến len(s) - 1, truy cập kí tự qua s[i]. Dùng khi cần biết vị trí kí tự.

Cách 2 – Duyệt trực tiếp theo kí tự (dùng for...in):

for ch in s:
    print(ch, end=" ")

Biến ch lần lượt nhận trực tiếp giá trị từng kí tự trong xâu. Dùng khi chỉ cần đọc giá trị, không cần chỉ số.

b) Toán tử in với xâu — kiểm tra xâu con

Ngoài việc dùng trong vòng for, toán tử in còn kiểm tra xâu con:

>>> "a" in "abcd"
True         # "a" là xâu con của "abcd"
>>> "abc" in "abcd"
True         # "abc" là xâu con của "abcd"

Cú pháp: s1 in s2 → trả về True nếu s1 là xâu con (xuất hiện liên tiếp) trong s2, False nếu không.

c) Phép ghép xâu

Dùng toán tử + để nối hai xâu lại với nhau:

>>> "abc" + "def"
'abcdef'
>>> skq = ""
>>> skq = skq + "A"    # ghép thêm kí tự vào xâu kết quả
>>> skq
'A'

Câu hỏi kiểm tra nhanh: Sau khi thực hiện các lệnh sau, biến skq có giá trị bao nhiêu?

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

→ Duyệt từng kí tự trong "81723", chuyển sang số nguyên bằng int(ch), kiểm tra nếu là số lẻ thì ghép vào skq:

  • '8' → 8 chẵn → bỏ
  • '1' → 1 lẻ → skq = "1"
  • '7' → 7 lẻ → skq = "17"
  • '2' → 2 chẵn → bỏ
  • '3' → 3 lẻ → skq = "173"

skq = "173"

Câu hỏi kiểm tra nhanh: Cho s1 = "abc", s2 = "ababcabca". Các biểu thức sau đúng hay sai?

Biểu thức Kết quả Giải thích
s1 in s2 True "abc" xuất hiện trong "ababcabca" (tại vị trí 2)
s1 + s1 in s2 True s1 + s1 = "abcabc", kiểm tra "abcabc" in "ababcabca""abcabc" xuất hiện tại vị trí 2
"abcabca" in s2 True "abcabca" xuất hiện tại vị trí 2 trong "ababcabca"
"abc123" in s2 False "abc123" không có trong s2 (s2 không chứa chữ số)

II. Phương pháp giải các dạng bài tập

Dạng 1: Duyệt xâu và lọc kí tự theo điều kiện

Phương pháp:

  • Duyệt từng kí tự bằng for ch in s (hoặc for i in range(len(s))).
  • Kiểm tra điều kiện trên từng kí tự. Nếu thỏa → ghép vào xâu kết quả bằng phép +.
  • Khởi tạo xâu kết quả rỗng skq = "" trước vòng lặp.

Các điều kiện thường gặp:

Kiểm tra Điều kiện Python
Kí tự là chữ số ch.isdigit() hoặc "0" <= ch <= "9"
Chữ số lẻ int(ch) % 2 != 0 (với ch là kí tự chữ số)
Chữ số chẵn int(ch) % 2 == 0
Kí tự là chữ cái ch.isalpha()

Bài tập mẫu (SGK – Câu hỏi mục 2, câu 1): Cho s = "81723", skq = "". Sau vòng lặp lọc kí tự lẻ, skq = ?

Lời giải:

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

Mô phỏng: 8 (chẵn, bỏ) → 1 (lẻ, ghép) → 7 (lẻ, ghép) → 2 (chẵn, bỏ) → 3 (lẻ, ghép) → skq = "173".

Dạng 2: Kiểm tra xâu con bằng toán tử in

Phương pháp:

hai cách kiểm tra xâu s1 có nằm trong xâu s2 không:

Cách 1 – Dùng toán tử in (ngắn gọn):

if s1 in s2:
    print("Có chứa")
else:
    print("Không chứa")

Cách 2 – Duyệt theo chỉ số (kiểm tra từng vị trí):

for i in range(len(s2) - len(s1) + 1):
    if s2[i] == s1[0] and s2[i+1] == s1[1] ...:  # so sánh từng kí tự

Cách 2 phù hợp khi cần biết vị trí xuất hiện hoặc đề bài yêu cầu duyệt bằng chỉ số.

Bài tập mẫu (SGK – Thực hành, Nhiệm vụ 2): Nhập xâu S, kiểm tra xem S có chứa xâu con "10" không.

Lời giải – Cách 1 (duyệt chỉ số):

S = input("Nhập xâu kí tự bất kì: ")
kq = False
for i in range(len(S) - 1):
    if S[i] == "1" and S[i+1] == "0":
        kq = True
        break
if kq:
    print("Xâu gốc có chứa xâu '10'")
else:
    print("Xâu gốc không chứa xâu '10'")

Lời giải – Cách 2 (toán tử in):

S = input("Nhập xâu kí tự bất kì: ")
s10 = "10"
if s10 in S:
    print("Xâu gốc có chứa xâu '10'")
else:
    print("Xâu gốc không chứa xâu '10'")

Dạng 3: Trích xâu con từ xâu gốc

Phương pháp:

Vì không thể thay đổi trực tiếp xâu gốc, ta tạo xâu mới bằng cách duyệt và ghép kí tự:

  • Trích n kí tự đầu: duyệt for i in range(n), ghép s[i].
  • Trích từ vị trí a đến b: duyệt for i in range(a, b+1), ghép s[i].
  • Hoặc nhanh hơn, dùng cắt xâu (slicing): s[a:b] lấy từ chỉ số a đến b-1.

Bài tập mẫu (SGK – Luyện tập, bài 1): Cho xâu S, viết đoạn lệnh trích ra xâu con gồm ba kí tự đầu tiên của S.

Lời giải:

S = "Tin hoc 10"
xau_con = ""
for i in range(3):
    xau_con = xau_con + S[i]
print(xau_con)
# Kết quả: "Tin"

Cách ngắn gọn hơn: xau_con = S[0] + S[1] + S[2]

Dạng 4: Kiểm tra xâu có chứa kí tự thỏa điều kiện không

Phương pháp:

  • Khởi tạo biến cờ (flag) found = False.
  • Duyệt từng kí tự, nếu thỏa điều kiện → đặt found = True, có thể break để dừng sớm.
  • Sau vòng lặp, kiểm tra biến cờ để thông báo kết quả.

Bài tập mẫu (SGK – Luyện tập, bài 2): Viết chương trình kiểm tra xâu S có chứa chữ số không.

Lời giải:

S = input("Nhập xâu S: ")
found = False
for ch in S:
    if "0" <= ch <= "9":
        found = True
        break
if found:
    print("S có chứa chữ số")
else:
    print("S không chứa chữ số nào")

Giải thích: Duyệt từng kí tự ch trong S, kiểm tra nếu ch nằm trong khoảng "0" đến "9" (so sánh xâu theo mã Unicode) thì đó là chữ số. Tìm thấy một chữ số là đủ kết luận, dùng break dừng ngay.

III. Hướng dẫn thực hành

Nhiệm vụ 1: Nhập và in danh sách họ tên học sinh

Đề bài: Nhập số n (số học sinh), nhập họ tên từng học sinh, lưu vào danh sách và in ra mỗi tên trên một dòng.

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

Giải thích: Tạo list rỗng ds_lop, nhập từng tên (kiểu xâu kí tự) bằng input() rồi thêm vào danh sách bằng append(). In ra bằng vòng for duyệt chỉ số.

Nhiệm vụ 2: Kiểm tra xâu có chứa xâu con “10”

Đề bài: Nhập xâu S, kiểm tra xem S có chứa xâu con "10" không.

Cách 1 – Duyệt theo chỉ số:

S = input("Nhập xâu kí tự bất kì: ")
kq = False
for i in range(len(S) - 1):
    if S[i] == "1" and S[i+1] == "0":
        kq = True
        break
if kq:
    print("Xâu gốc có chứa xâu '10'")
else:
    print("Xâu gốc không chứa xâu '10'")

Giải thích: Duyệt từ chỉ số 0 đến len(S) - 2 (vì cần kiểm tra S[i+1]). Tại mỗi vị trí, nếu S[i] = “1” và S[i+1] = “0” thì tìm thấy xâu con “10”.

Cách 2 – Dùng toán tử in:

S = input("Nhập xâu kí tự bất kì: ")
s10 = "10"
if s10 in S:
    print("Xâu gốc có chứa xâu '10'")
else:
    print("Xâu gốc không chứa xâu '10'")

Giải thích: Toán tử in kiểm tra trực tiếp xâu "10" có là xâu con của S không — cách viết ngắn gọn và dễ đọc hơn.

IV. Sơ đồ tư duy

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

  • 1.1. Tạo xâu: dấu nháy đơn '...', nháy kép "...", ba nháy """..."""
  • 1.2. Xâu rỗng: empty = ""; kí tự = xâu có độ dài 1
  • 1.3. Truy cập qua chỉ số: s[i], chỉ số từ 0 đến len(s) - 1
  • 1.4. Không thể thay đổi từng kí tự (khác với list)
  • 1.5. Đo độ dài: len(s)

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

  • 2.1. Cách 1 – theo chỉ số: for i in range(len(s)): → truy cập s[i]
  • 2.2. Cách 2 – theo giá trị: for ch in s:ch là từng kí tự
  • 2.3. Toán tử in kiểm tra xâu con: s1 in s2 → True/False
  • 2.4. Ghép xâu: s1 + s2

3. Kĩ thuật xử lí xâu

  • 3.1. Lọc kí tự: duyệt + điều kiện + ghép vào xâu kết quả
  • 3.2. Kiểm tra xâu con: dùng in hoặc duyệt chỉ số
  • 3.3. Trích xâu con: duyệt + ghép kí tự từ vị trí a đến b
  • 3.4. Kiểm tra chứa chữ số: "0" <= ch <= "9"

V. Sai lầm thường gặp

Sai lầm Đính chính
Thay đổi kí tự bằng s[0] = "A" Lỗi TypeError. Xâu trong Python là bất biến (immutable), không thể gán lại từng kí tự. Nếu muốn thay đổi, phải tạo xâu mới bằng cách ghép: s = "A" + s[1:].
1 in ["0", "1", "01"] trả về True False. Số nguyên 1 khác xâu "1". Toán tử in so sánh chính xác cả kiểu dữ liệu.
len("Tây Nguyên") = 9 (không đếm dấu cách) = 10. Hàm len() đếm tất cả kí tự, kể cả dấu cách. Dấu cách cũng là một kí tự.
for ch in s cho biến ch nhận giá trị chỉ số 0, 1, 2… Sai. Biến ch nhận trực tiếp giá trị kí tự (ví dụ ‘T’, ‘h’, ‘ờ’…), không phải chỉ số. Muốn lấy chỉ số phải dùng for i in range(len(s)).
"abc" in "xyzabc" kiểm tra từng kí tự ‘a’, ‘b’, ‘c’ có mặt riêng lẻ Sai. Toán tử in với xâu kiểm tra xâu con liên tiếp, tức "abc" phải xuất hiện liền nhau theo đúng thứ tự trong xâu kia.
Ghép xâu bằng skq = skq + 5 (ghép số vào xâu) Lỗi TypeError. Không thể ghép trực tiếp số với xâu. Phải chuyển đổi: skq = skq + str(5) hoặc nếu kí tự đã là xâu thì skq = skq + ch.
Thầy Phạm Thành Danh

Thầy Phạm Thành Danh

(Người kiểm duyệt, ra đề)

Chức vụ: Trưởng ban biên soạn môn Tin Học THPT

Trình độ: Cử nhân Sư phạm Tin học, Chứng chỉ hạng II, Chứng chỉ Tin học, Ngoại ngữ B1

Kinh nghiệm: 8+ năm kinh nghiệm tại Trường THPT Thuận Hóa