CodeGym Đà Nẵng
  • Khoá học
    • Khóa AI Engineer
    • Java Web Fulltime
    • Java Web Fullstack Parttime
    • Python Web Fulltime
    • >>Xem tất cả khóa học
  • Lịch khai giảng
  • Blog lập trình
    • Kiến thức chuyên môn
    • Tin công nghệ
  • Tin tức
    • Học viên
    • Tuyển dụng
  • Về chúng tôi
    • Tại sao nên chọn CodeGym Đà Nẵng
    • Thông tin tuyển sinh
    • Mô hình Coding Bootcamp
    • Báo chí nói gì?
    • Câu hỏi thường gặp
    • Hình ảnh hoạt động
    • Đối tác tuyển dụng
    • Thông tin liên hệ
Chọn trang

100+ bài tập Python có lời giải (code mẫu)

16/09/2025 | Bài tập lập trình | 0 Lời bình

Trang chủ » Bài tập lập trình » 100+ bài tập Python có lời giải (code mẫu)

Bài tập Python là “đường tắt” giúp bạn nắm chắc cú pháp, rèn tư duy giải quyết vấn đề và làm quen với các tình huống thực tế như xử lý dữ liệu, làm việc với file, hàm, list/dict, OOP hay thao tác thư viện. Từ mức cơ bản đến nâng cao, mỗi bài đều hướng đến mục tiêu học tới đâu chắc tới đó, kèm gợi ý để bạn tự kiểm tra tiến độ. Nếu bạn là người mới, đang ôn thi thực tập hay muốn chuyển ngành, đây là lộ trình luyện tập hiệu quả để lên tay mỗi ngày. Hãy cùng CodeGym Đà Nẵng khám phá bài tập, bứt tốc kỹ năng Python và sẵn sàng cho dự án đầu tay.

Xem thêm: 150+ bài tập Javascript có code mẫu

Nội dung

  • Python là gì?
  • Các cấp độ trong bài tập Python
  • Cấu trúc của bài tập Python
  • 150+ bài tập Python có lời giải chi tiết
    • Cấp độ cơ bản
    • Cấp độ trung cấp
    • Cấp độ nâng cao:

Python là gì?

Python là ngôn ngữ lập trình bậc cao, mã nguồn mở, đa nền tảng, nổi tiếng nhờ cú pháp rõ ràng nên rất dễ đọc, dễ học và dễ ghi nhớ. Ngôn ngữ này do Guido van Rossum phát triển và ra mắt lần đầu năm 1991. Hiện Python được dùng rộng rãi trong nhiều lĩnh vực:

  • Phát triển web: đặc biệt mạnh ở back-end, xây dựng ứng dụng web động, hiệu quả và an toàn.
  • Phát triển phần mềm: đủ linh hoạt cho nhiều loại ứng dụng như phần mềm doanh nghiệp, ứng dụng di động và trò chơi.
  • Khoa học dữ liệu & máy học: hỗ trợ thu thập, xử lý, phân tích dữ liệu và xây dựng mô hình machine learning.
  • Ứng dụng khác: dùng trong hệ thống nhúng, tự động hóa quy trình và viết script phục vụ vận hành.

Bài tập Python

Các cấp độ trong bài tập Python

  • Cấp 1 – Cơ bản: Phù hợp cho người mới đã nắm những khái niệm nền tảng (biến, toán tử, vòng lặp, hàm…). Bài tập tập trung vào tình huống đơn giản, không đòi hỏi kỹ thuật nâng cao.
  • Cấp 2 – Trung cấp: Dành cho người đã quen cấu trúc dữ liệu và thuật toán cơ bản. Nhiệm vụ bắt đầu phức tạp hơn, yêu cầu phối hợp nhiều kiến thức và tư duy giải quyết vấn đề rõ ràng.
  • Cấp 3 – Nâng cao: Hướng tới người có kinh nghiệm, làm việc với cấu trúc dữ liệu/thuật toán nâng cao. Bài tập bám sát bài toán thực tế, khuyến khích sáng tạo và tư duy logic sâu.

Ngoài ra, có thể phân loại theo các tiêu chí khác:

  • Mức độ khó: dễ → trung bình → khó → rất khó.
  • Độ sâu kiến thức: cơ bản → nâng cao → chuyên sâu.
  • Tính thực tiễn: thiên về lý thuyết → gần với thực tế triển khai.

Việc chia cấp giúp bạn chọn bài phù hợp trình độ hiện tại, đồng thời luyện dần ở nhiều nấc để nâng kỹ năng Python một cách hệ thống và hiệu quả.

Cấu trúc của bài tập Python

Mỗi bài tập Python tại đây đều được trình bày theo 3 phần:

  1. Đề bài
  2. Gợi ý cách tiếp cận
  3. Code mẫu tham khảo

Mình giữ nguyên cấu trúc gốc để bạn tiện theo dõi: hãy đọc đề, tham khảo gợi ý và tự giải trước, rồi hãy kéo xuống xem mã mẫu để đối chiếu kết quả.

150+ bài tập Python có lời giải chi tiết

Cấp độ cơ bản

Bài 1: Viết chương trình liệt kê tất cả số nguyên tố nhỏ hơn 100.

Gợi ý:

  • Duyệt n từ 2 đến 99 bằng một vòng lặp.
  • Với mỗi n, kiểm tra tính nguyên tố bằng cách thử chia cho các số từ 2 đến √n (hoặc từ 2 đến n−1 nếu chưa tối ưu).
  • Có thể dùng hai vòng lặp lồng nhau cho cách thử chia cơ bản; nếu muốn tối ưu hơn, cân nhắc áp dụng Sàng Eratosthenes để đánh dấu và in ra các số nguyên tố. 

Code mẫu:

for i in range(2, 100):
is_prime = True
for j in range(2, i):
if i % j == 0:
is_prime = False
break
if is_prime:
print(i)
# 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

Bài 2: Viết chương trình chuyển đổi nhiệt độ giữa độ C và độ F (cả hai chiều).

