Bài tập Python từ cơ bản đến nâng cao (có lời giải)

2230

Python là một ngôn ngữ lập trình bậc cao, mã nguồn mở được sử dụng rộng rãi trong nhiều lĩnh vực khác nhau, vì thế mà nhu cầu học để trở thành lập trình viên Python ngày càng lớn. Để học bất cứ ngôn ngữ lập trình nào thì việc tối quan trọng là cần phải thực hành nhiều nhất có thể. Bài viết hôm nay mình sẽ giúp các bạn phân loại, giải quyết các bài tập Python theo cấp độ từ cơ bản đến nâng cao thông qua các ví dụ cụ thể nhé.

Cấp độ lập trình Python

Lập trình Python thông thường được chia thành 3 cấp độ: Beginner, Intermediate và Advanced; tương ứng với đó là các kiến thức liên quan đến Python sẽ được áp dụng vào thực tế. Ở level Beginner, chúng ta tập trung vào các khái niệm cơ bản, về kiểu dữ liệu, cách viết hàm và một số thư viện cơ bản trong Python. Khi đã nắm vững được những kiến thức này thì chúng ta sẽ tiếp tục học về lập trình hàm, lập trình hướng đối tượng, cách làm việc với APIs,… ở level Intermediate. Level này tương đương với phần đông các lập trình viên đang sử dụng Python cho công việc của mình, có thể tham gia vào dự án thực tế.

Bài tập Python

Khi đã thành thạo với Python, trải qua thời gian, trang bị đủ kinh nghiệm làm việc với ngôn ngữ này; bạn có thể cần tìm hiểu thêm các kiến thức chuyên môn sâu hơn về xử lý bất đồng bộ, về tối ưu hóa ứng dụng, về bảo mật hay các lĩnh vực chuyên sâu như khoa học xử lý dữ liệu với Python. Level này bạn có thể tự tin rằng mình đã advanced với Python, sử dụng nó như một công cụ để xây dựng cả hệ thống cho mình hay dự án. 

Bài tập lập trình Python

Ở 2 level đầu khi bạn mới vừa mới tiếp xúc với Python cũng như cần tìm hiểu thêm về các thư viện, cách lập trình ngôn ngữ này thì bài tập lập trình Python là cần thiết giúp bạn luyện tập, trau dồi kỹ năng viết code của mình. Vì thế, mình sẽ chia bài tập lập trình Python ra thành 2 mức độ chính, bao gồm:

  • Cấp độ cơ bản: dành cho những người mới bắt đầu, giúp làm quen với ngôn ngữ, kiểu dữ liệu, cách viết hàm, gọi hàm,… không yêu cầu sử dụng nhiều kiến thức nâng cao.
  • Cấp độ nâng cao: dành cho những bạn đã có nền tảng lập trình, có thể sử dụng thành thạo các cấu trúc dữ liệu hay giải thuật khác nhau, tập trung để giải quyết các vấn đề phức tạp hơn.

Trong bài viết này, với mỗi cấp độ, chúng ta cùng nhau luyện tập với 5 bài tập khác nhau, có chi tiết phần yêu cầu, gợi ý và lời giải bằng code viết bằng Python cụ thể cho các bạn tham khảo nhé.

Cấp độ cơ bản

Bài toán 1: Viết chương trình in ra tất cả các số nguyên tố nhỏ hơn 100

Gợi ý: Đây là bài toán cơ bản để kiểm tra khả năng làm việc với vòng lặp. Để kiểm tra tất cả các số từ 1 – 100 chúng ta sẽ sử dụng 1 vòng lặp. Tiếp đó, để kiểm tra xem 1 số có phải số nguyên tố hay không, chúng ta sẽ sử dụng thêm vòng lặp thứ 2 để kiểm tra việc chia hết.

Code:

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 toán 2: Viết một chương trình chuyển đổi nhiệt độ từ độ C sang độ F hoặc ngược lại

Gợi ý: Đây là bài toán để rèn luyện cách sử dụng giá trị mà người dùng nhập vào. Công thức chuyển đổi độ C và độ F các bạn có thể tự tìm hiểu nhé.

