for ch in s lấy từng kí tự
Với `s = "81723"`, vòng `for ch in s` lần lượt nhận các xâu một kí tự `"8"`, `"1"`, `"7"`, `"2"`, `"3"`. Để giữ các **chữ số lẻ**, đổi từng ch sang số bằng `int(ch)`, kiểm số dư rồi nối lại thành xâu mới:
```python
s = "81723"
ket_qua = ""
for ch in s:
if int(ch) % 2 == 1:
ket_qua = ket_qua + ch
print(ket_qua)
```
Kết quả là `173`. Mã này chỉ dành cho xâu **toàn chữ số**; nếu gặp chữ cái, `int(ch)` báo `ValueError`. Với s rỗng, vòng không chạy và in xâu rỗng.
Bài luyện
Mã lọc chữ số lẻ trong bài in gì với `s = "81723"`?
Các chữ số chẵn bị bỏ.
8 và 2 là chẵn, không giữ.
1,7,3 là lẻ và được nối theo thứ tự.
ket_qua khởi đầu là xâu nên kết quả vẫn là xâu.
Lời giải
Duyệt từng kí tự, 1, 7, 3 có số dư chia 2 bằng 1. Chúng được nối vào xâu `ket_qua` thành `"173"`.
in kiểm một xâu con liên tiếp
`"10" in "A10B"` là `True` vì hai kí tự 1 rồi 0 đứng liền nhau. `"10" in "A1B0"` là `False` vì không có đoạn `"10"` liên tiếp. Tìm xâu con không cần tự kiểm từng cặp chỉ số khi chỉ hỏi có hay không:
```python
s = "A10B"
if "10" in s:
print("Có mẫu")
else:
print("Không có mẫu")
```
Mã in `Có mẫu`. Nếu s là `"10"` thì cũng có mẫu ở ngay đầu; nếu s rỗng thì không có `"10"`. Đây là phép kiểm xâu con đúng chữ hoa/thường và đúng thứ tự.
Bài luyện
Biểu thức `"10" in "A1B0"` có giá trị gì?
Xâu con phải liên tiếp.
Không có đoạn hai kí tự 1 rồi 0 đứng sát nhau.
Toán tử in trả bool.
in dùng được với xâu.
Lời giải
Trong `"A1B0"`, giữa 1 và 0 có B. Không có xâu con liên tiếp `"10"`, nên kết quả là `False`.
Bài luyện
Với `s = "A10B"`, mã kiểm xâu con trong bài in gì?
Đoạn 10 nằm liền nhau trong s.
Nhánh else không chạy.
Mã in nhãn, không in trực tiếp giá trị bool.
Mã không in nguyên s.
Lời giải
`"10" in s` đúng vì s có hai kí tự 1,0 liên tiếp. Nhánh if in `Có mẫu`.
Đang học