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
ZeroDivisionErrorChia một số cho 0
IndexErrorTruy cập phần tử danh sách với chỉ số vượt quá giới hạn
NameErrorGọi một tên (biến/hàm) chưa được định nghĩa
TypeErrorLỗ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ố)
ValueErrorLỗi giá trị (ví dụ int("1.55"))
IndentationErrorLỗi thụt dòng không đúng
SyntaxErrorLỗ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.5 là 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.5 là 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: x chư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ọi int()).
  • 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/n chia 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ên range(1, 6) cho k chạy từ 1 đến 5. Khi k = 5, lệnh A[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: s1 là xâu kí tự, còn s2 là 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.5 hoặc abc) → ValueError tại lệnh int().
  • 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, IndexErrorZeroDivisionError nhé.

Chế độ đọc sách →