Trả lời nhanh
Lệnh sau có lỗi gì? Dòng x = 1 đúng cú pháp: biến x nhận giá trị số nguyên 1. Dòng 123a = x + 1 sai, Python báo SyntaxError: invalid syntax. Tên biến không được bắt đầu bằng chữ số. Sửa thành a123 = x + 1 hoặc một tên có nghĩa như so_a = x + 1 thì lệnh chạy và biến mới nhận giá trị 2.
Lệnh trong bài và thông báo máy trả về
Bài luyện ở Tin học 10, sách Kết nối tri thức, phần biến và lệnh gán, đưa hai dòng gõ trong cửa sổ tương tác của Python. Dấu nhắc >>> không phải một phần của lệnh, đó là chỗ máy đợi em gõ.
>>> x = 1
>>> 123a = x + 1
SyntaxError: invalid syntax
Máy thực hiện lần lượt từ trên xuống. Dòng thứ nhất được nhận. Dòng thứ hai bị từ chối ngay khi đọc, trước cả lúc tính x + 1. Vì thế biến x vẫn bằng 1 nếu em hỏi lại bằng lệnh in, còn tên 123a không hề được tạo.
Chữ invalid syntax nghĩa là cú pháp không hợp lệ: câu lệnh viết không đúng quy tắc của ngôn ngữ, giống viết một câu tiếng Việt thiếu chủ ngữ đến mức người nghe không tách được từ. Đây không phải lỗi chia cho 0, cũng không phải lỗi dùng một tên chưa gán. Hai lỗi ấy chỉ xuất hiện khi câu lệnh đã đúng dạng và máy bắt đầu chạy.