Gợi ý:

Nhận đầu vào từ người dùng: giá trị nhiệt độ và đơn vị hiện tại (C hoặc F).

Áp dụng công thức chuyển đổi:

  • C → F: F = C × 9/5 + 32
  • F → C: C = (F − 32) × 5/9

In kết quả với định dạng rõ ràng; có thể làm tròn đến 1–2 chữ số thập phân.

Nên xử lý lỗi nhập liệu (ví dụ: ký tự không phải số, đơn vị không hợp lệ).

Code mẫu:

print("Chương trình chuyển đổi nhiệt độ")
print("1. Chuyển đổi từ độ C sang độ F")
print("2. Chuyển đổi từ độ F sang độ C")
lua_chon = input("Nhập lựa chọn của bạn (1 hoặc 2): ")
if lua_chon == "1":
do_c = float(input("Nhập nhiệt độ trong độ C: "))
do_f = (do_c * 9/5) + 32
print(f"{do_c} độ C = {do_f} độ F")
elif lua_chon == "2":
do_f = float(input("Nhập nhiệt độ trong độ F: "))
do_c = (do_f - 32) * 5/9
print(f"{do_f} độ F = {do_c} độ C")
else:
print("Lựa chọn không hợp lệ. Vui lòng chọn 1 hoặc 2.")

Bài 3: Xây dựng chương trình tính tuổi từ ngày sinh người dùng nhập vào.

Gợi ý: Đây là bài toán liên quan tới xử lý thời gian/ngày tháng, vì vậy hãy sử dụng mô-đun datetime (import datetime) để đọc, so khớp và tính chênh lệch ngày.

Code mẫu:

import datetime
print("Mời bạn vui lòng nhập ngày tháng năm sinh để tính tuổi")
birth_day = int(input("Ngày sinh:"))
birth_month = int(input("Tháng sinh:"))
birth_year = int(input("Năm sinh:"))

current_year = datetime.date.today().year
current_month = datetime.date.today().month
current_day = datetime.date.today().day

age_year = current_year - birth_year
age_month = abs(current_month-birth_month)
age_day = abs(current_day-birth_day)

print("### Tuổi của bạn chính xác là:### n", age_year,
" tuổi ", age_month, " tháng và ", age_day, " ngày")

Bài 4: Viết chương trình nhận một chuỗi do người dùng nhập, các phần tử phân tách bằng dấu phẩy, sau đó sắp xếp lại.
Gợi ý: Đây là bài tập thao tác chuỗi kết hợp nhập liệu; hãy split(‘,’) để tách danh sách, strip() để loại khoảng trắng thừa, dùng list.sort() hoặc sorted() để sắp xếp (có thể xét không phân biệt hoa thường bằng key=str.lower), rồi join để in ra kết quả.

Code mẫu:

items = [x for x in input("Nhập một chuỗi: ").split(',')]
items.sort()
print(','.join(items))
# Input: Mạnh,Lâm,Yến,Bách,Tùng,Khánh,Oanh,An
# Output: An,Bách,Khánh,Lâm,Mạnh,Oanh,Tùng,Yến

Bài 5: Viết chương trình đọc tệp theo từng dòng và in ra các số chẵn xuất hiện trong tệp.

Gợi ý: Đây là bài tập thao tác tệp; dùng open(…, ‘r’) và for line in file để duyệt, tách số (bằng split() hoặc re), ép kiểu về int rồi kiểm tra n % 2 == 0 trước khi in.

Code mẫu:

 f = open("testFile.txt", 'r')

for x in f:
num = int(x)
if num % 2 == 0:
print(num)

Bài 6: Liệt kê các số trong khoảng 2000–3200 (bao gồm cả hai đầu) thỏa điều kiện chia hết cho 7 nhưng không đồng thời là bội của 5. In kết quả trên một dòng dưới dạng chuỗi, các số cách nhau bằng dấu phẩy.

Gợi ý: Duyệt dải số bằng for hoặc dùng hiểu list; kiểm tra điều kiện với n % 7 == 0 and n % 5 != 0; thu các giá trị hợp lệ vào danh sách rồi print(‘,’.join(map(str, ds))) để xuất ra đúng định dạng.

Code mẫu:

j=[] #Tạo một danh sách rỗng để lưu kết quả
for i in range(2000, 3201): #Duyệt qua tất cả các số trong đoạn từ 2000 đến 3200
if (i%7==0) and (i%5!=0): #Kiểm tra xem số i có chia hết cho 7 và không phải là bội số của 5 không
j.append(str(i)) #Nếu đúng, thì thêm số i vào danh sách result
print (','.join(j)) #In ra màn hình danh sách result, các phần tử cách nhau bằng dấu phẩy

Bài 7: Viết chương trình tính giai thừa của một số nguyên cho trước. In kết quả dưới dạng chuỗi trên một dòng; nếu có nhiều giá trị, hãy phân tách bằng dấu phẩy. Ví dụ: với đầu vào 8, đầu ra là 40320.

Gợi ý: Có thể nhập số từ người dùng, kiểm tra tính hợp lệ (số nguyên không âm), rồi tính giai thừa bằng vòng lặp, đệ quy hoặc math.factorial. Nên xử lý trường hợp lớn (n ≥ 0), và định dạng kết quả trước khi in.

Code mẫu:

x=int(input("Nhập số cần tính giai thừa:"))
def fact(x):
if x == 0:
return 1
return x * fact(x - 1)
print (fact(x))

Bài 8: Cho một số nguyên n, hãy tạo một dictionary ánh xạ i → i*i với i chạy từ 1 đến n (bao gồm cả 1 và n), sau đó in toàn bộ dictionary.
Ví dụ: Nếu n = 8 thì kết quả: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64}.

Gợi ý: Viết lệnh yêu cầu người dùng nhập số nguyên n, ép kiểu về int. Có thể dùng vòng lặp để thêm từng cặp khóa–giá trị hoặc dùng dictionary comprehension: {i: i*i for i in range(1, n+1)}.

Code mẫu:

n=int(input("Nhập vào một số:"))
d=dict()
for i in range(1,n+1):
d[i]=i*i

print (d)

Bài 9: Nhận một chuỗi các số được ngăn cách bằng dấu phẩy từ bàn phím, sau đó tạo list và tuple chứa toàn bộ phần tử đó và in ra kết quả.

Ví dụ: Nếu nhập 34,67,55,33,12,98 thì xuất ra:

[’34’, ’67’, ’55’, ’33’, ’12’, ’98’]

(’34’, ’67’, ’55’, ’33’, ’12’, ’98’)

Gợi ý: Yêu cầu người dùng nhập chuỗi, dùng split(‘,’) để tách, có thể strip() từng phần tử để loại khoảng trắng; chuyển sang list trực tiếp và dùng tuple(…) để tạo tuple tương ứng.

Code mẫu:

values=input("Nhập vào các giá trị:")
l=values.split(",")
t=tuple(l)
print (l)
print (t)

Bài 10: Xây dựng một lớp (class) với tối thiểu 2 phương thức:

  • getString: Nhận dữ liệu chuỗi người dùng nhập từ bàn phím.
  • printString: In lại chuỗi đã nhập dưới dạng chữ HOA.

Bổ sung kiểm thử đơn giản để xác nhận hai phương thức hoạt động đúng.
Ví dụ: Nếu nhập codegymdanang thì kết quả in ra phải là CODEGYMDANANG,

Gợi ý: Sử dụng __init__ để khởi tạo thuộc tính lưu chuỗi và bảo đảm trạng thái đối tượng sẵn sàng cho việc nhập/xuất.

Code mẫu:

class InputOutString(object):
def __init__(self):
self.s = ""

def getString(self):
self.s = input("Nhập chuỗi:")
def printString(self):
print (self.s.upper())

strObj = InputOutString()
strObj.getString()
strObj.printString()

Bài 11: Viết một phương thức tính bình phương của một số.

Gợi ý: Sử dụng toán tử ** để lũy thừa (ví dụ: x ** 2).

Code mẫu:

x=int(input("Nhập một số:")) #nhập số cần tính bình phương từ giao diện
def square(num): #định nghĩa bình phương của một số
return num ** 2
print (square(2)) #in bình phương của 2
print (square(3)) #in bình phương của 3
print (square(x)) #in bình phương của x

Bài 12: Viết chương trình in phần tài liệu (docstring) của các hàm tích hợp như abs(), int(), input(), đồng thời hiển thị docstring cho một hàm do bạn tự định nghĩa.

Gợi ý: Sử dụng thuộc tính __doc__ để truy xuất mô tả, ví dụ print(abs.__doc__); với hàm tự viết, đặt chuỗi docstring ngay dưới định nghĩa hàm (ba dấu nháy) rồi in your_func.__doc__.

Code mẫu:

print (abs.__doc__)
print (int.__doc__)
print (input.__doc__)
def square(num):
'''Trả lại giá trị bình phương của số được nhập vào.

Số nhập vào phải là số nguyên.
'''
return num ** 2

print (square.__doc__)

Bài 13: Xây dựng một lớp có thuộc tính lớp (class attribute) và thuộc tính đối tượng (instance attribute) trùng tên để minh họa cơ chế “thuộc tính instance che” thuộc tính lớp trên từng đối tượng.

Gợi ý: Khi tạo thuộc tính instance, khai báo trong __init__; bạn có thể truyền giá trị ngay lúc khởi tạo đối tượng hoặc gán sau đó. Hãy in giá trị ở mức lớp và mức đối tượng để quan sát sự khác biệt trong việc tra cứu thuộc tính.

Code mẫu:

class Person:
# Định nghĩa lớp "name"
name = "Person"
def __init__(self, name = None):
# self.name là biến instance
self.name = name

jeffrey = Person("Jeffrey")
print ("%s name is %s" % (Person.name, jeffrey.name))

nico = Person()
nico.name = "Nico"
print ("%s name is %s" % (Person.name, nico.name))

Bài 14: Viết chương trình tính tuổi từ ngày sinh người dùng cung cấp.

Ví dụ: Nhập ngày sinh theo định dạng YYYY/MM/DD, hãy tính và in ra số tuổi hiện tại.

Gợi ý: Dùng mô-đun datetime; lấy ngày hôm nay rồi trừ năm sinh và điều chỉnh nếu sinh nhật năm nay chưa tới (so sánh tháng/ngày).

Code mẫu:

import datetime

print("Mời bạn vui lòng nhập ngày tháng năm sinh để tính tuổi")
birth_day = int(input("Ngày sinh:"))
birth_month = int(input("Tháng sinh:"))
birth_year = int(input("Năm sinh:"))

current_year = datetime.date.today().year
current_month = datetime.date.today().month
current_day = datetime.date.today().day

age_year = current_year - birth_year
age_month = abs(current_month-birth_month)
age_day = abs(current_day-birth_day)

print("### Tuổi của bạn chính xác là:### \n", age_year, " tuổi ", age_month, " tháng và ", age_day, " ngày")

Bài 15: Nhập số giờ làm trong tuần và đơn giá lương theo giờ (mức chuẩn), sau đó tính tổng thu nhập của nhân viên. Quy ước: 44 giờ đầu là giờ chuẩn; mọi giờ vượt chuẩn được trả bằng 150% đơn giá chuẩn.

Code mẫu:

so_gio_lam = float(input("Nhập số giờ làm mỗi tuần: "))
luong_gio = float(input("Nhập thù lao trên mỗi giờ làm tiêu chuẩn: "))

gio_tieu_chuan = 44 # Số giờ làm chuẩn mỗi tuần
gio_vuot_chuan = max(0, so_gio_lam - gio_tieu_chuan) # Số giờ làm vượt chuẩn mỗi tuần
thuc_linh = gio_tieu_chuan * luong_gio + gio_vuot_chuan * luong_gio * 1.5 # Tính tổng thu nhập
print(f"Số tiền thực lĩnh của nhân viên: {thuc_linh}")

