Trả lời nhanh
Nếu print(j) nằm ngoài vòng lặp (viết sát lề, sau vòng for) thì sau khi kết thúc nó in ra giá trị 11. Lý do: ở mỗi lượt, for gán lại j bằng 0, 1, 2, …, 9 rồi j = j + 2 mới cộng thêm; lượt cuối j = 9 nên thành 11. Nếu print(j) thụt lề trong vòng lặp thì nó chạy 10 lần, in các số từ 2 đến 11.
Đoạn mã đang xét
j = 0
for j in range(10):
j = j + 2
print(j)
Đề gốc thường hỏi: khi kết thúc đoạn lệnh trên, lệnh print(j) cho kết quả gì. Vì không rõ phương án đề đưa ra, bài này giải theo bản chất để em tự đối chiếu với đáp án của mình.
Điều cần nhớ: biến chạy của for bị gán lại ở mỗi lượt
Trong for j in range(10), Python lấy lần lượt các giá trị 0, 1, 2, …, 9 của range(10) và gán vào j ở đầu mỗi lượt lặp. Vì vậy dòng j = 0 trước vòng lặp không còn tác dụng, và lệnh j = j + 2 bên trong chỉ đổi j trong lượt đó, không làm vòng lặp “nhảy bước”.
Bảng theo dõi từng lượt lặp
| Lượt | j do for gán | Sau j = j + 2 |
|---|---|---|
| 1 | 0 | 2 |
| 2 | 1 | 3 |
| 3 | 2 | 4 |
| 4 | 3 | 5 |
| 5 | 4 | 6 |
| 6 | 5 | 7 |
| 7 | 6 | 8 |
| 8 | 7 | 9 |
| 9 | 8 | 10 |
| 10 | 9 | 11 |
Sau lượt 10, vòng lặp hết giá trị trong range(10) nên dừng, và j giữ lại giá trị 11.
Hai trường hợp theo vị trí lệnh print(j)
- print(j) ngoài vòng lặp (cùng lề với for): chỉ chạy một lần sau khi vòng lặp kết thúc, in ra 11.
- print(j) trong vòng lặp (thụt lề cùng j = j + 2): chạy 10 lần, in lần lượt 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 (mỗi số một dòng).
Những đáp án sai hay bị chọn
- 20: nghĩ rằng j cộng dồn 2 qua 10 lần (0 + 2 × 10). Sai vì j bị for gán lại mỗi lượt nên không cộng dồn.
- 9: nghĩ rằng giá trị cuối của biến chạy là 9. Đúng với bản thân range, nhưng đã bị cộng thêm 2 trong thân vòng lặp.
- 10: nhầm range(10) kết thúc ở 10. Thực ra range(10) dừng ở 9 (không gồm 10).
- 2: nghĩ rằng j = 0 ban đầu và chỉ chạy một lần.
Mẹo nhớ
Với vòng for dùng range, hãy coi biến chạy như “được phát” giá trị mới ở đầu mỗi lượt. Muốn j tăng dần theo bước 2 thật sự, hãy dùng range(0, 20, 2) hoặc dùng một biến khác như s = s + 2.
Bài luyện tập
- Đoạn mã
k = 5;for k in range(4): k = k * 2;print(k)(print ngoài vòng lặp) in ra gì?
Đáp án: k lần lượt 0, 1, 2, 3; lượt cuối k = 3 × 2 = 6. In ra 6. - Đoạn mã
s = 0;for i in range(10): s = s + 2;print(s)in ra gì?
Đáp án: s là biến cộng dồn, không bị for gán lại: 10 × 2 = 20. - Nếu đổi đoạn mã gốc thành
range(1, 6)và print ngoài vòng lặp, kết quả là bao nhiêu?
Đáp án: j cuối là 5, cộng 2 được 7.
Câu hỏi thường gặp
Vì sao kết quả là 11 mà không phải 20?
Vì j là biến chạy của for nên được gán lại 0, 1, …, 9 ở đầu mỗi lượt. Phép j = j + 2 không cộng dồn qua các lượt; lượt cuối j = 9 + 2 = 11.
range(10) gồm những số nào?
range(10) gồm 10 số nguyên từ 0 đến 9, không chứa 10.
Dòng j = 0 trước vòng for có tác dụng không?
Không ảnh hưởng đến kết quả, vì for gán lại j ngay từ lượt đầu tiên.
Nếu print(j) thụt lề trong vòng lặp thì in gì?
Nó chạy 10 lần và in các số 2, 3, 4, …, 11, mỗi số trên một dòng.