Chọn đến phần học sinh cần nhanh chóng thông qua mục lục bằng cách click đến phần đó
- I. Lý thuyết trọng tâm
- 1. Xâu là một dãy các kí tự
- 2. Lệnh duyệt kí tự của xâu
- 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
- Dạng 2: Kiểm tra xâu con bằng toán tử in
- Dạng 3: Trích xâu con từ xâu gốc
- Dạng 4: Kiểm tra xâu có chứa kí tự thỏa điều kiện không
- 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
- Nhiệm vụ 2: Kiểm tra xâu có chứa xâu con "10"
- IV. Sơ đồ tư duy
- V. Sai lầm thường gặp
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ặcfor 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:
Có 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
nkí tự đầu: duyệtfor i in range(n), ghéps[i]. - Trích từ vị trí
ađếnb: duyệtfor i in range(a, b+1), ghéps[i]. - Hoặc nhanh hơn, dùng cắt xâu (slicing):
s[a:b]lấy từ chỉ sốađếnb-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 đếnlen(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ậps[i] - 2.2. Cách 2 – theo giá trị:
for ch in s:→chlà từng kí tự - 2.3. Toán tử
inkiể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
inhoặ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
(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
