Menu

Cú pháp Python cơ bản: thụt lề, dòng lệnh, dấu hai chấm

Bộ quy tắc cú pháp tối thiểu mà Python quan tâm: thụt lề, xuống dòng, dấu hai chấm và phân biệt chữ hoa chữ thường, giải thích không cần thuật ngữ khó.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

Bộ quy tắc ngắn nhất có thể

Python nổi tiếng là dễ đọc, và phần lớn là nhờ ngôn ngữ này có rất ít quy tắc cú pháp (syntax). Những quy tắc quan trọng gói gọn trong một trang:

  • Mỗi dòng một câu lệnh.
  • Thụt lề quyết định cấu trúc: không có dấu ngoặc nhọn, không có từ khóa end.
  • Phân biệt chữ hoa chữ thường. name và Name là khác nhau.
  • : mở một khối lệnh; những dòng tiếp theo thụt vào bên dưới là thân của khối.
  • # bắt đầu một chú thích.

Về cơ bản là vậy. Mọi thứ khác là biến, hàm và thói quen dùng thư viện chuẩn, những thứ bạn sẽ học dần. Hãy cùng đi qua năm quy tắc này với đủ ngữ cảnh để chúng không còn giống quy tắc nữa, mà trở thành hình dáng tự nhiên của ngôn ngữ.

Mỗi dòng một câu lệnh

Một câu lệnh (statement) là một chỉ dẫn hoàn chỉnh: "in cái này", "cộng mấy số này", "gán giá trị kia". Trong Python, mỗi câu lệnh nằm trên một dòng riêng:

Ba câu lệnh, ba dòng. Bạn không cần dấu chấm phẩy ở cuối, và phần lớn code Python không dùng nó. (Bạn có thể đặt hai câu lệnh trên một dòng bằng dấu chấm phẩy, nhưng đó bị coi là phong cách kém. Đừng làm vậy.)

Nếu một dòng thực sự cần dài, bạn có thể xuống dòng ở một chỗ tự nhiên bên trong ngoặc tròn, ngoặc vuông hoặc ngoặc nhọn, Python sẽ không phàn nàn:

Hoặc, ít gặp hơn, kết thúc dòng bằng dấu gạch chéo ngược để viết tiếp. Nên ưu tiên cách dùng ngoặc khi có thể, vì phần lớn codebase dùng cách đó.

Thụt lề là cấu trúc

Đây là phần làm người mới hay vấp. Trong Python, khoảng trắng ở đầu dòng có ý nghĩa. Nó cho Python biết những dòng nào thuộc về cùng một nhóm.

Xem một câu lệnh if đơn giản:

Hai dòng sau if hour < 12: được thụt vào bốn dấu cách. Python hiểu thụt lề đó là "hai dòng này là thân của if". Câu lệnh print cuối cùng quay về lề trái, nên Python coi nó nằm ngoài if.

