Mục lục (5 phần)
Lập trình Python là kiến thức lớp 10 nhưng có mặt ở mọi đề: phần I thường có 3–4 câu "cho chương trình, hỏi kết quả in ra", đề in song song Python và C++. Ở định hướng CS, các câu đúng/sai về thuật toán cũng dựa trên kĩ năng này. Bí quyết là lập bảng vết: ghi giá trị các biến sau từng bước thay vì nhẩm.
Kiến thức trọng tâm
Kiểu dữ liệu và phép toán
| Kiểu | Ví dụ | Ghi chú |
|---|---|---|
int (số nguyên) |
17, -3 |
Không giới hạn độ lớn trong Python |
float (số thực) |
3.5, 7 / 2 |
Phép / luôn cho số thực |
str (xâu) |
"Tin", '12' |
"12" + "3" là "123" (ghép xâu) |
bool |
True, False |
Kết quả của phép so sánh |
list (danh sách) |
[5, 1, 8] |
Chỉ số bắt đầu từ 0 |
| Phép toán | Ý nghĩa | Ví dụ | Kết quả |
|---|---|---|---|
/ |
Chia | 7 / 2 |
3.5 |
// |
Chia lấy phần nguyên | 17 // 5 |
3 |
% |
Chia lấy dư | 17 % 5 |
2 |
** |
Lũy thừa | 2 ** 3 |
8 |
==, != |
Bằng, khác | 5 != 4 |
True |
and, or, not |
Và, hoặc, phủ định | not (3 > 2) |
False |
Thứ tự ưu tiên: ** → *, /, //, % → +, - → so sánh → not → and → or. Ví dụ 3 + 4 * 2 ** 2 bằng 19.
input() luôn trả về xâu; muốn tính toán phải đổi kiểu: n = int(input()). Lệnh print(a, b, sep="-", end="") in a, b
cách nhau bởi - và không xuống dòng.
Câu lệnh rẽ nhánh và lặp
| Cấu trúc | Python | C++ tương đương |
|---|---|---|
| Rẽ nhánh | if … : / elif … : / else: |
if (…) … else if (…) … else … |
| Lặp với số lần biết trước | for i in range(a, b, k): |
for (int i = a; i < b; i += k) |
| Lặp với điều kiện | while dk: |
while (dk) |
| Khối lệnh | Thụt lề đều nhau | Dấu { } |
| Chia nguyên, chia dư | //, % |
/ (giữa hai số nguyên), % |
| Logic | and, or, not |
&&, ||, ! |
| Độ dài | len(a) |
a.size() |
| Thêm cuối danh sách | a.append(x) |
a.push_back(x) (với vector) |
range(a, b, k) sinh các số từ a, mỗi lần cộng k, dừng trước b: range(10, 0, -3) → 10, 7, 4, 1 (4 lần lặp).
range(n) là 0, 1, …, n − 1.
Danh sách và xâu
| Thao tác | Danh sách a = [5, 1, 8, 3] |
Xâu s = "Ha Noi" |
|---|---|---|
| Phần tử | a[0] → 5, a[-1] → 3 |
s[0] → "H" |
| Độ dài | len(a) → 4 |
len(s) → 6 |
| Lát cắt | a[1:3] → [1, 8] |
s[3:] → "Noi" |
| Kiểm tra | 8 in a → True |
"No" in s → True |
| Thêm, chèn | a.append(x), a.insert(i, x) |
Xâu không sửa được từng kí tự, phải tạo xâu mới |
| Xóa | a.remove(x) (giá trị), a.pop(i) (vị trí) |
s.replace("a", "") |
| Khác | sorted(a), sum(a), max(a) |
s.upper(), s.find("N") → 3, s.split() → ["Ha", "Noi"] |
Hàm và phạm vi biến
def tang(x):
x = x + 5
return x * 2
x = 3
y = tang(x)
print(x, y)#include <iostream>
using namespace std;
int tang(int x) {
x = x + 5;
return x * 2;
}
int main() {
int x = 3;
int y = tang(x);
cout << x << " " << y;
return 0;
}Kết quả: 3 16. Tham số x trong hàm là biến cục bộ: gán x = x + 5 (thành 8) không làm thay đổi biến x của chương trình
chính, vẫn bằng 3. Hàm trả về . Biến tạo trong hàm không dùng được bên ngoài hàm.
Lập vết chương trình
a = [4, 7, 2, 9, 5, 8]
dem = 0
tong = 0
for x in a:
if x % 2 == 0:
dem = dem + 1
else:
tong = tong + x
print(dem, tong)#include <iostream>
using namespace std;
int main() {
int a[] = {4, 7, 2, 9, 5, 8};
int dem = 0, tong = 0;
for (int i = 0; i < 6; i++)
if (a[i] % 2 == 0)
dem = dem + 1;
else
tong = tong + a[i];
cout << dem << " " << tong;
return 0;
}| x | x chẵn? | dem | tong |
|---|---|---|---|
| 4 | có | 1 | 0 |
| 7 | không | 1 | 7 |
| 2 | có | 2 | 7 |
| 9 | không | 2 | 16 |
| 5 | không | 2 | 21 |
| 8 | có | 3 | 21 |
Chương trình in 3 21: đếm số chẵn và cộng các số lẻ.
Lỗi chương trình
| Loại lỗi | Khi nào phát hiện | Ví dụ |
|---|---|---|
| Lỗi cú pháp | Trước khi chạy | Thiếu : sau if, thụt lề sai, thiếu ngoặc |
| Lỗi khi chạy (ngoại lệ) | Đang chạy thì dừng | Chia cho 0, chỉ số vượt phạm vi danh sách, int("abc"), cộng xâu với số |
| Lỗi logic | Chạy hết nhưng sai kết quả | Dùng range(1, n) làm bỏ sót phần tử đầu |
Kiểm thử: chạy chương trình với nhiều bộ dữ liệu (kể cả trường hợp đặc biệt như danh sách rỗng, số âm, số 0) và so với kết quả đúng.
Dạng bài thường gặp trong đề thi
Dạng 1: Tính giá trị biểu thức, đếm số lần lặp
Xem lời giải
In 3 2 8 3.5. Vòng lặp nhận i = 10, 7, 4, 1 (số tiếp theo là −2 đã vượt qua mốc dừng 0) → 4 lần.
Dạng 2: Câu đúng/sai về một chương trình có hàm
Xem lời giải
- a) Đúng. Chia hết cho 3: 12, 18, 30, 9 → 4 số. Chia hết cho 5: 25, 30 → 2 số.
- b) Sai.
dlà biến cục bộ của hàm; dùng ngoài hàm sẽ báo lỗi (Python:NameError, C++: lỗi biên dịch). - c) Sai. Vòng lặp không chạy lần nào, hàm trả về 0, chương trình in
0 0. - d) Đúng.
k % x == 0nghĩa là x là ước của k. Mọi số trong danh sách đều lớn hơn 3 và 5 nên không số nào là ước của chúng → in0 0.
Dạng 3: Tìm lỗi logic
Xem lời giải
range(1, len(diem)) cho i = 1, 2 nên bỏ sót diem[0] = 8: tổng chỉ là , chia 3 được 5.0. Sửa thành
range(len(diem)) (hoặc for d in diem) thì tổng là 23, trung bình . Đây là lỗi logic: chương trình chạy
bình thường nhưng sai kết quả.
Dạng 4: Lập bảng vết vòng lặp while
Xem lời giải
Ghi giá trị các biến sau mỗi lần lặp; điều kiện b != 0 được kiểm tra trước mỗi lần lặp:
| Lần lặp | r = a % b | a | b |
|---|---|---|---|
| Trước vòng lặp | 150 | 84 | |
| 1 | 150 % 84 = 66 | 84 | 66 |
| 2 | 84 % 66 = 18 | 66 | 18 |
| 3 | 66 % 18 = 12 | 18 | 12 |
| 4 | 18 % 12 = 6 | 12 | 6 |
| 5 | 12 % 6 = 0 | 6 | 0 |
Sau lần 5, b = 0 nên vòng lặp dừng. Chương trình in 6 5.
Đây là thuật toán Euclid tìm ước chung lớn nhất: UCLN(150, 84) = 6 (vì , ). Chú ý thứ tự lệnh: phải tính r trước rồi mới gán a = b; gán a = b trước thì giá trị cũ của a bị mất.
Dạng 5: Câu đúng/sai về duyệt danh sách theo chỉ số
Xem lời giải
dai là độ dài đoạn tăng liên tiếp đang xét (kết thúc tại a[i]), tot là độ dài lớn nhất gặp được:
| i | a[i − 1] → a[i] | dai | tot |
|---|---|---|---|
| 1 | 3 → 5 | 2 | 2 |
| 2 | 5 → 7 | 3 | 3 |
| 3 | 7 → 4 | 1 | 3 |
| 4 | 4 → 6 | 2 | 3 |
| 5 | 6 → 8 | 3 | 3 |
| 6 | 8 → 9 | 4 | 4 |
| 7 | 9 → 2 | 1 | 4 |
- a) Đúng. Đoạn tăng dài nhất là
4 6 8 9(4 phần tử). - b) Sai.
range(1, 8)cho i = 1, 2, …, 7: vòng lặp chạy 7 lần (số cặp kề nhau là ). - c) Đúng. Danh sách không có hai phần tử kề nhau bằng nhau nên
>và>=cho cùng kết quả. - d) Sai.
totkhởi tạo bằng 1 và không lần nào tăng; chương trình in1(mỗi phần tử tự nó là một đoạn dài 1).
Dạng 6: Xử lí xâu với split và join
Xem lời giải
s.split() (không có đối số) tách xâu theo mọi khoảng trắng và bỏ các dấu cách thừa ở đầu, giữa, cuối:
ds = ['nguyễn', 'thị', 'thu', 'hà'].
| Lần lặp | t | Phần tử thêm vào kq |
|---|---|---|
| 1 | nguyễn |
Nguyễn |
| 2 | thị |
Thị |
| 3 | thu |
Thu |
| 4 | hà |
Hà |
t[0].upper() là chữ cái đầu viết hoa, t[1:] là phần còn lại từ vị trí 1 đến hết. " ".join(kq) nối các phần tử, xen giữa đúng một dấu cách.
Chương trình in hai dòng: Nguyễn Thị Thu Hà và 4.
Bẫy: s.split(" ") (có đối số là một dấu cách) thì khác — mỗi dấu cách thừa sinh ra một xâu rỗng '' trong danh sách.
Dạng 7 (bẫy): Nhiều lệnh if rời nhau khác if – elif
Xem lời giải
Ba lệnh if rời nhau được kiểm tra lần lượt, độc lập:
| Điều kiện | Giá trị khi d = 7 | In |
|---|---|---|
d >= 8 |
False | |
d >= 6.5 |
True | Khá |
d >= 5 |
True | Trung bình |
Đáp án B. A là kết quả nếu viết if … elif … elif …: khi đó chỉ nhánh đúng đầu tiên được thực hiện, các nhánh sau bị bỏ qua. Muốn xếp loại mỗi học sinh đúng một mức, phải dùng elif.
Lỗi thường gặp
Mẹo làm bài
Tự kiểm tra nhanh
- Chương trình sau in ra gì?
n = 1234
s = 0
while n > 0:
s = s + n % 10
n = n // 10
print(s)Xem đáp án
In 10. Mỗi lần lặp lấy chữ số hàng đơn vị (n % 10) cộng vào s rồi bỏ chữ số đó (n // 10): 4, 3, 2, 1 → .
- Chương trình sau in ra gì?
s = "tin hoc"
t = ""
for c in s:
if c != " ":
t = c + t
print(t, len(t))Xem đáp án
In cohnit 6. Mỗi kí tự khác dấu cách được ghép vào đầu xâu t nên t là xâu đảo ngược, bỏ dấu cách; độ dài 6.
a = [5, 1, 8, 3]. Saua.insert(2, 7)vàa.pop(0), danh sáchalà gì?
Xem đáp án
insert(2, 7) → [5, 1, 7, 8, 3]; pop(0) xóa phần tử ở vị trí 0 → [1, 7, 8, 3].
- Giá trị của
3 + 4 * 2 ** 2và(3 + 4) * 2là bao nhiêu?
Xem đáp án
2 ** 2 = 4, 4 * 4 = 16, 3 + 16 = 19. Biểu thức thứ hai: 7 * 2 = 14.
- Lệnh
int("abc")gây ra loại lỗi nào?
Xem đáp án
Lỗi khi chạy (ngoại lệ ValueError): xâu "abc" không đổi được sang số nguyên. Chương trình dừng tại lệnh đó.
Làm 10 câu luyện tập về lập trình python cơ bản và xem lời giải ngay sau mỗi câu.