Nhánh trái của hình là tên bắt đầu bằng số, máy dừng với lỗi cú pháp. Nhánh phải là tên bắt đầu bằng chữ, cùng một phép gán thì chạy được.
Quy tắc đặt tên biến trong Python
Một tên biến hợp lệ thỏa cùng lúc các điều sau:
- Kí tự đầu là chữ cái không dấu a–z, A–Z, hoặc dấu gạch dưới _. Không được là chữ số.
- Từ kí tự thứ hai trở đi được dùng chữ cái, chữ số và dấu gạch dưới.
- Không trùng từ khóa của Python, ví dụ if, for, while, class, def, True, False, None.
- Không có dấu cách, dấu gạch ngang, dấu chấm hay dấu tiếng Việt trong tên.
Python phân biệt chữ hoa và chữ thường. Biến diem và biến Diem là hai biến khác nhau. Thói quen trong bài học là viết thường, các tiếng trong tên nối bằng dấu gạch dưới: diem_toan, so_hoc_sinh.
| Tên | Kết luận | Lí do |
|---|---|---|
| x | Hợp lệ | Một chữ cái |
| a123 | Hợp lệ | Bắt đầu bằng chữ, số đứng sau |
| _diem | Hợp lệ | Bắt đầu bằng dấu gạch dưới |
| 123a | Không hợp lệ | Bắt đầu bằng chữ số |
| diem toan | Không hợp lệ | Có dấu cách |
| so-a | Không hợp lệ | Dấu gạch ngang bị hiểu là phép trừ |
| for | Không hợp lệ | Trùng từ khóa |
Máy đọc từ trái sang phải. Khi gặp 123, nó tưởng đó là một số. Gặp tiếp chữ a dính liền, số không thể có chữ ở cuối, nên cả cụm không phải số cũng không phải tên. Đó là lí do lỗi chỉ ra ngay chỗ 123a, không phải chỗ dấu bằng.
Sửa lệnh cho chạy được
Giữ nguyên dòng đúng, chỉ đổi tên ở dòng sai. Một cách sửa sát đề nhất:
x = 1
a123 = x + 1
Sau hai dòng này, x bằng 1 và a123 bằng 2. Phép x + 1 dùng giá trị hiện có của x, không làm x tăng thêm. Muốn x thành 2 thì phải viết thêm x = x + 1, đó là một lệnh khác.
Tên a123 hết lỗi nhưng khó nhớ. Trong bài làm và trong chương trình thật, em nên đặt tên nói được việc của biến:
so_ban_dau = 1
so_moi = so_ban_dau + 1
Khi đó in so_moi sẽ ra 2. Đổi tên không đổi kết quả của phép cộng, chỉ đổi chỗ cất kết quả.
Không sửa bằng cách viết 123 a có dấu cách, cũng không viết 123+a. Cả hai đều không tạo được biến tên 123a. Nếu mục tiêu là lưu số 2, tên phải hợp lệ trước, phép tính viết sau dấu bằng.
Phân biệt lỗi cú pháp với lỗi tên chưa có
Hai thông báo dễ lẫn khi mới học:
- SyntaxError nghĩa là câu viết sai dạng. Máy không chạy dòng đó. Ví dụ 123a = x + 1, hoặc x = , hoặc thiếu dấu hai chấm sau if.
- NameError nghĩa là câu đúng dạng nhưng dùng một tên chưa được gán. Ví dụ dòng print(diem) khi chưa có lệnh nào gán diem. Máy đã hiểu em muốn in, nhưng không tìm thấy biến.
Bài này là SyntaxError. Nếu em sửa thành a123 = x + 1 nhưng lỡ viết a123 = y + 1 trong khi chưa có y, lỗi đổi thành NameError: name ‘y’ is not defined. Sửa tiếp bằng cách gán y trước, hoặc dùng lại x đã có.
Thứ tự dòng cũng quan trọng. Viết a123 = x + 1 đứng trước x = 1 thì đến dòng thứ nhất máy chưa biết x, lại báo NameError dù tên a123 đã hợp lệ. Trong bài, x = 1 đứng trước nên vế phải x + 1 không phải chỗ lỗi. Chỗ lỗi chỉ còn cái tên bên trái.
Dấu bằng trong Python là lệnh gán, không phải dấu bằng của phương trình. Vế trái phải là một tên biến, vế phải là biểu thức tính được. Viết 1 = x là sai cú pháp theo chiều ngược lại: số không đứng bên trái dấu gán. Viết x + 1 = 2 cũng sai, vì x + 1 là một biểu thức, không phải một tên.
Bài luyện
Bài 1. Dòng nào trong các dòng sau gây lỗi cú pháp? a) n = 10 b) 10n = 10 c) n10 = 10
Đáp án: Dòng b. Tên 10n bắt đầu bằng số. Dòng a và c hợp lệ; n10 bắt đầu bằng chữ n.
Bài 2. Sửa chương trình sau để in ra 8.
diem = 5
2diem = diem + 3
print(2diem)
Đáp án: Đổi 2diem thành diem2 ở cả chỗ gán và chỗ in:
diem = 5
diem2 = diem + 3
print(diem2)
Máy in 8. Biến diem vẫn bằng 5.
Bài 3. Vì sao tên for không dùng làm biến đếm, dù nó bắt đầu bằng chữ?
Đáp án: for là từ khóa, dùng để viết vòng lặp. Máy không cho gán for = 1. Em chọn tên khác, ví dụ so_vong hoặc i.
Bài 4. Cho x = 4. Viết một lệnh gán hợp lệ để tạo biến moi bằng x cộng 1, rồi nêu giá trị của x và của moi sau lệnh đó.
Đáp án: moi = x + 1. Sau lệnh, moi bằng 5 còn x vẫn bằng 4, vì không có lệnh nào gán lại cho x.
Câu hỏi thường gặp
Lệnh 123a = x + 1 lỗi gì?
Lỗi cú pháp SyntaxError vì tên biến 123a bắt đầu bằng chữ số. Python không tạo biến này.
Dòng x = 1 có sai không?
Không. Đây là lệnh gán hợp lệ, biến x nhận giá trị 1 trước khi máy đọc dòng bị lỗi.
Sửa 123a thành tên nào thì chạy?
Đổi thành a123, so_a hoặc một tên bắt đầu bằng chữ cái hay dấu gạch dưới, không trùng từ khóa.
SyntaxError khác NameError chỗ nào?
SyntaxError là câu viết sai dạng, máy không chạy. NameError là câu đúng dạng nhưng dùng tên chưa được gán.
x = x + 1 có nghĩa là phương trình vô nghiệm không?
Không. Trong Python đó là lệnh gán: lấy giá trị cũ của x, cộng 1, rồi cất lại vào x.