Cấp độ trung cấp

Bài 1: Viết chương trình nhận danh sách D (nhập từ bàn phím, các giá trị cách nhau bằng dấu phẩy) và tính Q cho từng phần tử theo công thức Q=2×C×DHQ = \sqrt{\frac{2 \times C \times D}{H}}Q=H2×C×D​​ với hằng số C=50C = 50C=50, H=30H = 30H=30. In các kết quả trên một dòng, ngăn cách bằng dấu phẩy.

Ví dụ: Nếu nhập 100,150,180 thì đầu ra là 18,22,24.

Gợi ý: Đọc chuỗi đầu vào rồi split(‘,’), strip() khoảng trắng, ép từng phần tử sang số; dùng math.sqrt để tính Q, sau đó làm tròn về số nguyên gần nhất bằng round() (ví dụ 26.0 in thành 26). Cuối cùng chuyển về chuỗi và ‘,’.join(…) để xuất kết quả.

Code mẫu:

#!/usr/bin/env python
import math
c=50
h=30
value = []
items=[x for x in input("Nhập giá trị của d: ").split(',')]
for d in items:
value.append(str(int(round(math.sqrt(2*c*float(d)/h)))))
print (','.join(value))

Bài 2: Nhập hai số nguyên X và Y, rồi tạo một ma trận kích thước X×Y sao cho phần tử tại hàng i, cột j có giá trị i * j (với i = 0..X−1, j = 0..Y−1). In toàn bộ ma trận ra màn hình.

Ví dụ: Nếu X = 3, Y = 5 thì kết quả là [[0, 0, 0, 0, 0], [0, 1, 2, 3, 4], [0, 2, 4, 6, 8]].

Gợi ý: Nhận đầu vào từ bàn phím theo định dạng “X,Y”, tách và ép kiểu về int; có thể dựng ma trận bằng list comprehension:
[[i * j for j in range(Y)] for i in range(X)].
Nên kiểm tra hợp lệ (X > 0, Y > 0) trước khi xử lý.

Code mẫu:

input_str = input("Nhập X, Y: ")
dimensions=[int(x) for x in input_str.split(',')]
rowNum=dimensions[0]
colNum=dimensions[1]
multilist = [[0 for col in range(colNum)] for row in range(rowNum)]
for row in range(rowNum):
for col in range(colNum):
multilist[row][col]= row*col
print (multilist)

Bài 3: Nhận một chuỗi các từ do người dùng nhập, các mục cách nhau bằng dấu phẩy, sau đó sắp xếp theo thứ tự bảng chữ cái và in lại thành một chuỗi, các phần tử vẫn ngăn cách bằng dấu phẩy.

Ví dụ: Nếu nhập without,hello,bag,world thì kết quả là bag,hello,without,world.

Gợi ý: Giả định dữ liệu đến từ bàn phím; dùng split(‘,’) để tách, strip() để loại khoảng trắng, sorted() để sắp xếp, rồi ‘,’.join(…) để xuất chuỗi kết quả.

Code mẫu:

items=[x for x in input("Nhập một chuỗi: ").split(',')]
items.sort()
print (','.join(items))

Bài 4: Viết chương trình nhận nhiều dòng văn bản từ bàn phím, chuyển từng dòng sang CHỮ HOA và in ra theo đúng thứ tự, giữ nguyên ngắt dòng.

Gợi ý: Giả định dữ liệu nhập từ giao diện điều khiển; đọc lần lượt từng dòng cho tới khi kết thúc (EOF hoặc gặp dòng trống để dừng), áp dụng str.upper() cho mỗi dòng rồi in ra. Nên loại bỏ ký tự xuống dòng thừa trước khi xử lý nếu cần.

Code mẫu:

lines = []
while True:
s = input()
if s:
lines.append(s.upper())
else:
break;
for sentence in lines:
print (sentence)

Bài 5: Nhận một chuỗi gồm các từ cách nhau bằng khoảng trắng, loại bỏ từ trùng lặp, sắp xếp theo thứ tự bảng chữ cái rồi in kết quả.
Ví dụ: Đầu vào hello world and practice makes perfect and hello world again → đầu ra again and hello makes perfect practice world.

Gợi ý: Dùng set để khử trùng lặp, sau đó sorted() để sắp xếp; cuối cùng nối lại bằng một khoảng trắng và in ra.

Code mẫu:

s = input("Nhập chuỗi của bạn: ")
words = [word for word in s.split(" ")]
print (" ".join(sorted(list(set(words)))))

Bài 6: Nhận một chuỗi các số nhị phân 4 ký tự, các mục cách nhau bằng dấu phẩy; kiểm tra số nào chia hết cho 5 và in ra các số thỏa điều kiện dưới dạng chuỗi phân tách bằng dấu phẩy.
Ví dụ: Đầu vào 0100,0011,1010,1001 → Kết quả 1010.

Gợi ý: Đọc chuỗi từ bàn phím, split(‘,’) để tách; xác thực mỗi mục dài 4 và chỉ gồm 0/1. Dùng int(b, 2) % 5 == 0 để kiểm tra; thu các số hợp lệ rồi ‘,’.join(…) để xuất.

Code mẫu:

value = []
items=[x for x in input("Nhập các số nhị phân: ").split(',')]
for p in items:
intp = int(p, 2)
if not intp%5:
value.append(p)
print (','.join(value))

Bài 7: Tìm tất cả các số trong khoảng 1000–3000 (bao gồm cả 1000 và 3000) mà mọi chữ số đều là số chẵn, rồi in chúng trên một dòng dưới dạng chuỗi, các phần tử cách nhau bằng dấu phẩy.

Gợi ý: Duyệt range(1000, 3001), chuyển mỗi số thành chuỗi và kiểm tra all(ch in ‘02468’ for ch in s); gom các số đạt điều kiện vào danh sách, sau đó print(‘,’.join(map(str, ds))).

Code mẫu:

values = []
for i in range(1000, 3001):
s = str(i)
if (int(s[0])%2==0) and (int(s[1])%2==0) and (int(s[2])%2==0) and (int(s[3])%2==0):
values.append(s)
print (",".join(values))

Bài 8: Viết chương trình nhận một câu và thống kê số ký tự chữ cùng số ký tự số trong câu đó.
Ví dụ: Với đầu vào hello world! 123 → Kết quả:
Số chữ cái là: 10
Số chữ số là: 3

Gợi ý: Duyệt từng ký tự và dùng str.isalpha() để nhận biết chữ, str.isdigit() để nhận biết số; có thể cộng dồn bằng biến đếm hoặc dùng sum(…).

Code mẫu:

s = input("Nhập câu của bạn: ")
d={"DIGITS":0, "LETTERS":0}
for c in s:
if c.isdigit():
d["DIGITS"]+=1
elif c.isalpha():
d["LETTERS"]+=1
else:
pass
print ("Số chữ cái là:", d["LETTERS"])
print ("Số chữ số là:", d["DIGITS"])

Bài 9: Viết chương trình nhận một câu và đếm số chữ in hoa và chữ in thường trong câu.
Ví dụ: Với đầu vào Quản Trị Mạng → Kết quả:
Chữ hoa: 3
Chữ thường: 8

Gợi ý: Duyệt từng ký tự; dùng str.isupper() để nhận biết chữ hoa và str.islower() cho chữ thường, cộng dồn vào hai biến đếm rồi in ra.

Code mẫu:

s = input("Nhập câu của bạn: ")
d={"UPPER CASE":0, "LOWER CASE":0}
for c in s:
if c.isupper():
d["UPPER CASE"]+=1
elif c.islower():
d["LOWER CASE"]+=1
else:
pass
print ("Chữ hoa:", d["UPPER CASE"])
print ("Chữ thường:", d["LOWER CASE"])

Bài 10: Viết chương trình tính tổng a+aa+aaa+aaaaa + aa + aaa + aaaaa+aa+aaa+aaaa với aaa là chữ số do người dùng nhập.
Ví dụ: Nếu a=1a = 1a=1 thì kết quả là 1234 (vì 1+11+111+1111=12341 + 11 + 111 + 1111 = 12341+11+111+1111=1234).

Gợi ý: Nhận đầu vào là một ký tự số, có thể dựng các hạng tử bằng thao tác chuỗi (str(a) * k rồi ép về int) hoặc dùng công thức cộng dồn trong vòng lặp từ 1 đến 4.

Code mẫu:

a = input("Nhập số a: ")
n1 = int( "%s" % a )
n2 = int( "%s%s" % (a,a) )
n3 = int( "%s%s%s" % (a,a,a) )
n4 = int( "%s%s%s%s" % (a,a,a,a) )
print ("Tổng cần tính là: ",n1+n2+n3+n4)

Bài 11: Nhận một dãy số người dùng nhập (các phần tử cách nhau bằng dấu phẩy), lọc ra các số lẻ và in lại thành chuỗi phân tách bằng dấu phẩy.
Ví dụ: Với đầu vào 1,2,3,4,5,6,7,8,9 → Kết quả 1,3,5,7,9.
Gợi ý: Tách chuỗi bằng split(‘,’), ép từng phần tử sang int, lọc với list comprehension n % 2 == 1 (hoặc filter), rồi dùng ‘,’.join(map(str, …)) để xuất kết quả.

Code mẫu:

values = input("Nhập dãy số của bạn, cách nhau bởi dấu phẩy: ")
numbers = [x for x in values.split(",") if int(x)%2!=0]
print (",".join(numbers))

Bài 12: Tính số dư tài khoản ngân hàng từ nhật ký giao dịch người dùng nhập vào.

Định dạng nhật ký: Mỗi dòng gồm một lệnh và số tiền, trong đó D x là nộp tiền và W y là rút tiền (x, y là số dương).

Ví dụ đầu vào:

  • D 300
  • D 300
  • W 200
  • D 100

Kết quả: 500

Gợi ý: Khởi tạo balance = 0, đọc lần lượt từng dòng đến EOF, tách lệnh và số, với D thì cộng, W thì trừ. Nên kiểm tra hợp lệ đầu vào (thiếu số tiền, ký tự lệnh sai, số âm) trước khi cập nhật và cuối cùng in ra số dư.

Code mẫu:

import sys
netAmount = 0
while True:
s = input("Nhập nhật ký giao dịch: ")
if not s:
break
values = s.split(" ")
operation = values[0]
amount = int(values[1])
if operation=="D":
netAmount+=amount
elif operation=="W":
netAmount-=amount
else:
pass
print (netAmount)

Bài 13: Viết chương trình nhận một dãy số nguyên, kiểm tra dãy có đối xứng (palindrome) hay không; nếu chưa, hãy biến đổi để thu được một dãy đối xứng.

Gợi ý:

  • Tạo hàm kiem_tra_doi_xung(seq) so sánh dãy với bản đảo seq[::-1]. Bằng nhau → đối xứng.
  • Nếu không đối xứng, dùng kỹ thuật hai con trỏ: i = 0, j = n-1. Duyệt tới khi i < j:
    • Nếu seq[i] != seq[j], gán một bên theo bên còn lại (ví dụ seq[j] = seq[i]) để phản chiếu cặp phần tử.
    • Tăng i += 1, giảm j -= 1.
  • Hàm sx_doi_xung(seq) thực hiện quy trình trên và trả về dãy đã được “soi gương”.
  • Lưu ý: Xử lý cả độ dài chẵn/lẻ; xác thực dữ liệu đầu vào là số nguyên; có thể đếm số lần chỉnh sửa nếu cần báo cáo mức thay đổi.

Code mẫu:

