Trong bài này
Lan chuẩn bị bảng thông báo cho ngày hội đọc sách. Lan muốn màn hình hiện tên sự kiện và số lượng 24 cuốn sách. Lan sẽ viết những lệnh ngắn để Python hiển thị thông tin theo thứ tự mong muốn.
Các lệnh trong chương trình đơn giản chạy từ trên xuống
Hãy chạy hai dòng sau và quan sát thứ tự chữ xuất hiện:
print("Xin chao")
print("Ngay hoi doc sach")Xin chao Ngay hoi doc sach
Python thực hiện dòng đầu trước, rồi đến dòng thứ hai. Một chương trình (program) là tập hợp các lệnh được viết để máy tính thực hiện một việc. Trong những chương trình đơn giản của bài này, các lệnh chạy từ trên xuống dưới.
Lệnh là chỉ dẫn bạn viết cho máy. Kết quả hiển thị là những gì lệnh tạo ra khi chạy. Ví dụ trên có hai lệnh và tạo ra hai dòng kết quả; việc gõ hai lệnh chưa phải là kết quả hiển thị.
Lệnh đầuIn lời chàoLệnh sauIn tên ngày hộiKết thúcKhông còn lệnh tiếp theo
Nếu đổi chỗ hai dòng, thứ tự hiển thị cũng đổi:
print("Ngay hoi doc sach")
print("Xin chao")Ngay hoi doc sach Xin chao
Mỗi lần chạy bắt đầu lại từ đầu chương trình. Bạn có thể sửa code trên trang học rồi chạy lại để so sánh kết quả. Một dòng trống giữa các lệnh giúp code dễ đọc và không tự in ra một dòng trống.
print("Buoi sang")
print("Buoi chieu")Buoi sang Buoi chieu
print() đưa chữ và số ra màn hình
Đây là một lệnh in tên lớp:
print("Lop Python")Lop Python
print là tên hàm (function) có sẵn để hiển thị kết quả. Nội dung cần in nằm giữa hai dấu ngoặc tròn. Cặp dấu nháy bao quanh chữ cho Python biết đây là chuỗi (string), tức văn bản. Dấu nháy bao ngoài không xuất hiện trong kết quả.
Bạn cũng có thể dùng một cặp nháy đơn. Hai đầu phải cùng loại:
print('Goc thu vien')
print("Mo cua")Goc thu vien Mo cua
Để in dấu nháy đơn bên trong chữ, bạn có thể dùng nháy kép bao ngoài:
print("Ten 'Python'")Ten 'Python'
Số có thể đặt trực tiếp trong ngoặc mà không cần nháy. Hãy so sánh số với chữ số đặt trong dấu nháy:
print(24)
print("24")24 24
24 là số; "24" là chữ gồm hai ký tự. Hai cách này đều hiển thị 24, nhưng cách viết mang ý nghĩa khác nhau. Bạn sẽ học thêm về kiểu dữ liệu ở Bài 2.
Nội dung đặt trong nháy có thể có dấu cách. Một chuỗi rỗng viết bằng hai dấu nháy liền nhau, không chứa dấu cách nào. Khi in chuỗi rỗng, bạn không thấy chữ nhưng lệnh vẫn kết thúc bằng xuống dòng:
print("")
print(" ")
print("Het")Het
Dòng đầu trống; dòng thứ hai chứa một dấu cách nên nhìn gần giống dòng trống. Sự khác biệt này quan trọng khi một đề yêu cầu đúng khoảng trắng.
Thiếu nháy đóng khiến Python không nhận ra chỗ kết thúc của văn bản:
print("Sach moi)Lỗi khi chạy, ở dòng 1
SyntaxError: unterminated string literal (detected at line 1)
Thông báo có SyntaxError, nghĩa là Python không đọc được cú pháp. Hãy tìm dấu nháy mở và thêm dấu nháy cùng loại trước ngoặc đóng.
Một print() có thể in nhiều giá trị
Lan muốn đặt tên và số sách trên cùng một dòng. Bạn viết hai giá trị, ngăn nhau bằng dấu phẩy:
print("So sach:", 24)So sach: 24
Dấu phẩy phân tách các giá trị đưa cho print(). Mặc định, print() chèn một dấu cách giữa chúng. Dấu phẩy trong code không tự xuất hiện trên màn hình.
print("Ban", "An", 9)Ban An 9
Thứ tự trong ngoặc quyết định thứ tự hiển thị. Muốn dấu phẩy xuất hiện như nội dung, hãy đặt nó trong chuỗi:
print("An, Binh", "cung doc")An, Binh cung doc
Nếu đổi thứ tự hai giá trị, kết quả cũng đổi. Số và chữ có thể cùng xuất hiện trong một lệnh mà bạn không cần đặt số trong dấu nháy:
print(3, "ban")3 ban
Lệnh có thể chứa một hoặc nhiều giá trị. Chỉ có một giá trị thì không có dấu cách mặc định nào được chèn vào trước hoặc sau nội dung.
Dấu cách mặc định được chèn giữa các giá trị, kể cả khi chuỗi đã có dấu cách ở cuối. Vì vậy, để có đúng một dấu cách giữa chữ và số, không cần thêm dấu cách cuối chuỗi:
print("Sach:", 24)
print("Sach: ", 24)Sach: 24 Sach: 24
sep chọn phần ngăn giữa các giá trị
Để in ngày theo dạng ba phần ngăn bằng dấu gạch chéo, đặt sep sau các giá trị:
print(4, 11, 2026, sep="/")4/11/2026
sep là phần ngăn cách (separator). Ở đây sep="/" yêu cầu print() đặt / giữa từng cặp giá trị. Nó không thêm dấu gạch chéo trước giá trị đầu hay sau giá trị cuối.
| 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|
| 4 | / | 11 | / | 2026 |
Chuỗi rỗng "" không có ký tự nào. Dùng nó làm sep để đặt các giá trị sát nhau:
print("A", 12, sep="")A12
Nếu chỉ có một giá trị, không có cặp giá trị nào để ngăn cách. Vì thế sep không thêm gì quanh giá trị đó:
print("Lan", sep="-")Lan
Phần ngăn cách cũng có thể gồm nhiều ký tự. Chúng được đặt đầy đủ vào mỗi chỗ giữa hai giá trị:
print("A", "B", "C", sep=" -> ")A -> B -> C
Các dấu cách trong " -> " là một phần của phần ngăn. Nếu đổi thành "->", dấu cách quanh mũi tên sẽ mất.
end và \n điều khiển chỗ xuống dòng
Mặc định, mỗi print() kết thúc bằng một ký tự xuống dòng. Vì thế hai lệnh sau cho hai dòng:
print("Hang mot")
print("Hang hai")Hang mot Hang hai
Bạn có thể thay phần kết thúc bằng end. Ví dụ sau đặt dấu cách ở cuối lệnh đầu, nên lệnh tiếp theo tiếp tục trên cùng dòng:
print("Goc", end=" ")
print("sach")Goc sach
end chỉ định phần kết thúc sau toàn bộ nội dung của một lần in. sep nằm giữa các giá trị trong cùng lần in. Hai phần này có thể dùng cùng nhau:
print("Do", "Xanh", sep="-", end="!")
print("Het")Do-Xanh!Het
Lệnh đầu đặt - giữa hai chữ và đặt ! sau chữ cuối. Lệnh thứ hai tiếp tục ngay sau ! vì lệnh đầu không xuống dòng.
Trong một chuỗi, \n biểu thị ký tự xuống dòng (newline). Hai ký tự bạn gõ trong code tạo ra một lần chuyển sang dòng mới khi in:
print("Tang mot\nTang hai")Tang mot Tang hai
print() vẫn thêm phần kết thúc mặc định sau chuỗi. Nếu nội dung kết thúc bằng \n, màn hình sẽ có thêm một dòng trống trước lệnh tiếp theo:
print("Mo dau\n")
print("Tiep theo")Mo dau Tiep theo
Một print() không có giá trị vẫn in phần kết thúc mặc định. Bạn có thể dùng nó để tạo dòng trống giữa hai phần:
print("Phan A")
print()
print("Phan B")Phan A Phan B
Nếu một lệnh dùng end="", nội dung được in mà không thêm ký tự kết thúc. Lệnh tiếp theo tiếp tục ở ngay vị trí đó:
print("Ma:", end="")
print("A12")Ma:A12
Bạn có thể đọc kết quả từ trái sang phải: trước hết là chữ Ma:, sau đó là A12. Lệnh thứ hai vẫn có phần kết thúc mặc định.
input() đọc một dòng chữ để chương trình sử dụng
Sau khi đã biết cách in, An muốn mỗi tấm thẻ mang tên một người khác nhau. Chương trình sau đọc một dòng chữ rồi in lại:
An
ten = input()
print(ten)An
input() đọc một dòng từ dữ liệu vào. Dấu = đặt kết quả đọc được vào tên ten để dòng sau dùng lại. Ở dòng tiếp theo, print(ten) in nội dung vừa đọc; không viết nháy quanh ten vì cần dùng nội dung đã lưu.
Nếu viết print("ten"), màn hình hiện đúng chữ ten, thay vì tên được nhập. Đây là hai cách viết có ý nghĩa khác nhau:
Mai
ten = input()
print(ten)
print("ten")Mai ten
Một dòng có thể chứa nhiều từ và dấu cách. input() đọc cả dòng, không chỉ từ đầu tiên:
Minh Anh
ten = input()
print("Xin chao", ten)Xin chao Minh Anh
Dòng trống cũng là một dòng hợp lệ: nội dung đọc được là chuỗi rỗng. Với tên không rỗng, lệnh sau đặt dấu ngoặc sát hai đầu tên:
An
ten = input()
print("[", ten, "]", sep="")[An]
Nếu dòng được nhập là dòng trống, cùng chương trình sẽ in []. Hai dấu ngoặc vẫn có mặt vì chúng là nội dung riêng của lệnh in.
Nếu dữ liệu vào là 24, input() nhận chữ 24. Bài này chỉ dùng chữ để in và ghép vào thông báo; bạn sẽ học đổi chữ thành số và tính toán ở Bài 2. Không đặt lời mời trong input() khi đề chỉ yêu cầu in kết quả, vì lời mời cũng hiện ra màn hình.
Chú thích giúp người đọc hiểu code
Dấu # mở đầu một chú thích (comment). Python bỏ qua phần chú thích khi thực hiện lệnh:
# Ten cua goc doc sach
print("Goc sach")Goc sach
Chú thích cũng có thể đứng sau một lệnh. Phần trước # vẫn được thực hiện:
print(24) # So cuon sach24
Một dấu # nằm trong dấu nháy là nội dung của chuỗi, không mở đầu chú thích:
print("Ke #2")Ke #2
Hãy dùng chú thích để giải thích điều cần thiết cho người đọc. Chú thích không thay cho lệnh: một dòng chỉ có # và chữ sẽ không hiển thị chữ đó khi chạy.
Đọc thông báo để tìm và sửa lỗi
Khi code không chạy, hãy xem loại lỗi và dòng được chỉ ra. Sau đó kiểm tra dấu nháy, ngoặc và chữ hoa chữ thường. Mũi tên trong thông báo giúp tìm vị trí Python phát hiện lỗi, nhưng chỗ cần sửa đôi khi nằm ngay trước đó.
Thiếu ngoặc đóng gây lỗi cú pháp:
print("Xin chao"Lỗi khi chạy, ở dòng 1
SyntaxError: '(' was never closedThêm ) vào cuối dòng để hoàn thành cặp ngoặc. Nếu đầu dòng bị thụt vào dù không có cấu trúc yêu cầu thụt lề, Python báo IndentationError:
print("Xin chao")Lỗi khi chạy, ở dòng 1
IndentationError: unexpected indent
Trong ví dụ này, hãy xóa khoảng trắng trước print. Bạn sẽ học những trường hợp cần thụt lề ở Bài 3.
Tên print phải viết đúng chữ thường. Ví dụ sau có cú pháp gọi hợp lệ, nhưng tên Print chưa được định nghĩa:
Print("Xin chao")Lỗi khi chạy, ở dòng 1
NameError: name 'Print' is not defined. Did you mean: 'print'?
Thông báo là NameError, không phải SyntaxError: Python đọc được cấu trúc nhưng không tìm thấy tên Print. Tương tự, chữ không có nháy có thể bị hiểu là một tên chưa định nghĩa:
print(Sach)Lỗi khi chạy, ở dòng 1
NameError: name 'Sach' is not defined
Hãy sửa thành print("Sach") nếu bạn muốn in chữ. Sau mỗi lần sửa, chạy lại để xem lỗi đã hết chưa.
Khi sửa một lỗi, hãy giữ những phần đã đúng. Chẳng hạn, với dòng thiếu ngoặc, kiểm tra xem dấu nháy đã đóng trước khi thêm ). Nếu thông báo mới xuất hiện sau đó, đọc lại thông báo mới thay vì đoán rằng lỗi cũ vẫn còn.
Lỗi thường gặp
| Lỗi | Vì sao sai | Cách sửa |
|---|---|---|
| Thiếu dấu nháy đóng | Chuỗi chưa kết thúc | Đóng bằng dấu nháy cùng loại |
| Thiếu ngoặc đóng | Lời gọi chưa hoàn chỉnh | Thêm ) sau nội dung |
Viết Print | Tên này khác print | Viết đúng print bằng chữ thường |
| Thụt đầu dòng không cần thiết | Python gặp mức thụt lề không mong đợi | Xóa khoảng trắng đầu dòng trong chương trình đơn giản |
| Quên nháy quanh chữ | Python tìm tên thay vì in văn bản | Đặt chữ trong một cặp nháy |
Nhầm sep với end | Hai tùy chọn đặt chữ ở hai vị trí khác nhau | Dùng sep ở giữa, end ở cuối |
Tóm tắt
- Các lệnh đơn giản chạy theo thứ tự từ trên xuống.
print()in số hoặc chữ; chữ được bao bằng dấu nháy.- Nhiều giá trị cách nhau bởi dấu phẩy;
sepchọn phần ngăn giữa chúng. endchọn phần kết thúc;\ntạo một lần xuống dòng trong chuỗi.#mở đầu chú thích khi nằm ngoài chuỗi.- Đọc loại lỗi và kiểm tra lại dòng được chỉ ra trước khi chạy lại.