Lập trình Python cơ bản

Tóm tắt biến, kiểu dữ liệu, phép toán, if, for, while, danh sách, xâu, hàm trong Python, đối chiếu với C++, cách lập vết chương trình và lỗi hay gặp.

Kiến thức trọng tâmLớp 10
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ề 8⋅2=168 \cdot 2 = 16⁠. 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. d là 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 == 0 nghĩ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 → in 0 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à 6+9=156 + 9 = 15⁠, 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 23:3≈7,6723 : 3 \approx 7{,}67⁠. Đâ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ì 150=2⋅3⋅52150 = 2 \cdot 3 \cdot 5^2⁠, 84=22⋅3⋅784 = 2^2 \cdot 3 \cdot 7⁠). 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à n−1n - 1⁠).
  • 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. tot khởi tạo bằng 1 và không lần nào tăng; chương trình in 1 (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

  1. 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 → 4+3+2+1=104 + 3 + 2 + 1 = 10⁠.

  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.

  1. a = [5, 1, 8, 3]. Sau a.insert(2, 7) và a.pop(0), danh sách a là 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].

  1. Giá trị của 3 + 4 * 2 ** 2 và (3 + 4) * 2 là bao nhiêu?
Xem đáp án

2 ** 2 = 4, 4 * 4 = 16, 3 + 16 = 19. Biểu thức thứ hai: 7 * 2 = 14.

  1. 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 đó.

Kiểm tra lại kiến thức vừa ôn

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.

Luyện tập ngay

Đề có câu hỏi về chủ đề này