Trả lời nhanh
Để giải thích kết quả in ra của một đoạn chương trình, em đọc từng lệnh theo thứ tự thực hiện, ghi giá trị mới của mỗi biến vào bảng theo dõi, và chỉ viết ra màn hình những gì lệnh print thực sự in. Với vòng lặp, cần xác định rõ số lần lặp và điều kiện dừng. Dưới đây là các ví dụ tự đặt để em luyện cách làm này.
Lưu ý: bài này hướng dẫn phương pháp với các đoạn mã ví dụ do thầy cô tự đặt bằng ngôn ngữ Python. Nếu đề của em có đoạn mã khác, em chỉ cần áp dụng đúng các bước bên dưới.
Các bước “chạy tay” một đoạn chương trình
- Liệt kê biến và giá trị ban đầu (các lệnh gán đầu đoạn).
- Đi từng dòng từ trên xuống. Gặp lệnh gán thì cập nhật biến; gặp
ifthì tính điều kiện đúng hay sai; gặpfor/whilethì lặp lại thân vòng. - Vẽ bảng theo dõi: mỗi cột là một biến, mỗi hàng là một bước.
- Chỉ ghi kết quả khi gặp
print, chú ý kiểu dữ liệu, dấu cách và xuống dòng.
Ví dụ 1: Phép toán số học và kiểu dữ liệu
a = 7
b = 2
print(a // b, a % b, a / b)
7 // 2là chia lấy phần nguyên → 3.7 % 2là chia lấy phần dư → 1.7 / 2là phép chia thông thường, luôn cho số thực → 3.5.
Kết quả in ra: 3 1 3.5 (các giá trị cách nhau một dấu cách vì print mặc định ngăn cách bằng dấu cách).
Ví dụ 2: Vòng lặp for kết hợp if
for i in range(1, 6):
if i % 2 == 0:
print(i, end=" ")
range(1, 6) cho i = 1, 2, 3, 4, 5 (không có 6). Chỉ những i chia hết cho 2 mới được in, và end=" " khiến các số nằm trên cùng một dòng.
| i | i % 2 == 0? | In ra |
|---|---|---|
| 1 | Sai | – |
| 2 | Đúng | 2 |
| 3 | Sai | – |
| 4 | Đúng | 4 |
| 5 | Sai | – |
Kết quả: 2 4
Ví dụ 3: Biến tích luỹ
s = 0
for i in range(1, 5):
s = s + i
print(s)
Lệnh print nằm ngoài vòng lặp (không thụt lề) nên chỉ in một lần, sau khi vòng lặp kết thúc.
| i | s trước | s sau |
|---|---|---|
| 1 | 0 | 1 |
| 2 | 1 | 3 |
| 3 | 3 | 6 |
| 4 | 6 | 10 |
Kết quả: 10. Nếu em thụt lề print(s) vào trong vòng for, kết quả sẽ thành bốn dòng: 1, 3, 6, 10.
Ví dụ 4: Vòng lặp while
n = 20
d = 0
while n > 1:
n = n // 2
d += 1
print(d)
| Lần lặp | n sau khi chia | d |
|---|---|---|
| 1 | 10 | 1 |
| 2 | 5 | 2 |
| 3 | 2 | 3 |
| 4 | 1 | 4 |
Sau lần 4, n = 1 nên điều kiện n > 1 sai, vòng lặp dừng. Kết quả: 4.
Ví dụ 5: Chuỗi và số – dễ nhầm nhất
print("2" + "3")
print(2 + 3)
print("2" * 3)
"2" + "3": nối hai chuỗi →23.2 + 3: cộng hai số →5."2" * 3: lặp chuỗi 3 lần →222.
Kết quả gồm ba dòng: 23, 5, 222.
Lỗi sai thường gặp
- Quên rằng
range(a, b)không lấy giá trị b. - Viết kết quả
3thay vì3.5khi dùng phép chia/. - Không để ý thụt lề, nên tính sai số lần
printđược thực hiện. - Bỏ qua
end=" ", dẫn đến xuống dòng sai. - Nhầm
=(gán) với==(so sánh).
Mẹo nhớ
“Gán rồi mới dùng, thụt lề là thuộc về vòng, print in gì ghi nấy.” Khi còn phân vân, luôn quay về bảng theo dõi biến; làm đều đặn, em sẽ ít sai hơn trong bài kiểm tra.
Bài luyện tập (tự đặt)
-
x = 10 x = x + 5 x = x * 2 print(x)Đáp án: x lần lượt là 10 → 15 → 30, in
30. -
for i in range(3): print("*" * (i + 1))Đáp án: i = 0, 1, 2 nên in ba dòng:
*,**,***. -
print(10 % 4, 10 // 4, 2 ** 3)Đáp án: 10 % 4 = 2; 10 // 4 = 2; 2 ** 3 = 8. In ra
2 2 8.
Câu hỏi thường gặp
Làm sao biết đoạn chương trình in ra kết quả gì?
Em chạy tay từng dòng theo thứ tự, ghi giá trị các biến vào bảng theo dõi và chỉ ghi ra những gì lệnh print in ra.
Vì sao range(1, 6) không có số 6?
Trong Python, range(a, b) lấy các số từ a đến b - 1, nên giá trị cuối b không được tính.
Phép / và // trong Python khác nhau thế nào?
Phép / cho kết quả là số thực (7 / 2 = 3.5), còn // chia lấy phần nguyên (7 // 2 = 3).
Thụt lề ảnh hưởng thế nào đến kết quả in ra?
Lệnh thụt lề trong for/while/if thuộc khối lệnh đó và được thực hiện theo vòng lặp hay điều kiện. Lệnh không thụt lề chỉ chạy một lần sau khối.