Nếu bỏ thụt lề, if sẽ hỏng. Nếu thụt thừa một dấu cách, if cũng hỏng. Python nghiêm ngặt ở đây vì thụt lề chính là cấu trúc, không có { hay end nào hỗ trợ.

Vài quy tắc rút ra từ đây:

  1. Chọn bốn dấu cách cho mỗi cấp thụt lề và giữ nguyên. Đó là quy ước PEP 8 và là mặc định của mọi trình soạn thảo cho tệp .py.
  2. Đừng trộn tab và dấu cách. Python 3 sẽ từ chối một tệp dùng cả hai. Trình soạn thảo hiện đại tự chuyển tab thành dấu cách khi lưu; hãy kiểm tra xem trình soạn thảo của bạn đã được thiết lập như vậy chưa.
  3. Lỗi thụt lề rồi sẽ xảy ra. Khi gặp, thông báo lỗi cho bạn biết số dòng. Hãy kiểm tra khoảng trắng đầu dòng đó có giống các dòng cùng cấp không.

Dấu hai chấm mở một khối lệnh

Mọi cấu trúc tạo ra một khối lồng nhau (if, else, for, while, def, class, with, try) đều kết thúc dòng tiêu đề bằng dấu hai chấm. Những dòng tiếp theo, được thụt vào, tạo thành thân của khối:

Hai điều cần để ý: dấu hai chấm ở cuối dòng tiêu đề, và bốn dấu cách thụt lề ở các dòng thân. Nếu quên dấu hai chấm, Python sẽ báo kiểu như SyntaxError: expected ':'. Lỗi này rất rõ ràng: thêm dấu câu bị thiếu là xong.

Phân biệt chữ hoa chữ thường

Python coi Name, name và NAME là ba thứ hoàn toàn khác nhau. Điều này áp dụng cho:

  • Biến và hàm do bạn tự đặt.
  • Những tên có sẵn như print, len, True, False, None.
  • Tên module và tên thuộc tính.

Thường bạn chỉ dính lỗi này khi vô tình viết hoa một thứ gì đó. True là giá trị boolean đúng; true là một biến chưa định nghĩa và gây ra NameError. Print(...) không phải hàm print, mà là lỗi gõ.

Nếu lỗi báo "name 'X' is not defined" trong khi bạn chắc chắn đã định nghĩa nó, hãy kiểm tra chữ hoa chữ thường trước. Mười lần thì có chín lần sai ở đó.

Chú thích với #

Mọi thứ sau # trên một dòng là chú thích, Python bỏ qua hoàn toàn. Chú thích là ghi chú cho người đọc sau này (kể cả chính bạn sau này):

Python không có cú pháp chú thích nhiều dòng. Nếu cần nhiều dòng, hãy dùng nhiều dòng #. (Đôi khi bạn sẽ thấy chuỗi ba dấu nháy được dùng như chú thích giả: đó là một thứ khác gọi là docstring, chúng ta sẽ nói đến khi học về hàm.)

Từ khóa dành riêng

Một số từ không được dùng làm tên biến vì chính Python dùng chúng: if, else, for, while, def, class, return, import, from, as, pass, break, continue, True, False, None, and, or, not, in, is, lambda, try, except, finally, raise, with, yield, global, nonlocal, async, await. Bạn không cần học thuộc danh sách này. Nếu thử dùng một từ trong đó, Python sẽ báo lỗi ngay.

Bạn đã đủ kiến thức để đọc mọi tệp Python

Mọi quy tắc bạn vừa đọc đều áp dụng cho mọi tệp Python, từ script hai dòng đến dự án hàng trăm nghìn dòng. Phần còn lại của ngôn ngữ được xây trên năm ý tưởng này. Nếu một tệp trông khó hiểu, cách gỡ gần như luôn là chú ý đến thụt lề trước. Thụt lề cho bạn biết code đang làm gì, ngay cả trước khi bạn đọc nội dung từng dòng.

Tiếp theo: tìm hiểu kỹ hơn một chút về chú thích, cùng với docstring, cách Python ghi tài liệu cho hàm và module.

Câu hỏi thường gặp

Vì sao Python quan tâm đến thụt lề?

Python dùng thụt lề để biết những dòng nào thuộc về cùng một nhóm. Trong khi các ngôn ngữ khác bọc nhóm code bằng dấu ngoặc nhọn { }, Python dùng khoảng trắng đầu dòng nhất quán. Code bớt rối mắt hơn, nhưng bạn không thể cẩu thả với khoảng cách.

Nên thụt lề bao nhiêu dấu cách trong Python?

Bốn dấu cách mỗi cấp là chuẩn của cộng đồng (PEP 8). Phần lớn trình soạn thảo chèn bốn dấu cách khi bạn nhấn Tab trong tệp Python. Con số chính xác không quan trọng bằng sự nhất quán: trộn thụt lề hai dấu cách và bốn dấu cách trong cùng một khối là lỗi rất hay gặp.

Python có phân biệt chữ hoa chữ thường không?

Có. Name, name và NAME là ba biến khác nhau. Những tên có sẵn như print và True phải viết đúng như vậy: True chạy được, còn true gây lỗi.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu