50 Bài Tập Python Cơ Bản Có Lời Giải
50 Bài Tập Python Cơ Bản Có Lời Giải

Nếu bạn mới học Python, bạn sẽ rất dễ rơi vào tình trạng: “mình hiểu lý thuyết, nhưng gặp bài tập là bí”. Lý do thường không phải vì bạn kém, mà vì bạn thiếu bộ bài tập vừa sức, có lộ trình, có test case và chỉ rõ lỗi thường gặp.

Trong bài này, bạn sẽ có 50 bài tập Python cơ bản có lời giải được sắp xếp theo thứ tự từ dễ đến khó:
Nhập xuất → If/Else → Vòng lặp → Chuỗi → List/Tuple → Dict/Set → Hàm → Mini project.

Bạn xem thêm:

Bạn nên học thế nào để lên trình nhanh?

  • Mỗi bài tự làm 10–20 phút trước khi xem lời giải.

  • Luôn chạy ít nhất 2 test case: 1 bình thường + 1 trường hợp biên (0, âm, rỗng…).

  • Xem lời giải xong, đóng lại và viết lại từ đầu.


10 lỗi người mới học Python hay gặp 

50 Bài Tập Python Cơ Bản Có Lời Giải
50 Bài Tập Python Cơ Bản Có Lời Giải

Phần này giúp bạn tránh “kẹt” hàng giờ vì những lỗi rất nhỏ. Hãy đọc lướt 1 lần, sau đó quay lại khi bạn gặp lỗi.

1. Quên ép kiểu input()

  • Triệu chứng: bạn nhập 23 nhưng ra 23.

  • Nguyên nhân: input() trả về chuỗi.

  • Cách sửa:

       a = int(input())
            b = int(input())
            print(a + b)

2. Nhầm ===

  • = dùng để gán, == dùng để so sánh trong if.

  • Sai:

             if n = 5:
                         print("OK")
  • Đúng:

            if n == 5:
                       print("OK")

3. Sai range(): thiếu mất số cuối

  • range(1, n) chạy từ 1 đến n-1.

  • Muốn đến n phải dùng range(1, n+1).

4. Vòng lặp while không dừng

  • Triệu chứng: chạy mãi không xong.

  • Cách tự kiểm: đảm bảo biến điều kiện thay đổi trong vòng lặp.

       while n > 0:
                  n //= 10
           # có thay đổi n → sẽ dừng

5. Chia nguyên // và chia thực / bị dùng sai

  • / ra số thực, // ra phần nguyên.

  • Sai phổ biến: dùng 9//5 trong đổi C→F.

6. Lỗi thụt dòng 

Python bắt buộc thụt dòng đúng sau if/for/while/def.

if n > 0:
    print("Dương") # phải thụt vào

7. List rỗng nhưng vẫn max() / min()

  • Triệu chứng: ValueError.

  • Cách sửa:

      if arr:
               print(max(arr))
          else:
               print("Danh sách rỗng")

8. Nhầm .append()+

  • append(x) thêm 1 phần tử.

  • + nối list (tạo list mới).

        arr.append(5) # [.., 5]
              arr = arr + [5] # cũng được nhưng tốn hơn

9. Nhầm split()strip()

  • strip() xóa khoảng trắng đầu/cuối.

  • split() tách từ.

     s = input().strip()
        words = s.split()

10. Không test trường hợp biên

Bạn nên test thêm:

  • n = 0

  • n < 0

  • chuỗi rỗng ""

  • list rỗng []

Nhóm A: Nhập xuất Python cơ bản (Bài 1–8)

50 Bài Tập Python Cơ Bản Có Lời Giải
50 Bài Tập Python Cơ Bản Có Lời Giải

Bài 1: In “Hello, World!”

Độ khó: Dễ
Ý tưởng: Dùng print().

print("Hello, World!")

Test case

  • Output: Hello, World!

Lỗi thường gặp

  • Thiếu dấu nháy hoặc thiếu ngoặc.


Bài 2: Nhập tên và chào hỏi

Độ khó: Dễ
Ý tưởng: input() trả về chuỗi.

name = input("Nhập tên: ")
print(f"Xin chào, {name}")

Test case

  • Input: An

  • Output: Xin chào, An

Lỗi thường gặp

  • Nối chuỗi thiếu khoảng trắng.


Bài 3: Nhập 2 số, in tổng

Độ khó: Dễ
Ý tưởng: Ép kiểu vì input() là chuỗi.

a = float(input("a: "))
b = float(input("b: "))
print("Tổng =", a + b)

Test case

  • Input: 23.5

  • Output: Tổng = 5.5

Lỗi thường gặp

  • Quên ép kiểu khiến "2" + "3" = "23".


Bài 4: Diện tích hình chữ nhật

dai = float(input("Chiều dài: "))
rong = float(input("Chiều rộng: "))
print("Diện tích =", dai * rong)

Test case

  • Input: 52

  • Output: Diện tích = 10

Lỗi thường gặp

  • Nhập số âm (nếu muốn chặt chẽ, thêm kiểm tra > 0).


Bài 5: Đổi độ C sang F

c = float(input("C: "))
f = c * 9/5 + 32
print("F =", f)

Test case

  • Input: 0 → Output: F = 32

  • Input: 100 → Output: F = 212

Lỗi thường gặp

  • Dùng 9//5 (chia nguyên) khiến sai kết quả.


Bài 6: Tính BMI

w = float(input("Cân nặng (kg): "))
h = float(input("Chiều cao (m): "))
bmi = w / (h ** 2)
print("BMI =", round(bmi, 2))

Test case

  • Input: 60, 1.7 → Output: BMI = 20.76

Lỗi thường gặp

  • Nhập chiều cao đơn vị cm nhưng lại tính như m.


Bài 7: Tách hàng chục và hàng đơn vị

n = int(input("Nhập số 2 chữ số: "))
print("Hàng chục:", n // 10)
print("Hàng đơn vị:", n % 10)

Test case

  • Input: 47 → Output: chục 4, đơn vị 7

Lỗi thường gặp

  • Không xử lý số âm (nếu cần, dùng abs(n)).


Bài 8: Đổi giây sang hh:mm:ss

s = int(input("Nhập số giây: "))
h = s // 3600
m = (s % 3600) // 60
sec = s % 60
print(f"{h:02d}:{m:02d}:{sec:02d}")

Test case

  • Input: 3661 → Output: 01:01:01

Lỗi thường gặp

  • Nhầm công thức tính phút/giây.


Nhóm B: If/Else cơ bản (Bài 9–18)

Bài 9: Kiểm tra chẵn/lẻ

n = int(input("n: "))
print("Chẵn" if n % 2 == 0 else "Lẻ")

Test case

  • 10 → Chẵn

  • 7 → Lẻ

Lỗi thường gặp

  • Dùng = thay vì == trong điều kiện.


Bài 10: So sánh 2 số

a = float(input("a: "))
b = float(input("b: "))
if a > b:
   print("a lớn hơn b")
elif a < b:
  print("a nhỏ hơn b")
else:
  print("a bằng b")

Bài 11: Tìm số lớn nhất trong 3 số

a = float(input("a: "))
b = float(input("b: "))
c = float(input("c: "))
print("Max =", max(a, b, c))

Bài 12: Kiểm tra năm nhuận

y = int(input("Năm: "))
if (y % 400 == 0) or (y % 4 == 0 and y % 100 != 0):
   print("Năm nhuận")
else:
   print("Không nhuận")

Test case

  • 2000 → nhuận

  • 1900 → không nhuận

  • 2024 → nhuận


Bài 13: Xếp loại theo điểm trung bình

avg = float(input("Điểm TB: "))
if avg >= 8:
  print("Giỏi")
elif avg >= 6.5:
  print("Khá")
elif avg >= 5:
  print("Trung bình")
else:
  print("Yếu")

Bài 14: Giải phương trình bậc nhất ax + b = 0

a = float(input("a: "))
b = float(input("b: "))
if a == 0:
  print("Vô số nghiệm" if b == 0 else "Vô nghiệm")
else:
print("x =", -b / a)

Bài 15: Kiểm tra tam giác hợp lệ

a = float(input("a: "))
b = float(input("b: "))
c = float(input("c: "))
ok = (a + b > c) and (a + c > b) and (b + c > a)
print("Là tam giác" if ok else "Không phải tam giác")

Bài 16: Phân loại tam giác (đều/cân/thường)

a = float(input("a: "))
b = float(input("b: "))
c = float(input("c: "))
if not (a + b > c and a + c > b and b + c > a):
  print("Không phải tam giác")
elif a == b == c:
  print("Tam giác đều")
elif a == b or a == c or b == c:
  print("Tam giác cân")
else:
  print("Tam giác thường")

Bài 17: Tính tiền điện theo bậc (ví dụ đơn giản)

kwh = int(input("Số kWh: "))
if kwh <= 50:
  cost = kwh * 1800
elif kwh <= 100:
  cost = 50 * 1800 + (kwh - 50) * 2000
else:
  cost = 50 * 1800 + 50 * 2000 + (kwh - 100) * 2500
print("Tiền điện =", cost)

Bài 18: Nguyên âm hay phụ âm (có kiểm tra hợp lệ)

ch = input("Nhập 1 ký tự: ").lower()
if len(ch) != 1 or not ch.isalpha():
  print("Không hợp lệ")
elif ch in "aeiou":
  print("Nguyên âm")
else:
print("Phụ âm")

Nhóm C: Vòng lặp (Bài 19–30)

Bài 19: Tính tổng 1..n

n = int(input("n: "))
s = 0
for i in range(1, n + 1):
  s += i
print("Tổng =", s)

Bài 20: Tính n! (giai thừa)

n = int(input("n: "))
fact = 1
for i in range(2, n + 1):
  fact *= i
print("n! =", fact)

Bài 21: In bảng cửu chương của n

n = int(input("n: "))
for i in range(1, 11):
  print(f"{n} x {i} = {n*i}")

Bài 22: Đếm số chữ số của một số nguyên

n = abs(int(input("n: ")))
if n == 0:
  print(1)
else:
  count = 0
  while n > 0:
   count += 1
   n //= 10
print(count)

Bài 23: Đảo ngược số nguyên

n = int(input("n: "))
x = abs(n)
rev = 0
while x > 0:
  rev = rev * 10 + x % 10
x //= 10
  print(-rev if n < 0 else rev)

Bài 24: Kiểm tra số nguyên tố

n = int(input("n: "))
if n < 2:
  print("Không phải SNT")
else:
  for i in range(2, int(n**0.5) + 1):
      if n % i == 0:
          print("Không phải SNT")
          break
    else:
print("Là SNT")

Bài 25: Liệt kê các số nguyên tố ≤ n

n = int(input("n: "))
for x in range(2, n + 1):
  ok = True
  for i in range(2, int(x**0.5) + 1):
       if x % i == 0:
         ok = False
         break
 if ok:
  print(x, end=" ")

Bài 26: Tìm UCLN (GCD) – Euclid

a = int(input("a: "))
b = int(input("b: "))
a, b = abs(a), abs(b)
while b:
  a, b = b, a % b
 print("GCD =", a)

Bài 27: Tìm BCNN (LCM)

a = int(input("a: "))
b = int(input("b: "))
x, y = abs(a), abs(b)
while y:
    x, y = y, x % y
gcd = x
lcm = abs(a * b) // gcd
if gcd != 0 else 0
print("LCM =", lcm)

Bài 28: Tính tổng các chữ số

n = abs(int(input("n: ")))
s = 0
while n:
   s += n % 10
   n //= 10
print("Tổng chữ số =", s)

Bài 29: In dãy Fibonacci n phần tử

n = int(input("n: "))
a, b = 0, 1
for _ in range(n):
    print(a, end=" ")
    a, b = b, a + b

Bài 30: Tìm số hoàn hảo ≤ n

n = int(input("n: "))
for x in range(2, n + 1):
   s = 1
   for i in range(2, int(x**0.5) + 1):
        if x % i == 0:
            s += i
            if i != x // i:
                   s += x // i
    if x > 1 and s == x:
         print(x, end=" ")

Nhóm D: Chuỗi (Bài 31–38)

Bài 31: Đếm số ký tự trong chuỗi

s = input("Chuỗi: ")
print(len(s))

Bài 32: Đếm nguyên âm

s = input("Chuỗi: ").lower()
count = sum(1 for ch in s if ch in "aeiou")
print(count)

Bài 33: Kiểm tra chuỗi đối xứng

s = input("Chuỗi: ")
print("Đối xứng" if s == s[::-1] else "Không đối xứng")

Bài 34: Chuẩn hóa họ tên

name = input("Họ tên: ").strip().lower()
parts = name.split()
print(" ".join(p.capitalize() for p in parts))

Bài 35: Đếm số từ

s = input("Chuỗi: ").strip()
print(len(s.split()) if s else 0)

Bài 36: Ký tự xuất hiện nhiều nhất

s = input("Chuỗi: ")
if not s:
   print("Chuỗi rỗng")
else:
  freq = {}
   for ch in s:
     freq[ch] = freq.get(ch, 0) + 1
  best = max(freq, key=freq.get)
  print(best, freq[best])

Bài 37: Loại bỏ chữ số trong chuỗi

s = input("Chuỗi: ")
print("".join(ch for ch in s if not ch.isdigit()))

Bài 38: Mã hóa Caesar dịch 3 ký tự

s = input("Chuỗi: ")
out = []
for ch in s:
  if 'a' <= ch <= 'z':
       out.append(chr((ord(ch) - 97 + 3) % 26 + 97))
  elif 'A' <= ch <= 'Z':
      out.append(chr((ord(ch) - 65 + 3) % 26 + 65))
  else:
      out.append(ch)
print("".join(out))

Nhóm E: List/Tuple (Bài 39–44)

Bài 39: Tính tổng list

arr = list(map(int, input("Nhập các số: ").split()))
print(sum(arr))

Bài 40: Max/Min

arr = list(map(int, input().split()))
print("Max:", max(arr))
print("Min:", min(arr))

Bài 41: Sắp xếp tăng/giảm

arr = list(map(int, input().split()))
print(sorted(arr))
print(sorted(arr, reverse=True))

Bài 42: Loại bỏ trùng (giữ thứ tự)

arr = list(map(int, input().split()))
seen = set()
res = []
for x in arr:
     if x not in seen:
          seen.add(x)
          res.append(x)
print(res)

Bài 43: Tách chẵn/lẻ

arr = list(map(int, input().split()))
even = [x for x in arr if x % 2 == 0]
odd = [x for x in arr if x % 2 != 0]
print("Chẵn:", even)
print("Lẻ:", odd)

Bài 44: Phần tử xuất hiện nhiều nhất

arr = list(map(int, input().split()))
freq = {}
for x in arr:
    freq[x] = freq.get(x, 0) + 1
best = max(freq, key=freq.get)
print(best, freq[best])

Nhóm F: Dict/Set (Bài 45–47)

Bài 45: Đếm tần suất từ trong câu

words = input("Nhập câu: ").lower().split()
freq = {}
for w in words:
    freq[w] = freq.get(w, 0) + 1
print(freq)

Bài 46: Gộp 2 dict (cộng giá trị nếu trùng key)

d1 = {"a": 2, "b": 3}
d2 = {"b": 4, "c": 1}
res = dict(d1)
for k, v in d2.items():
     res[k] = res.get(k, 0) + v
print(res)

Bài 47: Giao và hợp của 2 set

a = set(map(int, input("Set A: ").split()))
b = set(map(int, input("Set B: ").split()))
print("Giao:", a & b)
print("Hợp:", a | b)

Nhóm G: Hàm (Bài 48–49)

Bài 48: Hàm kiểm tra số nguyên tố

def is_prime(n: int) -> bool:
     if n < 2:
          return False
    for i in range(2, int(n**0.5) + 1):
         if n % i == 0:
             return False
    return True

Bài 49: Hàm tính GCD

def gcd(a: int, b: int) -> int:
     a, b = abs(a), abs(b)
     while b:
           a, b = b, a % b
    return a

Nhóm H: Mini Project (Bài 50)

Bài 50: Quản lý danh sách điểm

scores = list(map(float, input("Nhập điểm: ").split()))
if not scores:
    print("Danh sách rỗng")
else:
    avg = sum(scores) / len(scores)
    mx = max(scores)
    mn = min(scores)
    pass_count = sum(1 for x in scores if x >= 5)
    print("Điểm TB:", round(avg, 2))
    print("Cao nhất:", mx)
    print("Thấp nhất:", mn)
    print("Số điểm >= 5:", pass_count)

Test case

  • Input: 3 5 7.5 10

  • Output:

    • Điểm TB: 6.38

    • Cao nhất: 10

    • Thấp nhất: 3

    • Số điểm >= 5: 3

Lỗi thường gặp

  • Không xử lý list rỗng.

  • Nhập ký tự chữ gây lỗi ép kiểu.


Câu hỏi thường gặp (FAQ)

Người mới học Python nên làm bao nhiêu bài tập là đủ?

Khoảng 50–100 bài cơ bản là đủ để bạn vững nền. Quan trọng là bạn làm lại bài sai và thử biến thể.

Có nên chép lời giải không?

Không nên chép ngay. Hãy tự làm trước, rồi xem lời giải để sửa tư duy, sau đó đóng lại và viết lại.

Làm sao biết code đúng khi luyện tập?

Hãy tạo test case gồm trường hợp bình thường và trường hợp biên (0, âm, chuỗi rỗng, list rỗng…). So sánh output mong đợi với output thực tế.

Học Python cơ bản theo thứ tự nào để không bị loạn?

Hãy theo lộ trình: nhập xuất → if/else → vòng lặp → chuỗi → list/dict → hàm → mini project.

Vì sao input() cần ép kiểu?

input() trả về chuỗi. Nếu không ép kiểu, bạn sẽ nối chuỗi thay vì cộng số.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *