Nguyễn Đức Tình Về cơ bản, các lỗi trong lập trình sẽ được chia ra làm 3 loại: Các lỗi cú pháp (Syntax Error): Lỗi xảy ra khi soạn thảo hoặc sử dụng không đúng các chức năng đã được thiết kế của ngôn ngữ lập trình, dẫn tới trình dịch không hiểu hoặc phát hiện các vấn đề không hợp lệ. Khi đó thông báo lỗi được phát ra. Đây là lỗi dễ thấy, dễ sửa. Trong Python, các lỗi được thông báo rất tường minh, rõ ràng và chính xác. Đối với các bạn học sinh phổ thông, ít có điều kiện thực hành nên việc mắc lỗi cú pháp thường do nguyên nhân gõ sai chính tả. Các ngoại lệ (Exception): đây là các lỗi xảy ra sau khi trình dịch chấp thuận và thực thi chương trình, tuy nhiên chương trình bị rơi vào trường hợp mà người lập trình đã không lường trước, dẫn đến ngoại lệ được thông báo và dừng thực thi chương trình. Ví dụ khi vô tình chia cho số 0 (ZeroDivisionError). Đây là lỗi cũng dễ phát hiện và sửa chữa. Các lỗi logic: Đây là các lỗi khó phát hiện. Chương trình không báo lỗi, nhưng chạy với kết quả sai. Thậm chí với những chương trình phức tạp, chúng ta không thể biết có kết quả sai!!! Trong Python, khi chạy chương trình, trình phân tích cú pháp lặp lại dòng vi phạm và vị trí dòng vi phạm đồng thời hiển thị một 'mũi tên' nhỏ chỉ vào điểm sớm nhất trong dòng mà lỗi được phát hiện. Lỗi được gây ra bởi mã thông báo trước 'mũi tên'. 1. Biến chưa được khởi tạo: NameError: name 'inputvalue' is not defined Lỗi NameError do biến inputvalue chưa được khởi tạo hoặc bị viết sai chính tả so với biến đã được khai báo. Python phân biệt chữ hoa và chữ thường nên dễ viết sai kí tự đầu tiên (None; False; True; while; for… ) của tên dành riêng. 2. Vi phạm quy tắc đặt tên biến, thiếu hoặc sai từ khóa: SyntaxError: invalid syntax Biến trong Python phải bắt đầu bằng một chữ cái hoặc một dấu gạch dưới. Không bắt đầu tên biến bằng một số hoặc bất kỳ ký tự đặc biệt nào khác. Ngoài ra, có một số từ nhất định được dành riêng và không được phép sử dụng làm tên biến và được gọi là từ khóa. Từ khóa and không thể là biến. SyntaxError: invalid syntax Lỗi thiếu từ khóa in. SyntaxError: invalid syntax Lỗi do thiếu dấu '=' ở biểu thức logic trong điều kiện của lệnh if. Nếu Python thông báo biểu thức không thể chứa phép gán, bạn cần kiểm tra lại câu lệnh là một lệnh gán hay một biểu thức Boolean. 3. Không tìm thấy thư viện: ModuleNotFoundError: No module named 'maths' Lỗi ModuleNotFoundError do không có thư viện maths mà chỉ có thư viện math. 4. Thiếu dấu hai chấm cho khối lệnh, thụt lề không đúng: Python phân biệt các khối lệnh bằng dấu ':' và thụt lề đầu dòng các lệnh trong khối. SyntaxError: invalid syntax Lỗi do thiếu dấu ':'. Dấu hai chấm luôn có ở cuối cùng của câu lệnh mà từ khóa if, else, elif, while, for, try, with, class, def được sử dụng ở đầu của câu lệnh đó. IndentationError: expected an indented block Thụt lề sai không chỉ gây ra lỗi cú pháp mà còn gây ra lỗi logic. Khi copy code Python trên internet, thường xuất hiện các lỗi về thụt lề do mỗi trình soạn thảo quy định các khoảng cách Tab là khác nhau. Khối lệnh sau dấu ':' phải có ít nhất một lệnh, nếu các lệnh trong khối cùng nằm trên một dòng thì kết thúc lệnh phải sử dụng dấu ';'. Nếu các lệnh trong khối nằm trên nhiều dòng thì các dòng thụt lề bằng nhau. Nếu trong khối lại có một khối lệnh khác, thì khối lệnh đó lại tiếp tục thụt lề nhiều hơn. Khối lệnh kết thúc khi lệnh tiếp theo không thụt lề. Ví dụ: IndentationError: unindent does not match any outer indentation level Phải chỉnh lại thụt lề lệnh print(t) bằng lề của các dòng lệnh trên tùy theo mục đích chương trình. Nếu lệnh print(t) thuộc khối lệnh sau for thì nó phải thụt lề bằng câu lệnh if… mặt khác, nếu nó không thuộc khối lệnh sau for nó sẽ thụt lề bằng câu lệnh for… đồng thời đánh dấu kết thúc cả hai khối lệnh trên. Việc vừa sử dụng Tab và khoảng trắng trong phần thụt lề của một khối dễ gây ra lỗi. Vì thế nên thống nhất chỉ thụt lề bằng Tab hoặc các khoảng trắng đều nhau cho mỗi khối (mỗi khoảng trắng nên là 3 kí tự trống). Lệnh print(t) ở trên đã thụt lề so với dòng lệnh if… một kí tự trắng nên lỗi khó phát hiện. Lưu ý: Lệnh đầu tiên của chương trình không được thụt lề trái dù chỉ 1 khoảng trắng. 5. Sử dụng kiểu dữ liệu không phù hợp: Ví dụ: print(6 +'7') TypeError: unsupported operand type(s) for +: 'int' and 'str' Lỗi do cộng một số nguyên với một chuỗi gồm các kí tự số. Lỗi được sửa bằng cách ép các dữ liệu về cùng kiểu phù hợp. Ví dụ: In ra tuổi của cha, biết rằng tuổi cha hơn tuổi con là 30. Tuổi của con được nhập từ bàn phím. Lỗi TypeError do trong Python, hàm input() nhận dữ liệu từ bàn phím và luôn trả về dưới dạng kiểu chuỗi, nên phép toán trong lệnh print() không thể thực hiện. Sửa đoạn code trên bằng việc ép kiểu chuỗi thành kiểu nguyên: Khi ép kiểu chuỗi thành kiểu nguyên. Cần đảm bảo các kí tự trong chuỗi phải là các kí tự số. Ví dụ: ValueError: invalid literal for int() with base 10: '9x' Không thể chuyển chuỗi thành số vì có kí tự x trong đó. 6. Thiếu dấu ngoặc đơn khi gọi hàm: Khi gọi một hàm, hoặc phương thức, dù không có tham số thì vẫn cần phải thêm dấu ngoặc đơn sau tên hàm để gọi. Lời gọi hàm thích hợp là append(), không phải append. Khi gọi hàm mà thiếu dấu ngoặc đơn, chương trình không báo bất cứ lỗi gì. Điều này sẽ dẫn đến những lỗi logic. 7. Lỗi khi làm việc với list: IndexError: list index out of range List numbers có 4 phần tử, (từ 0 đến 3), không có phần tử thứ 5 (chỉ số 4). Lệnh print(numbers[4]) không thể in ra một giá trị không tồn tại. Ví dụ: lặp một đối tượng kiểu list và cho biết có tồn tại hay không phần tử có giá trị bằng 0. Nếu tồn tại, hãy in ra chỉ số của phần tử đầu tiên có giá trị bằng 0. Nếu list x tồn tại phần tử có giá trị bằng không, đoạn chương trình trên sẽ thực hiện một cách chính xác. Tuy nhiên nếu list x không tồn tại một phần tử nào có giá trị bằng 0 lỗi IndexError được phát ra và chỉ vào vị trí biểu thức logic sau while. Vì khi không tìm thấy phần tử có giá trị bằng 0, biến i được tăng lên bằng n. Trong biểu thức logic để thoát khỏi vòng lặp, phần tử x[n] không tồn tại nên xuất hiện lỗi IndexError. Sửa lại đoạn code trên bằng cách đảo vị trí của các toán hạng trong biểu thức logic phía sau while. Điều kiện i < n sẽ được kiểm tra trước, nếu sai sẽ thoát khỏi vòng lặp mà không kiểm tra giá trị x[i], lỗi IndexError không xuất hiện. 8. Lỗi chia cho không: ZeroDivisionError: division by zero Lỗi ZeroDivisionError do không thể chia một số cho 0. 9. Chỉnh sửa các phần tử trong khi quá trình lặp: Ví dụ: Lặp lại danh sách các số nguyên dưới đây và loại bỏ bất kì số nguyên nào nhỏ hơn 6. Code như sau: Kết quả: # [4, 7, 1] Kết quả sai, vì giả sử khi xóa phần tử đầu tiên thì ngay lập tức các phần tử phía sau sẽ dịch chuyển lên tạo thành một list mới. List mới sẽ được duyệt từ phần tử thứ 2 và bỏ qua phần tử đầu tiên chính là phần tử thứ 2 của list ban đầu dịch chuyển lên. Code có thể sửa theo cách sau, nếu điều kiện lọc không phức tạp: Kết quả: # [7] 10. Kiểm tra các giá trị Falsy: Kiểm tra True hoặc False của một biến trong lệnh if đôi khi có thể sai sót. Lỗi do người học Python thường nhầm lẫn giữa None và các giá trị falsy khác. Ví dụ: In các giá trị không phải là None trong list x : Kết quả: # 3, 4, 7. Số 0 không được in ra bởi trong Python cả None và 0 đều được coi là False. Code được sửa như sau: Kết quả: # 3, 0, 4, 7. 11. Lặp vô hạn: Khi mới học lập trình, việc sử dụng vòng lặp while là rất khó khăn và thường bị rơi vào lặp vô hạn. Do các lệnh trong vòng lặp đã không làm thay đổi điều kiện lặp sau while hoặc điều kiện lặp luôn đúng hoặc bỏ sót điều kiện nào đó để thoát khỏi vòng lặp. Ví dụ: Hàm replace() trong Python trả về một bản sao của chuỗi ban đầu sau khi đã thay thế các chuỗi con cũ bằng chuỗi con mới mà không làm thay đổi chuỗi ban đầu. Điều kiện x in y là luôn đúng vì cả chuỗi x và y không thay đổi, dẫn đến chương trình chạy mãi không dừng. Chương trình đúng là : 12. Thay đổi giá trị biến toàn cục trong chương trình con: UnboundLocalError: local variable 'x' referenced before assignment Python hiểu ở ví dụ trên có hai biến x, biến x toàn cục được khai báo và khởi tạo giá trị là 0. Biến x trong chương trình con là biến cục bộ. Trong chương trình con, biến cục bộ cùng tên với biến toàn cục thì biến toàn cục sẽ bị che đi. Lệnh gán x = x + 2 không thể thực hiện do biến cục bộ x chưa được khởi tạo giá trị. Để sử dụng được biến toàn cục trong chương trình con, ta phải sử dụng từ khóa global: 13. Sử dụng split() kết hợp với hàm input() để nhập giá trị cho các biến: Ví dụ: Khi chạy đoạn code trên, cửa sổ nhập xuất hiện. Chuỗi sau được nhập: 1 23 ValueError: not enough values to unpack (expected 3, got 2) Lỗi do, khoảng trắng giữa các kí tự là cơ sở để hàm split() tách chuỗi trên thành 2 giá trị, trong khi số biến nhận giá trị từ hàm input() là 3. Chuỗi trên phải nhập sao cho có 2 kí tự trắng cách nhau để tách đủ 3 giá trị cho các biến.
inputValue = 10
print(inputvalua)
and = 10
for i range(10):
x = 10
if x = 10 :
 print(x)
import maths
x = 10
if x == 10
 print(x)
x = 10
if x == 10:
print(x)
t = 0
for i in range(10):
 if i % 2 == 0:
 t = t + i
 print(t)
x = input('Tuổi con: ')
print('Tuổi cha: ', x + 30)
x = int(input('Tuổi con: '))
print('Tuổi cha: ', x + 30)
int('9x')
numbers = [1, 2, 3, 4]
print(numbers[4])
x = [1, 8, … 4, 2]
n = len(x)
i = 0
while x[i] != 0 and i < n:
 i = i + 1
if i < n :
 print(x[i])
else :
 print('Khong co')
x = [1, 8, … 4, 2]
n = len(x)
i = 0
while i < n and x[i] != 0:
 i = i + 1
if i < n :
 print(x[i])
else :
 print('Khong co')
x = 0
y = 5
print(y/x)
x = [3, 1, 2, 4, 7, 1]
for y in x:
 if y < 6:
 x.remove(y)
print(x)
x = [3, 1, 2, 4, 7, 1]
x= [y for y in x if x > 5]
print(x)
x = [3 ,'', 0, 4, 7]
for y in x :
 if y :
 print(y)
x = [3 ,'', 0, 4, 7]
for y in x :
 if y is not None:
 print(y)
x = 'abc'
y = 'abcdde'
z = '123'
while x in y:
 y.replace(x, z)
print('xau thay the:', y)
x = 'abc'
y = 'abcdde'
z = '123'
while x in y:
 y = y.replace(x, z)
print('xau thay the:', y)
x = 0
def replace():
 x = x + 2
replace()
x = 0
def replace():
 global x
 x = x + 2
replace()
x, y, z = map(int, input('>>>').split())
print(x, y, z)