Các vị trí đầu, giữa, cuối
Dùng một **tên giả định**, không nhập danh sách lớp thật. Với `"Lê An Bình"`, `split()` cho `['Lê','An','Bình']`: phần tử đầu là họ, cuối là tên, lát cắt `[1:-1]` là phần đệm. `" ".join(...)` ghép phần đệm lại bằng một dấu cách. Với hai từ, phần đệm rỗng. Với xâu rỗng hoặc chỉ một từ, chưa đủ dữ liệu để tách họ và tên theo quy ước của bài, cần báo rõ thay vì truy cập list rỗng.
Nhiệm vụ: lưu `tach-ten-gia-dinh.py`, chạy ba mẫu giả định và so kết quả:
```python
def tach(s):
tu = s.split()
if len(tu) < 2:
return None
ho = tu[0]
dem = " ".join(tu[1:-1])
ten = tu[-1]
return ho, dem, ten
for s in ["Lê An Bình", "Lê Bình", " "]:
print(tach(s))
```
Kết quả là `('Lê','An','Bình')`, `('Lê','','Bình')`, `None` (màn hình Python thêm dấu cách sau dấu phẩy trong tuple). Nếu mẫu đầu sai, in `tu` rồi kiểm chỉ số 0, -1 và lát cắt; không suy từ quy tắc này rằng mọi cấu trúc tên người đều giống nhau.
Bài luyện
Với `"Lê An Bình"`, `tu[1:-1]` là gì?
Họ ở chỉ số 0.
Lát cắt lấy từ vị trí 1 đến trước phần tử cuối.
Tên là phần tử cuối.
Có một từ ở giữa.
Lời giải
`split()` cho Lê, An, Bình. Lát cắt từ chỉ số 1 đến trước -1 chỉ chứa `"An"`.
Bài luyện
Với `"Lê Bình"`, hàm trả phần đệm nào?
Đây là họ.
Đây là tên.
Không có từ ở giữa, join list rỗng được xâu rỗng.
Hàm vẫn có đủ hai từ.
Lời giải
List chỉ có hai từ, `tu[1:-1]` rỗng; `" ".join([])` là xâu rỗng, nên đệm bằng `""`.
Bài luyện
Vì sao hàm kiểm `len(tu) < 2` trước khi đọc `tu[0]` và `tu[-1]`?
Mã không đổi chữ hoa.
Dữ liệu thiếu hai từ không đủ cho họ và tên; list rỗng còn gây IndexError.
Mã không sắp xếp.
Dấu phẩy không liên quan.
Lời giải
Nếu không có từ, truy cập chỉ số gây `IndexError`; nếu chỉ một từ, không đủ hai thành phần họ và tên. Hàm trả `None` cho cả hai trường hợp.
Đang học