🧩 Bài Tập về Hàm (Functions) trong Python
Chào mừng bạn đến với tập hợp các bài tập về hàm trong Python! Những bài tập này sẽ giúp bạn luyện tập và hiểu sâu hơn về cách tạo và sử dụng hàm trong Python.
🔰 Bài Tập Mức Cơ Bản
Bài 1: Hàm Tính Tổng
Yêu cầu: Viết một hàm tên là calculate_sum
nhận vào hai số và trả về tổng của chúng. Sau đó gọi hàm với các cặp số khác nhau.
Xem gợi ý
def calculate_sum(a, b):
"""
Tính tổng của hai số
Args:
a: Số thứ nhất
b: Số thứ hai
Returns:
Tổng của hai số
"""
return a + b
# Kiểm tra hàm
print(f"5 + 3 = {calculate_sum(5, 3)}")
print(f"10 + 20 = {calculate_sum(10, 20)}")
print(f"-7 + 7 = {calculate_sum(-7, 7)}")
Bài 2: Hàm Kiểm Tra Số Chẵn/Lẻ
Yêu cầu: Viết một hàm tên là is_even
nhận vào một số và trả về True
nếu số đó là số chẵn, ngược lại trả về False
.
Xem gợi ý
def is_even(number):
"""
Kiểm tra một số có phải là số chẵn hay không
Args:
number: Số cần kiểm tra
Returns:
True nếu số chẵn, False nếu số lẻ
"""
return number % 2 == 0
# Kiểm tra hàm
test_numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for num in test_numbers:
if is_even(num):
print(f"{num} là số chẵn")
else:
print(f"{num} là số lẻ")
Bài 3: Hàm Tính Chu Vi và Diện Tích Hình Chữ Nhật
Yêu cầu: Viết hai hàm calculate_rectangle_perimeter
và calculate_rectangle_area
để tính chu vi và diện tích của một hình chữ nhật với chiều dài và chiều rộng cho trước.
Xem gợi ý
def calculate_rectangle_perimeter(length, width):
"""
Tính chu vi hình chữ nhật
Args:
length: Chiều dài
width: Chiều rộng
Returns:
Chu vi hình chữ nhật
"""
return 2 * (length + width)
def calculate_rectangle_area(length, width):
"""
Tính diện tích hình chữ nhật
Args:
length: Chiều dài
width: Chiều rộng
Returns:
Diện tích hình chữ nhật
"""
return length * width
# Kiểm tra hàm
length = 5
width = 3
print(f"Hình chữ nhật có chiều dài {length} và chiều rộng {width}:")
print(f"Chu vi: {calculate_rectangle_perimeter(length, width)}")
print(f"Diện tích: {calculate_rectangle_area(length, width)}")
🔄 Bài Tập Mức Trung Bình
Bài 4: Hàm với Tham Số Mặc Định
Yêu cầu: Viết một hàm greet
nhận vào tên của người dùng và một lời chào tùy chọn (mặc định là "Xin chào"). Hàm sẽ trả về một chuỗi là lời chào kèm theo tên người dùng.
Xem gợi ý
def greet(name, greeting="Xin chào"):
"""
Tạo lời chào với tên người dùng
Args:
name: Tên người dùng
greeting: Lời chào (mặc định là "Xin chào")
Returns:
Chuỗi chứa lời chào kèm tên
"""
return f"{greeting}, {name}!"
# Kiểm tra hàm
print(greet("Alice")) # Sử dụng lời chào mặc định
print(greet("Bob", "Chào buổi sáng")) # Chỉ định lời chào
print(greet("Charlie", "Welcome")) # Lời chào khác
Bài 5: Hàm với Số Lượng Tham Số Không Xác Định
Yêu cầu: Viết một hàm calculate_average
nhận vào một số không xác định các số và trả về giá trị trung bình của chúng.
Xem gợi ý
def calculate_average(*args):
"""
Tính giá trị trung bình của một danh sách các số
Args:
*args: Danh sách các số cần tính trung bình
Returns:
Giá trị trung bình, hoặc 0 nếu không có số nào được cung cấp
"""
if len(args) == 0:
return 0
return sum(args) / len(args)
# Kiểm tra hàm
print(f"Trung bình của 1, 2, 3: {calculate_average(1, 2, 3)}")
print(f"Trung bình của 10, 20: {calculate_average(10, 20)}")
print(f"Trung bình của nhiều số: {calculate_average(5, 10, 15, 20, 25)}")
print(f"Không có số nào: {calculate_average()}")
Bài 6: Hàm với Tham Số Từ Khóa (Keyword Arguments)
Yêu cầu: Viết một hàm create_profile
nhận vào thông tin cá nhân (tên, tuổi, thành phố, nghề nghiệp) và trả về một dictionary chứa các thông tin đó.
Xem gợi ý
def create_profile(name, age, city="Không xác định", occupation="Không xác định"):
"""
Tạo profile người dùng dạng dictionary
Args:
name: Tên người dùng
age: Tuổi
city: Thành phố (mặc định là "Không xác định")
occupation: Nghề nghiệp (mặc định là "Không xác định")
Returns:
Dictionary chứa thông tin profile
"""
profile = {
"name": name,
"age": age,
"city": city,
"occupation": occupation
}
return profile
# Kiểm tra hàm
profile1 = create_profile("Alice", 25, "Hà Nội", "Lập trình viên")
profile2 = create_profile("Bob", 30, occupation="Kỹ sư")
profile3 = create_profile(name="Charlie", age=22)
print("Profile 1:", profile1)
print("Profile 2:", profile2)
print("Profile 3:", profile3)
🚀 Bài Tập Mức Nâng Cao
Bài 7: Hàm Đệ Quy Tính Giai Thừa
Yêu cầu: Viết một hàm đệ quy factorial
để tính giai thừa của một số nguyên không âm.
Xem gợi ý
def factorial(n):
"""
Tính giai thừa của một số nguyên không âm bằng đệ quy
Args:
n: Số nguyên không âm cần tính giai thừa
Returns:
Giai thừa của n
Raises:
ValueError: Nếu n là số âm
"""
if n < 0:
raise ValueError("Không thể tính giai thừa của số âm")
if n <= 1:
return 1
return n * factorial(n - 1)
# Kiểm tra hàm
for i in range(6):
print(f"{i}! = {factorial(i)}")
# Xử lý ngoại lệ
try:
print(factorial(-1))
except ValueError as e:
print(f"Lỗi: {e}")
Bài 8: Hàm Sinh Số Fibonacci
Yêu cầu: Viết một hàm fibonacci
để tính số Fibonacci thứ n sử dụng đệ quy có nhớ (memoization).
Xem gợi ý
def fibonacci(n, memo={}):
"""
Tính số Fibonacci thứ n sử dụng đệ quy có nhớ (memoization)
Args:
n: Vị trí của số Fibonacci cần tính
memo: Dictionary để lưu trữ các kết quả đã tính
Returns:
Số Fibonacci thứ n
"""
if n in memo:
return memo[n]
if n <= 0:
return 0
elif n == 1:
return 1
else:
memo[n] = fibonacci(n-1, memo) + fibonacci(n-2, memo)
return memo[n]
# Kiểm tra hàm
print("Dãy số Fibonacci:")
for i in range(10):
print(f"F({i}) = {fibonacci(i)}")
# Fibonacci lớn
print(f"F(30) = {fibonacci(30)}")
print(f"F(40) = {fibonacci(40)}")
Bài 9: Hàm Bậc Cao (Higher-Order Function)
Yêu cầu: Viết một hàm bậc cao apply_operation
nhận vào một hàm toán học và một danh sách các số, sau đó áp dụng hàm toán học đó cho mỗi số trong danh sách và trả về kết quả.
Xem gợi ý
def apply_operation(func, numbers):
"""
Áp dụng một hàm cho mỗi số trong danh sách
Args:
func: Hàm toán học cần áp dụng
numbers: Danh sách các số
Returns:
Danh sách kết quả sau khi áp dụng hàm
"""
return [func(num) for num in numbers]
# Một số hàm toán học để kiểm tra
def square(x):
return x * x
def cube(x):
return x * x * x
def double(x):
return x * 2
def add_five(x):
return x + 5
# Kiểm tra hàm
numbers = [1, 2, 3, 4, 5]
print(f"Danh sách ban đầu: {numbers}")
print(f"Bình phương: {apply_operation(square, numbers)}")
print(f"Lập phương: {apply_operation(cube, numbers)}")
print(f"Nhân đôi: {apply_operation(double, numbers)}")
print(f"Cộng 5: {apply_operation(add_five, numbers)}")
# Sử dụng lambda
print(f"Chia 2: {apply_operation(lambda x: x / 2, numbers)}")
💪 Bài Tập Thử Thách
Bài 10: Decorator Đơn Giản
Yêu cầu: Viết một decorator timer
để đo thời gian thực thi của một hàm và in ra kết quả.
Xem gợi ý
import time
import functools
def timer(func):
"""
Decorator để đo thời gian thực thi của một hàm
Args:
func: Hàm cần đo thời gian
Returns:
Hàm wrapper đo thời gian
"""
@functools.wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"Hàm '{func.__name__}' chạy mất {end_time - start_time:.6f} giây")
return result
return wrapper
# Kiểm tra decorator
@timer
def slow_function(n):
"""Một hàm chạy chậm để kiểm tra decorator timer"""
time.sleep(n) # Giả lập một hàm mất n giây để chạy
return f"Hoàn thành sau {n} giây"
print(slow_function(1))
print(slow_function(0.5))
Bài 11: Closure và Function Factory
Yêu cầu: Viết một hàm create_multiplier
nhận vào một số n và trả về một hàm mới, hàm mới này sẽ nhân bất kỳ tham số đầu vào nào với n.
Xem gợi ý
def create_multiplier(n):
"""
Tạo một hàm nhân số với n
Args:
n: Số nhân
Returns:
Một hàm mới nhận một số x và trả về x * n
"""
def multiplier(x):
return x * n
return multiplier
# Kiểm tra hàm
double = create_multiplier(2)
triple = create_multiplier(3)
quadruple = create_multiplier(4)
print(f"Double 5: {double(5)}")
print(f"Triple 5: {triple(5)}")
print(f"Quadruple 5: {quadruple(5)}")
# Kiểm tra với nhiều giá trị
numbers = [1, 2, 3, 4, 5]
print(f"Doubled list: {[double(num) for num in numbers]}")
print(f"Tripled list: {[triple(num) for num in numbers]}")