Giải Tin Học 10 trang 144
Lời giải chi tiết SGK Lớp 10 · Môn Tin Há»c · Trang 144–145
Tóm tắt lý thuyết: Một số lỗi ngoại lệ thường gặp
Khi gặp lỗi ngoại lệ, Python sẽ dừng chương trình và báo lỗi. Bảng dưới đây tổng hợp các mã lỗi hay gặp:
| Mã lỗi ngoại lệ | Ý nghĩa |
|---|---|
ZeroDivisionError | Chia một số cho 0 |
IndexError | Truy cập phần tử danh sách với chỉ số vượt quá giới hạn |
NameError | Gọi một tên (biến/hàm) chưa được định nghĩa |
TypeError | Lỗi kiểu dữ liệu (ví dụ chỉ số không là số nguyên, tính toán với toán hạng không phải số) |
ValueError | Lỗi giá trị (ví dụ int("1.55")) |
IndentationError | Lỗi thụt dòng không đúng |
SyntaxError | Lỗi cú pháp |
Vấn đề đặt ra là làm sao vừa phát hiện và xử lí lỗi mà chương trình vẫn không bị dừng lại.
Câu hỏi (Hoạt động 2): Nêu mã lỗi của mỗi lệnh
Đề: Hãy nêu mã lỗi ngoại lệ của mỗi lệnh sau nếu xảy ra lỗi.
a) A[1.5]
- Đáp án:
TypeError - Lí do: Chỉ số (index) của danh sách phải là số nguyên, nhưng
1.5là số thực nên không hợp lệ về kiểu dữ liệu.
b) int("abc")
- Đáp án:
ValueError - Lí do: Hàm
int()nhận được một xâu mà không thể chuyển thành số nguyên. Đây là lỗi liên quan đến giá trị của đối số.
*c) "10"3.5**
- Đáp án:
TypeError - Lí do: Python cho phép nhân xâu với số nguyên (lặp xâu), nhưng
3.5là số thực. "Can't multiply sequence by non-int" → lỗi kiểu dữ liệu.
d) 12 + x(10)
- Đáp án:
NameError - Lí do:
xchưa được định nghĩa nên Python không tìm thấy tên này.
Thực hành
Nhiệm vụ 1: Tính tổng, hiệu, thương của hai số nhập từ bàn phím
Chương trình mẫu:
s = input("Nhập hai số m, n cách nhau bởi dấu cách: ")
sline = s.split()
m, n = int(sline[0]), int(sline[1])
print("Tổng, hiệu, thương 2 số đã nhập là:", m+n, m-n, m/n)
Các khả năng sinh lỗi:
- m, n nhập vào không là số nguyên →
ValueError(khi gọiint()). - Giữa hai số không có dấu cách → khi đó
split()chỉ tách được 1 phần tử,sline[1]không tồn tại →IndexError. - n nhập vào là 0 →
m/nchia cho 0 →ZeroDivisionError.
Nhiệm vụ 2: Nhập n số nguyên vào danh sách A rồi in ra
Chương trình mẫu:
n = int(input("Nhập số tự nhiên n: "))
A = []
for k in range(n):
num = int(input("Nhập số thứ " + str(k+1) + " : "))
A.append(num)
print("Dãy đã nhập:", A)
Các khả năng sinh lỗi:
- Số n nhập vào không là số nguyên →
ValueError. - Mỗi số hạng của danh sách nhập vào không là số nguyên →
ValueError.
Luyện tập
Bài 1: Các lệnh sau có sinh lỗi không? Nếu có thì mã lỗi là gì?
Đoạn lệnh thứ nhất:
>>> A = [1, 3, 5, 10, 0]
>>> for k in range(1, len(A)+1):
print(A[k])
- Có sinh lỗi. Mã lỗi:
IndexError. - Lí do:
len(A) = 5, nênrange(1, 6)cho k chạy từ 1 đến 5. Khi k = 5, lệnhA[5]truy cập phần tử thứ 6 trong khi danh sách chỉ có chỉ số từ 0 đến 4 → vượt quá giới hạn.
Đoạn lệnh thứ hai:
>>> s1, s2 = "101010", 1010101
>>> s = s1 + s2
- Có sinh lỗi. Mã lỗi:
TypeError. - Lí do:
s1là xâu kí tự, còns2là số nguyên. Python không cho phép cộng (nối) một xâu với một số → lỗi kiểu dữ liệu.
Bài 2: Lệnh tính giá trị trung bình có sinh lỗi không?
Đề:
gttb = sum(A)/len(A)
Lệnh này có thể sinh lỗi ngoại lệ. Các trường hợp:
- A là danh sách rỗng →
len(A) = 0→ chia cho 0 →ZeroDivisionError. - A chứa phần tử không phải là số (ví dụ xâu) →
sum(A)không cộng được →TypeError. - A chưa được định nghĩa trước đó →
NameError.
Vận dụng
Bài 1: Tìm các ước số thực sự của n (kể cả 1, không kể n)
Đề: Nhập số tự nhiên n, đưa ra danh sách các ước số thực sự của n (tính cả 1, không tính n). Kiểm tra các khả năng sinh lỗi.
Chương trình tham khảo:
n = int(input("Nhập số tự nhiên n: "))
uoc = []
for k in range(1, n): # xét từ 1 đến n-1 (không kể n)
if n % k == 0:
uoc.append(k)
print("Các ước số thực sự của", n, "là:", uoc)
Giải thích:
- Vòng lặp xét các số từ 1 đến n−1, số nào chia hết cho n thì là ước thực sự.
- Với n = 12, kết quả:
[1, 2, 3, 4, 6].
Các khả năng sinh lỗi:
- Nhập n không phải số nguyên (ví dụ
12.5hoặcabc) →ValueErrortại lệnhint(). - Nếu nhập số âm hoặc 0 thì không lỗi ngoại lệ, nhưng kết quả là danh sách rỗng (logic). Để chặt chẽ nên kiểm tra n ≥ 1.
Bài 2: Viết chương trình nhỏ để khi chạy sẽ sinh mã lỗi NameError
NameError xảy ra khi dùng một tên chưa được định nghĩa. Ví dụ:
print(x + 5)
Giải thích: Biến x chưa được gán giá trị nào trước đó, nên khi Python tìm x sẽ không thấy → sinh NameError.
Hoặc gọi một hàm chưa định nghĩa:
print(tinh_tong(3, 4))
Hàm tinh_tong chưa được khai báo nên cũng sinh NameError.
Vậy là mình đã giải xong toàn bộ phần lý thuyết, câu hỏi, thực hành, luyện tập và vận dụng của hai trang. Phần quan trọng nhất em cần nhớ là phân biệt được khi nào sinh ValueError, TypeError, IndexError và ZeroDivisionError nhé.