def kiem_tra_doi_xung(lst):
return lst == lst[::-1]

def sx_doi_xung(lst):
if kiem_tra_doi_xung(lst):
return lst
else:
for i in range(len(lst)//2):
if lst[i] != lst[-i-1]:
for j in range(i+1, len(lst)):
if lst[j] == lst[-i-1]:
lst[i], lst[j] = lst[j], lst[i]
break
return lst

lst = list(map(int, input("Nhập dãy số nguyên, cách nhau bởi dấu cách: ").split()))

if kiem_tra_doi_xung(lst):
print("Dãy số đã đối xứng.")
else:
new_lst = sx_doi_xung(lst)
if kiem_tra_doi_xung(new_lst):
print("Dãy số đã khả đối xứng và biến đổi thành dãy số đối xứng: ", new_lst)
else:
print("Dãy số không khả đối xứng.")

Bài 14: Nhập từ bàn phím một ma trận số thực A kích thước m×n, rồi thực hiện:
a) Xác định giá trị lớn nhất và nhỏ nhất trên mỗi cột.
b) Tìm giá trị lớn nhất và nhỏ nhất của toàn bộ ma trận kèm chỉ số (hàng, cột) của từng phần tử này.
c) Đếm số lượng phần tử trong A có giá trị đúng bằng giá trị lớn nhất.

Gợi ý:

  • Sử dụng NumPy để khởi tạo và thao tác với ma trận: import numpy as np.
  • Lấy cực trị theo cột: np.max(A, axis=0) và np.min(A, axis=0).
  • Cực trị toàn cục: A.max() và A.min(); vị trí dùng np.argmax(A)/np.argmin(A) kết hợp np.unravel_index(…, A.shape) để chuyển về tọa độ 2 chiều.
  • Đếm số phần tử bằng giá trị lớn nhất: (A == A.max()).sum().
  • Khi nhập dữ liệu, nên chuẩn hóa về float, kiểm tra kích thước m, n hợp lệ trước khi dựng ma trận.

Code mẫu:

# Hàm nhập mảng A từ bàn phím
def input_array(m, n):
A = []
for i in range(m):
row = list(map(float, input(f"Nhập hàng {i+1}, cách nhau bởi dấu cách: ").split()))
A.append(row)
return A

# Hàm tìm giá trị lớn nhất và nhỏ nhất trên mỗi cột của mảng A
def find_max_min_per_col(A):
m, n = len(A), len(A[0])
max_per_col = [max([A[i][j] for i in range(m)]) for j in range(n)]
min_per_col = [min([A[i][j] for i in range(m)]) for j in range(n)]
return max_per_col, min_per_col

# Hàm tìm phần tử lớn nhất và nhỏ nhất của mảng A cùng các chỉ số hàng và cột
def find_max_min_index(A):
max_val, min_val = A[0][0], A[0][0]
max_row, max_col, min_row, min_col = 0, 0, 0, 0
m, n = len(A), len(A[0])
for i in range(m):
for j in range(n):
if A[i][j] > max_val:
max_val = A[i][j]
max_row, max_col = i, j
if A[i][j] < min_val:
min_val = A[i][j]
min_row, min_col = i, j
return max_val, max_row, max_col, min_val, min_row, min_col

# Hàm đếm số phần tử trong mảng A bằng phần tử lớn nhất
def count_max_value(A):
max_val = max([max(row) for row in A])
count = 0
for row in A:
count += row.count(max_val)
return count

# Nhập mảng A từ bàn phím
m, n = map(int, input("Nhập số hàng và số cột của mảng A, cách nhau bởi dấu cách: ").split())
A = input_array(m, n)

# Tìm giá trị lớn nhất và nhỏ nhất trên mỗi cột của mảng A
max_per_col, min_per_col = find_max_min_per_col(A)
print("Giá trị lớn nhất trên mỗi cột: ", max_per_col)
print("Giá trị nhỏ nhất trên mỗi cột: ", min_per_col)

# Tìm phần tử lớn nhất và nhỏ nhất của mảng A cùng các chỉ số hàng và cột
max_val, max_row, max_col, min_val, min_row, min_col = find_max_min_index(A)
print(f"Phần tử lớn nhất: {max_val}, hàng: {max_row+1}, cột: {max_col+1}")
print(f"Phần tử nhỏ nhất: {min_val}, hàng: {min_row+1}, cột: {min_col+1}")

# Đếm số phần tử trong mảng
count = count_max_value(A)
print(f"Số phần tử bằng giá trị lớn nhất ({max_val}) trong mảng A: {count}")

Cấp độ nâng cao:

Bài 1: Đọc tệp và sắp xếp dữ liệu theo nhiều tiêu chí.

Gợi ý: Hãy lưu mỗi bản ghi vào một danh sách các tuple (hoặc dict). Khi cần sắp xếp đa khóa, dùng operator.itemgetter(…) hoặc tham số key=lambda x: (x[k1], x[k2], …) của sorted(). Có thể kết hợp reverse= tùy tiêu chí.

Code mẫu:

from operator import itemgetter
l = []
f = open("testFile.txt", 'r')
for x in f:
l.append(tuple(x.replace("n", "").split(",")))

print(sorted(l, key=itemgetter(0, 1, 2)))

# testFile.txt
# Anh,10,20
# Bình,9,8
# Lâm,1,4
# Anh,11,20
# Tâm,4,6
# Bình,9,7
# output

# [('Anh', '10', '20'), ('Anh', '11', '20'), ('Bình', '9', '7'), ('Bình', '9', '8'), ('Lâm', '1', '4'), ('Tâm', '4', '6')]

Bài 2: In ra n phần tử đầu tiên của dãy Fibonacci.

Gợi ý: Đây là bài điển hình về đệ quy; xác định điều kiện dừng rõ ràng (F0 = 0, F1 = 1) và vị trí lời gọi đệ quy. Có thể bổ sung memoization để tránh lặp tính, hoặc chuyển sang vòng lặp nếu muốn tối ưu thời gian.

Code mẫu:

def fibonacci(n):
if n == 1:
return 0
elif n == 2:
return 1
else:
return fibonacci(n - 1) + fibonacci(n - 2)

def print_fibonacci_series(n):
print("Dãy Fibonacci:")
for i in range(1, n + 1):
print(fibonacci(i), end=" ")

n_terms = 10
print_fibonacci_series(n_terms)

# Dãy Fibonacci:
# 0 1 1 2 3 5 8 13 21 34

Bài 3: Viết chương trình kiểm tra một mật khẩu có hợp lệ hay không theo các tiêu chí sau.

Tiêu chí kiểm tra:

  • Độ dài từ 6 đến 12 ký tự.
  • Có ít nhất một chữ thường [a-z].
  • Có ít nhất một chữ hoa [A-Z].
  • Có ít nhất một chữ số [0-9].
  • Có ít nhất một ký tự đặc biệt trong nhóm [$#@].
  • (Khuyến nghị) Chỉ cho phép các ký tự thuộc tập [A-Za-z0-9$#@].

Gợi ý: Dạng bài toán kiểm tra định dạng chuỗi đầu vào. Hãy dùng mô-đun re với lookahead và re.fullmatch, ví dụ mẫu kiểm tra tổng quát:
(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$#@])[A-Za-z\d$#@]{6,12}.
Có thể kiểm nhiều mật khẩu một lượt bằng cách tách chuỗi nhập theo dấu phẩy, duyệt từng phần tử và in kết quả đạt/không đạt.

Code mẫu:

import re

def check_password(p):
if len(p) < 6 or len(p) > 12:
return False
if not re.search("[a-z]", p):
return False
elif not re.search("[0-9]", p):
return False
elif not re.search("[A-Z]", p):
return False
elif not re.search("[$#@]", p):
return False
elif re.search("s", p):
return False
else:
return True

print("ABd1234@1: ", check_password("ABd1234@1"))
print("a@F1#: ", check_password("a@F1#"))
print("2w3E*: ", check_password("2w3E*"))
print("2We3345: ", check_password("2We3345"))
# ABd1234@1: True
# a@F1#: False
# 2w3E*: False
# 2We3345: False

Bài 4: Viết chương trình thống kê tần suất xuất hiện của từng từ trong chuỗi đầu vào.

Gợi ý: Tách chuỗi thành các token (xử lý chuẩn hóa như chuyển về chữ thường, loại dấu câu), rồi đếm số lần xuất hiện. Có thể dùng collections.Counter hoặc tự dùng dictionary để cộng dồn. Tùy nhu cầu, sắp xếp kết quả theo từ (alphabet) hoặc theo tần suất trước khi in ra.

Code mẫu:

freq = {}
line = input()
for word in line.split():
freq[word] = freq.get(word, 0)+1
words = sorted(freq.keys())
for w in words:
print("%s:t%d" % (w, freq[w]))

# bài tập python level cơ bản đến nâng cao python bài tập python cơ bản python nâng cao

# bài: 2
# bản: 2
# cao: 2
# cơ: 2
# level: 1
# nâng: 2
# python: 4
# tập: 2
# đến: 1

Bài 5: Triển khai ví dụ kế thừa phương thức trong một lớp.

Gợi ý: Tạo lớp HinhChuNhat với thuộc tính chieu_dai, chieu_rong và hai phương thức tinh_dien_tich, tinh_chu_vi. Sau đó xây lớp HinhVuong kế thừa HinhChuNhat, nhận đầu vào canh_hv, gọi lại (hoặc ghi đè nếu cần) các phương thức đã thừa hưởng từ lớp cha để tính diện tích và chu vi.

Code mẫu:

class HinhChuNhat:
def __init__(self, chieu_dai, chieu_rong):
self.chieu_dai = chieu_dai
self.chieu_rong = chieu_rong

def tinh_dien_tich(self):
return self.chieu_dai * self.chieu_rong

def tinh_chu_vi(self):
return 2 * (self.chieu_dai + self.chieu_rong)
class HinhVuong(HinhChuNhat):
def __init__(self, canh_hv):
self.chieu_dai = canh_hv
self.chieu_rong = canh_hv

hinh = HinhVuong(5)
print("Diện tích:", hinh.tinh_dien_tich())
print("Chu vi:", hinh.tinh_chu_vi())
# Diện tích: 25
# Chu vi: 20/* Your code... */

Bài 6: Viết chương trình kiểm tra tính hợp lệ của mật khẩu người dùng theo bộ tiêu chí cho trước. Chương trình nhận một chuỗi gồm nhiều mật khẩu, phân tách bằng dấu phẩy, và in ra những mật khẩu đạt yêu cầu (giữ nguyên thứ tự, cách nhau bằng dấu phẩy).

Tiêu chí hợp lệ:

  1. Có ít nhất một chữ thường [a-z].
  2. Có ít nhất một chữ số [0-9].
  3. Có ít nhất một chữ hoa [A-Z].
  4. Có ít nhất một ký tự đặc biệt trong nhóm [$#@].
  5. Độ dài tối thiểu 6 ký tự.
  6. Độ dài tối đa 12 ký tự.

Ví dụ: Đầu vào ABd1234@1,a F1#,2w3E*,2We3345 → Đầu ra ABd1234@1.

Gợi ý: Dùng mô-đun re để kiểm tra từng mật khẩu, có thể áp dụng biểu thức tổng hợp với lookahead, ví dụ:
(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$#@])[A-Za-z\d$#@]{6,12}.
Tách chuỗi theo dấu phẩy, loại khoảng trắng thừa, lọc những mục khớp mẫu và join để in kết quả.

Code mẫu:

import re
value = []
items=[x for x in input("Nhập mật khẩu: ").split(',')]
for p in items:
if len(p)<6 or len(p)>12:
continue
else:
pass
if not re.search("[a-z]",p):
continue
elif not re.search("[0-9]",p):
continue
elif not re.search("[A-Z]",p):
continue
elif not re.search("[$#@]",p):
continue
elif re.search("\s",p):
continue
else:
pass
value.append(p)
print (",".join(value))

Bài 7: Viết chương trình nhận các bộ dữ liệu dạng tuple (name, age, score) từ bàn phím và sắp xếp tăng dần theo name, rồi age, rồi score (ưu tiên: tên > tuổi > điểm).

Ví dụ (đầu vào từng dòng):

Tom,19,80

John,20,90

Jony,17,91

Jony,17,93

Json,21,85

Thì đầu ra sẽ là:

[(‘John’, ’20’, ’90’), (‘Jony’, ’17’, ’91’), (‘Jony’, ’17’, ’93’), (‘Json’, ’21’, ’85’), (‘Tom’, ’19’, ’80’)]

Gợi ý: Đọc từng dòng, tách bằng dấu phẩy, chuẩn hóa thành tuple. Khi sắp xếp, nên ép age và score sang số để so đúng giá trị (ví dụ key=lambda x: (x[0], int(x[1]), int(x[2]))) hoặc dùng operator.itemgetter nếu đã đảm bảo kiểu dữ liệu phù hợp.

Code mẫu:

from operator import itemgetter, attrgetter
l = []
while True:
s = input()
if not s:
break
l.append(tuple(s.split(",")))

print (sorted(l, key=itemgetter(0,1,2)))

Bài 8: Định nghĩa một lớp có generator sinh các số trong đoạn từ 0 đến n (bao gồm n) sao cho chia hết cho 7.

Gợi ý: Sử Dụng yield trong một phương thức generator (ví dụ gen(self, n) hoặc cài __iter__). Có thể duyệt range(0, n + 1, 7) để phát từng giá trị, hoặc lặp qua range(n + 1) và chỉ yield khi i % 7 == 0.

Code mẫu:

def putNumbers(n):
i = 0
while i<n:
j=i
i=i+1
if j%7==0:
yield j
for i in putNumbers (100):
print (i)

Bài 9: Viết chương trình đọc các lệnh di chuyển của robot trên mặt phẳng, bắt đầu từ tọa độ (0,0). Mỗi lệnh có dạng UP/DOWN/LEFT/RIGHT k, trong đó k là số bước. Sau khi xử lý toàn bộ lệnh, tính khoảng cách từ vị trí cuối về điểm xuất phát và in ra số nguyên gần nhất.

UP 5

DOWN 3

LEFT 3

RIGHT 3

Các con số sau phía sau hướng di chuyển chính là số bước đi. Hãy viết chương trình để tính toán khoảng cách từ vị trí hiện tại đến vị trí đầu tiên, sau khi robot đã di chuyển một quãng đường. Nếu khoảng cách là một số thập phân chỉ cần in só nguyên gần nhất.

Ví dụ: Nếu tuple sau đây là input của chương trình:

UP 5

DOWN 3

LEFT 3

RIGHT 2

thì đầu ra sẽ là 2.

Gợi ý: Trong trường hợp dữ liệu đầu vào được nhập vào chương trình nó nên được giả định là dữ liệu được người dùng nhập vào từ giao diện điều khiển.

Code mẫu:

import math
pos = [0,0]
while True:
s = input()
if not s:
break
movement = s.split(" ")
direction = movement[0]
steps = int(movement[1])
if direction=="UP":
pos[0]+=steps
elif direction=="DOWN":
pos[0]-=steps
elif direction=="LEFT":
pos[1]-=steps
elif direction=="RIGHT":
pos[1]+=steps
else:
pass
print (int(round(math.sqrt(pos[1]**2+pos[0]**2))))

Bài 10: Viết chương trình tính tần suất các từ từ input. Output được xuất ra sau khi đã sắp xếp theo bảng chữ cái.

Giả sử input là: New to Python or choosing between Python 2 and Python 3? Read Python 2 or Python 3.

Thì output phải là:

2:2

3.:1

3?:1

New:1

Python:5

Read:1

and:1

between:1

choosing:1

or:2

to:1

Gợi ý: Trong trường hợp dữ liệu đầu vào được cung cấp cho câu hỏi, nó phải được giả định là một input được nhập từ giao diện điều khiển.

Code mẫu:

freq = {} # frequency of words in text
line = input()
for word in line.split():
freq[word] = freq.get(word,0)+1
words = sorted(freq.keys())
for w in words:
print ("%s:%d" % (w,freq[w]))

Đăng ký ngay để được tư vấn miễn phí

10 + 11 =

Tags: ài tập python trung cấp, bài tập file python, bài tập lập trình python, bài tập python, bài tập python cơ bản, bài tập python có lời giải, bài tập python nâng cao, đáp án bài tập python, luyện tập python

0 Lời bình

Gửi Lời bình Hủy

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 *

BÀI VIẾT LIÊN QUAN

150+ bài tập JavaScript cơ bản kèm lời giải chi tiết

150+ bài tập JavaScript cơ bản kèm lời giải chi tiết

Group IT CodeGym

Tham gia Group Vũ trụ IT

Danh Mục

  • Báo chí nói về CodeGym
  • Tin tức
  • Học Lập Trình Tại Đà Nẵng
  • Bài Test đánh giá năng lực học lập trình
  • Bài viết chuyên môn
  • Học viên CodeGym Đà Nẵng
  • Tuyển dụng

BẠN MUỐN HỌC LẬP TRÌNH?

GỌI NGAY

0906 566 078

Nhận tư vấn, định hướng 1-1

Điền và gửi thông tin cá nhân để được tư vấn miễn phí về các chương trình học.

7 + 15 =

CÔNG TY CỔ PHẦN CODEGYM ĐÀ NẴNG

Địa chỉ: Tầng 7 số 295 Nguyễn Tất Thành, Phường Hải Châu, Thành phố Đà Nẵng

Hotline: 0906 566 078

Email: danang@codegym.vn