Vị trí đầu tiên có thể là 0
`s.find(mau)` trả chỉ số bắt đầu của lần xuất hiện đầu tiên, hoặc `-1` nếu không thấy. Với `s = "ababa"`, `s.find("ab")` bằng 0; đây là **đã tìm thấy** ở đầu xâu. `s.find("ba")` bằng 1; `s.find("xy")` bằng -1. Không viết `if s.find(mau):` để kiểm có mẫu vì 0 được Python coi là sai, còn -1 lại được coi là đúng. Nếu chỉ cần biết có hay không, dùng `mau in s`; nếu cần vị trí, kiểm `s.find(mau) != -1`.
Bài luyện
Với `s = "ababa"`, `s.find("ab")` trả gì?
Mẫu có ở đầu.
Lần đầu ab bắt đầu tại chỉ số 0.
Chỉ số 1 là chữ b.
Có ab tại 2 nhưng không phải lần đầu.
Lời giải
`"ab"` xuất hiện ngay hai kí tự đầu của s, nên vị trí đầu tiên là 0, không phải -1.
Bài luyện
Vì sao `if s.find("ab"):` không phải cách kiểm mẫu đáng tin trong Python?
find hợp lệ với str.
Tìm ở đầu trả 0; trong if, 0 bị coi là sai.
find là phương thức xâu.
find trả chỉ số hoặc -1, đều là số nguyên.
Lời giải
Nếu mẫu ở đầu, `find` trả 0, mà `if 0` không vào nhánh đúng. Kiểm `find(...) != -1` hoặc dùng `"ab" in s`.
Tìm tiếp từ một vị trí
Dạng `s.find(mau, start)` chỉ tìm từ chỉ số `start` trở đi nhưng vẫn trả **chỉ số trong xâu gốc**. Với `s = "ababa"`, `s.find("ab", 1)` bằng 2: lần ở vị trí 0 bị bỏ qua, lần kế ở vị trí 2 được tìm thấy. `s.find("ab", 3)` bằng -1 vì từ vị trí 3 không còn đủ đoạn `"ab"`. Nếu cần mọi vị trí, sau khi tìm thấy ở i có thể tiếp tục từ i + 1; nhớ luôn có điểm dừng khi kết quả là -1.
Bài luyện
Với `s = "ababa"`, `s.find("ab", 1)` trả gì?
Tìm từ 1 nên bỏ lần ở 0.
Chỉ số trả về là trong xâu gốc, không tính lại từ start.
Lần tiếp theo bắt đầu ở chỉ số 2.
Vẫn còn một lần xuất hiện.
Lời giải
Bỏ qua đoạn ở chỉ số 0, Python tìm `"ab"` tiếp theo ở chỉ số 2 của xâu gốc, nên trả 2.
Bài luyện
Nếu `s.find("xy")` trả `-1`, kết luận nào đúng?
Chỉ số cuối không được ký hiệu bằng -1 trong kết quả find.
Ở đầu sẽ trả 0.
-1 là giá trị báo không thấy mẫu.
Xâu mẹ có thể không rỗng nhưng thiếu mẫu.
Lời giải
`find` trả -1 khi không có xâu con cần tìm trong phạm vi xét. Nó không cho biết xâu mẹ có rỗng hay không.
Đang học