Lệnh sau có lỗi gì? x = 1 rồi 123a = x + 1

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.

Hai nhánh so sánh tên 123a bị lỗi cú pháp vì bắt đầu bằng số và tên a123 gán được giá trị 2
Hình 1. Cùng một phép x + 1, chỉ tên đứng bên trái dấu bằng quyết định lệnh có được chạy hay không.

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.