Một đoạn code viết sẵn, làm nhiệm vụ in ra màn hình
()
call (lời gọi)
Cặp ngoặc tròn báo cho Python biết “hãy thực thi hàm này”
"Hello, World!"
argument (đối số)
Dữ liệu bạn đưa cho hàm xử lý
"..."
string literal (chuỗi ký tự)
Cặp nháy kép báo đây là văn bản, không phải tên biến
Thiếu cặp ngoặc = hàm không chạy
print("Xin chao") # ✅ In ra: Xin chaoprint # ❌ Không in gì cả (chỉ nhắc tới tên hàm, không gọi)
Ở REPL, gõ print trơ trọi sẽ hiện <built-in function print> — Python đang nói “đây là một hàm”, chứ không thực thi nó.
2. Hàm print() chi tiết
2.1. In nhiều giá trị cùng lúc
print("Ma khach hang:", "KH001")
Kết quả:
Ma khach hang: KH001
Python tự chèn một dấu cách giữa các đối số.
print("Ho ten:", "Nguyen Van A", "-", "Tuoi:", 35)
Kết quả:
Ho ten: Nguyen Van A - Tuoi: 35
2.2. Tham số sep — đổi ký tự phân cách
print("2026", "08", "08", sep="-")
Kết quả:
2026-08-08
print("A", "B", "C", sep="") # Không phân cáchprint("A", "B", "C", sep=" | ") # Phân cách bằng dấu gạch đứng
Kết quả:
ABC
A | B | C
2.3. Tham số end — đổi ký tự kết thúc
Mặc định, print() tự xuống dòng sau khi in (vì end="\n", trong đó \n là ký tự xuống dòng).
print("Dong 1")print("Dong 2")
Kết quả:
Dong 1
Dong 2
Đổi end để không xuống dòng:
print("Dang xu ly", end="... ")print("Xong!")
Kết quả:
Dang xu ly... Xong!
2.4. In dòng trống
print("Phan 1")print() # In một dòng trốngprint("Phan 2")
print() so với SQL
Trong T-SQL bạn dùng PRINT 'text' để in ra thông báo. print() của Python tương tự, nhưng linh hoạt hơn nhiều: in được nhiều giá trị, tùy chỉnh phân cách, và in được mọi kiểu dữ liệu mà không cần ép kiểu thủ công.
Comment là dòng ghi chú mà Python bỏ qua hoàn toàn khi chạy. Nó dành cho con người đọc.
3.1. Comment một dòng
Dùng dấu #:
# Đây là comment, Python không chạy dòng nàyprint("Dòng này chạy") # Comment cũng có thể đặt cuối dòng lệnh
3.2. Comment nhiều dòng
Python không có cú pháp comment khối như /* ... */ của SQL. Có 2 cách:
Cách 1 — Nhiều dấu # (khuyến nghị):
# Chương trình tính tiền điện# Tác giả: Nguyễn Văn A# Ngày tạo: 08/08/2026# Ghi chú: đơn giá theo biểu giá bậc thang EVN
Trong VS Code: bôi đen nhiều dòng rồi nhấn Ctrl + / để comment/bỏ comment hàng loạt.
Cách 2 — Chuỗi nhiều dòng ("""..."""):
"""Đoạn này thực chất là một chuỗi ký tự,không phải comment thật.Nhưng vì không gán cho biến nào nên Python bỏ qua."""
Khi nào dùng """..."""?
Cú pháp này được dành riêng cho docstring (chuỗi tài liệu) — mô tả chức năng của hàm, class, module. Bạn sẽ học kỹ ở 10 - Hàm (Function). Để comment thông thường, hãy dùng #.
3.3. Viết comment thế nào cho đúng?
# ❌ Comment vô dụng — chỉ đọc lại codex = x + 1 # Cộng x thêm 1# ✅ Comment hữu ích — giải thích LÝ DOx = x + 1 # Bù cho việc chỉ số bắt đầu từ 0 khi hiển thị cho người dùng
4. Indentation — Thụt lề (phần quan trọng nhất module này)
4.1. Vấn đề: làm sao nhóm các lệnh lại với nhau?
Hầu hết ngôn ngữ dùng dấu ngoặc nhọn hoặc từ khóa để đánh dấu khối lệnh (code block):
T-SQL:
IF @Tuoi >= 18BEGIN PRINT 'Nguoi lon'; PRINT 'Duoc phep ky hop dong';END
C# / Java / JavaScript:
if (tuoi >= 18) { Console.WriteLine("Nguoi lon"); Console.WriteLine("Duoc phep ky hop dong");}
Python — dùng THỤT LỀ:
if tuoi >= 18: print("Nguoi lon") print("Duoc phep ky hop dong")
4.2. Quy tắc
Quy tắc
Nội dung
1
Dòng mở đầu khối lệnh kết thúc bằng dấu hai chấm :
2
Các dòng thuộc khối phải thụt vào cùng một mức
3
Chuẩn PEP 8: thụt vào 4 dấu cách (space), không dùng Tab
4
Dòng nào thụt về mức cũ là đã ra khỏi khối
4.3. Ví dụ minh họa mức thụt lề
print("A") # Mức 0 — luôn chạyif 5 > 3: # Mức 0 — mở khối, có dấu : print("B") # Mức 1 — thuộc khối if print("C") # Mức 1 — thuộc khối if if 10 > 8: # Mức 1 — mở khối lồng, có dấu : print("D") # Mức 2 — thuộc khối if bên trong print("E") # Mức 1 — đã ra khỏi if bên trongprint("F") # Mức 0 — đã ra khỏi mọi khối
Kết quả:
A
B
C
D
E
F
Bây giờ thử đổi điều kiện thành sai:
print("A")if 5 > 100: # Điều kiện SAI print("B") print("C")print("F")
Kết quả:
A
F
Toàn bộ khối thụt lề bị bỏ qua vì điều kiện sai.
4.4. Các lỗi thụt lề điển hình
Lỗi 1 — Thiếu thụt lề sau dấu :
if 5 > 3:print("Sai roi")
IndentationError: expected an indented block after 'if' statement on line 1
Lỗi 2 — Thụt lề không đều
if 5 > 3: print("Dong 1") print("Dong 2")
IndentationError: unexpected indent
Lỗi 3 — Thụt lề khi không cần
print("A") print("B")
IndentationError: unexpected indent
Lỗi 4 — Trộn Tab và Space (nguy hiểm nhất vì mắt thường không thấy)
Bật Editor: Insert Spaces = true — VS Code sẽ tự chuyển Tab thành 4 space
Khi copy code từ website về, luôn kiểm tra lại thụt lề
4.5. Vì sao Python chọn cách này?
Vì triết lý “Readability counts” (tính dễ đọc là quan trọng). Trong các ngôn ngữ khác, lập trình viên vẫn phải thụt lề cho dễ đọc, nhưng máy không bắt buộc — nên code lộn xộn vẫn chạy. Python biến quy ước thành luật, buộc mọi code Python trên thế giới đều có hình thức nhất quán.
Đây vừa là ưu điểm (code sạch), vừa là điểm gây khó chịu ban đầu.
5. Câu lệnh (Statement) và dòng
5.1. Một dòng = một lệnh
print("A")print("B")
Python không cần dấu chấm phẩy cuối dòng (khác SQL, C#, Java).
Về mặt kỹ thuật thì ; vẫn hợp lệ để viết nhiều lệnh trên một dòng:
print("A"); print("B") # Chạy được nhưng KHÔNG NÊN
PEP 8 khuyến cáo không làm vậy. Mỗi lệnh một dòng.
5.2. Ngắt một lệnh dài thành nhiều dòng
Cách 1 — Ngắt bên trong dấu ngoặc (khuyến nghị):
print("Ma hoa don:", "HD001", "Ngay:", "08/08/2026", "So tien:", 1500000)
Python hiểu lệnh chưa kết thúc vì ngoặc tròn chưa đóng.
Cách 2 — Dấu gạch chéo ngược \:
tong = 100 + \ 200 + \ 300
Cách này dễ lỗi (nếu có khoảng trắng thừa sau \ là hỏng). Ưu tiên cách 1.
5.3. Độ dài dòng
PEP 8 khuyến nghị tối đa 79 ký tự/dòng. Thực tế nhiều dự án dùng 88 hoặc 100. Với bạn: cứ giữ dòng ngắn, dễ đọc.
6. Case-sensitivity — Phân biệt hoa thường
Python phân biệt tuyệt đối chữ hoa và chữ thường:
print("OK") # ✅ ĐúngPrint("OK") # ❌ NameError: name 'Print' is not definedPRINT("OK") # ❌ NameError: name 'PRINT' is not defined
Điều này áp dụng cho mọi thứ: tên hàm, tên biến, từ khóa.
so_luong = 10print(So_Luong) # ❌ NameError — 'So_Luong' khác 'so_luong'
Bẫy lớn cho dân SQL
Trong T-SQL, SELECT, select, Select đều như nhau; tên cột MaKH và makh cũng thường như nhau (tùy collation). Trong Python không có chuyện đó. Một chữ hoa sai là chương trình dừng.
7. Keywords — Từ khóa dành riêng
Python có một danh sách từ khóa mà bạn không được dùng làm tên biến. Xem danh sách:
Python cho phép tên biến tiếng Việt có dấu — nhưng đừng dùng
số_lượng = 10 # Chạy được! Python 3 hỗ trợ Unicode trong tên biến
Về kỹ thuật là hợp lệ. Nhưng thực tế tuyệt đối tránh: gây lỗi encoding khi chuyển máy, không đồng nghiệp nước ngoài nào đọc được, nhiều công cụ không hỗ trợ. Dùng tiếng Việt không dấu là chuẩn thực tế trong ngành phần mềm Việt Nam.
"""Chương trình tính tiền hóa đơn bán hàng.Tác giả: Nguyễn Văn ANgày tạo: 08/08/2026"""# ---------- Phần 1: Import thư viện ----------# (chưa có ở giai đoạn này, sẽ học ở M12)# ---------- Phần 2: Hằng số ----------THUE_SUAT_VAT = 0.1# ---------- Phần 3: Dữ liệu đầu vào ----------ten_hang = "Ban lam viec"so_luong = 3don_gia = 2500000# ---------- Phần 4: Xử lý ----------thanh_tien = so_luong * don_giatien_thue = thanh_tien * THUE_SUAT_VATtong_cong = thanh_tien + tien_thue# ---------- Phần 5: Xuất kết quả ----------print("=" * 40)print("HOA DON BAN HANG")print("=" * 40)print("Ten hang :", ten_hang)print("So luong :", so_luong)print("Don gia :", don_gia)print("-" * 40)print("Thanh tien:", thanh_tien)print("Thue VAT :", tien_thue)print("TONG CONG :", tong_cong)print("=" * 40)
Kết quả:
========================================
HOA DON BAN HANG
========================================
Ten hang : Ban lam viec
So luong : 3
Don gia : 2500000
----------------------------------------
Thanh tien: 7500000
Thue VAT : 750000.0
TONG CONG : 8250000.0
========================================