Nhiệm vụ và quy ước
Tiếp tục dùng dãy điểm giả `[8.0, 7.0, 9.0]`. Người dùng gọi đầu điểm **thứ nhất, thứ hai, thứ ba**, còn Python lưu ở chỉ số **0, 1, 2**. Vì vậy, đầu điểm thứ `n` nằm ở `diem[n - 1]` **chỉ khi** `1 <= n <= len(diem)`. Dữ liệu thử: nhập 2 phải được `7.0`; nhập 0 hoặc 4 phải được báo sai, không đọc phần tử.
Kiểm rồi mới đổi chỉ số
```python
def tra_diem(diem, so_thu_tu):
if not 1 <= so_thu_tu <= len(diem):
return None
return diem[so_thu_tu - 1]
diem = [8.0, 7.0, 9.0]
for n in [2, 0, 4]:
print(n, tra_diem(diem, n))
```
Lưu vào `tra_diem.py` rồi chạy: ba dòng kết quả là `2 7.0`, `0 None`, `4 None`. `None` ở đây là dấu hiệu không có đầu điểm hợp lệ, **không phải điểm số 0**. Với danh sách điểm có thể chứa 0, việc kiểm `ket_qua is None` giúp phân biệt rõ hai trường hợp. Không dùng `diem[-1]` cho số thứ tự 0, vì Python sẽ trả **điểm cuối**, trái quy ước của người dùng.
Hỏi lại đến khi có số thứ tự hợp lệ
Đặt đoạn này sau định nghĩa `tra_diem` và `diem` trong cùng tệp:
```python
while True:
try:
n = int(input("Đầu điểm thứ mấy? "))
except ValueError:
print("Cần nhập số nguyên.")
continue
ket_qua = tra_diem(diem, n)
if ket_qua is None:
print("Số thứ tự phải từ 1 đến", len(diem))
continue
print("Điểm:", ket_qua)
break
```
Thử nhập `0`, `4`, `hai` rồi `2`: ba lượt đầu được yêu cầu nhập lại, lượt cuối in `Điểm: 7.0`. Nếu một điểm hợp lệ bằng 0, điều kiện `is None` vẫn không nhầm điểm ấy với số thứ tự sai.
Bài luyện
Với `diem=[8.0,7.0,9.0]`, đầu điểm thứ ba được đọc bằng biểu thức nào?
Chỉ số 3 vượt quá dãy ba phần tử.
Thứ ba ứng với chỉ số 3−1=2.
Chỉ số 1 là đầu điểm thứ hai.
Chỉ số âm -3 trỏ đầu điểm thứ nhất.
Lời giải
Số thứ tự bắt đầu từ 1, chỉ số Python bắt đầu từ 0. Do đó đầu điểm thứ ba là diem[2], giá trị 9.0.
Bài luyện
Nếu người dùng nhập số thứ tự 0, vì sao không lấy ngay `diem[0-1]`?
Chỉ số âm có nghĩa riêng trong Python, nên phải kiểm quy ước trước.
Danh sách không rỗng có thể đọc bằng chỉ số -1.
Đọc phần tử không xóa nó.
Python không tự đổi số thứ tự của người dùng.
Lời giải
Quy ước cho số thứ tự bắt đầu từ 1. Nhập 0 phải bị từ chối; nếu tính 0−1, Python lại cho điểm cuối.
Bài luyện
Hàm trả `None` khi số thứ tự sai. Cách kiểm nào phân biệt được `None` với điểm hợp lệ bằng 0?
Điểm 0 hợp lệ, không phải dấu hiệu lỗi.
`None` là dấu hiệu riêng cho lượt tra sai.
None không so sánh nhỏ hơn số được.
None không có độ dài.
Lời giải
Nếu tra đúng một đầu điểm 0, kết quả là số 0. Chỉ `ket_qua is None` cho biết số thứ tự ngoài khoảng.
Đang học