Code:

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 toán 3: Tính tuổi dựa trên ngày tháng năm sinh nhập vào

Gợi ý: Đây là bài toán cần xử lý đến giá trị thời gian, ngày tháng; vì thế chúng ta cần import thư viện datetime để sử dụng.

Code:

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 toán 4: Viết chương trình sắp xếp chuỗi do người dùng nhập vào phân tách bởi dấu phẩy

Gợi ý: Đây là bài toán xử lý chuỗi, kết hợp với thao tác nhập giá trị từ người dùng. Việc sắp xếp chúng ta có thể sử dụng hàm sort có sẵn của Python.

Code:

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 toán 5: Đọc file theo dòng và in ra các giá trị số chẵn có trong file

Gợi ý: Đây là bài toán xử lý file, Python hỗ trợ hàm open để đọc file và duyệt theo từng dòng bằng vòng lặp for

Code:

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

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

  Kiểu dữ liệu Boolean và toán tử logic AND, OR, NOT trong Python

  Chinh Phục Phân Tích Dữ Liệu Với Pandas Trong Python: Hướng Dẫn Từng Bước

Cấp độ nâng cao

Bài toán 1: Đọc file và sắp xếp dữ liệu theo các tiêu chí

Gợi ý: Để đọc dữ liệu đầu vào theo các tiêu chí, chúng ta sử dụng một mảng các tuple trong Python. Việc sắp xếp nhiều key chúng ta sử dụng operator itemgetter.

Code:

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 toán 2: Viết chương trình in ra n số đầu tiên trong dãy Fibonacci

Gợi ý: Đây là bài toán điển hình trong việc sử dụng hàm đệ quy. Để viết được đệ quy trong Python, bạn cần lưu ý đến vị trí lời gọi hàm đệ quy cũng như điều kiện kết thúc đệ quy.

Code:

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 toán 3: Kiểm tra mật khẩu thỏa mãn điều kiện

Các tiêu chí cụ thể kiểm tra mật khẩu bao gồm:

  • Độ dài từ 6-12 ký tự
  • Chứa ít nhất chữ cái thường [a-z]
  • Chứa ít nhất một số thuộc [0-9]
  • Chứa ít nhất một chữ cái in hoa [A-Z]
  • Chứa ít nhất một ký tự thuộc [$ # @]

Gợi ý: Dạng bài toán kiểm tra định dạng chuỗi đầu vào, chúng ta sử dụng biểu thức chính quy. Python cung cấp sẵn cho chúng ta module re (regular expressions) để kiểm tra định dạng chuỗi đầu vào.

Code:

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

Xem thêm nhiều việc làm Python lương cao trên TopDev

Bài toán 4: Viết chương trình thống kê tần suất các từ xuất hiện trong chuỗi nhập vào

Gợi ý: Đây là bài toán có nhiều áp dụng trong thực tế. Để xử lý trước tiên chúng ta cần phân tách chuỗi nhập vào thành các từ đơn, lưu vào một mảng object và sau đó thực hiện việc đếm.

Code:

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 toán 5: Viết code triển khai việc kế thừa phương thức trong một lớp (class)

Gợi ý: Chúng ta sẽ tạo một lớp HinhChuNhat với 2 thuộc tính chieu_daichieu_rong, cùng 2 phương thức tinh_dien_tichtinh_chu_vi. Lớp thứ hai HinhVuong sẽ kế thừa lớp HinhChuNhat ở trên, đầu vào là canh_hv, gọi lại các phương thức được kế thừa ở class cha.

Code

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

Kết bài

Nếu các bạn hoàn thành cả 10 bài tập trên mà không cần đến code gợi ý thì chắc hẳn bạn đã có một nền tảng kiến thức lập trình Python vững chắc. Thường xuyên thực hành viết code sẽ giúp bạn có nhiều cách giải quyết vấn đề thực tế tốt hơn nhanh chóng. Hy vọng bài viết hữu ích dành cho bạn và hẹn gặp lại trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

Xem thêm: