Chủ đề: Hàm (Function) trong Python¶
I. Lý thuyết¶
1. Định nghĩa¶
Hàm (Function) là một khối mã được đặt tên, có thể được gọi nhiều lần để thực hiện một nhiệm vụ cụ thể. Hàm giúp tái sử dụng mã, tổ chức chương trình tốt hơn và dễ bảo trì hơn.
2. Đặc điểm của Hàm¶
- Có thể nhận tham số đầu vào (parameters).
- Có thể trả về giá trị (return value).
- Giúp chia nhỏ chương trình thành các phần dễ quản lý.
- Tránh lặp lại mã, giảm thiểu lỗi.
- Dễ kiểm tra và sửa lỗi.
3. Cú pháp định nghĩa hàm¶
def ten_ham(tham_so1, tham_so2, ...):
"""Mô tả hàm (tùy chọn)"""
# Khối lệnh thực thi
return gia_tri_tra_ve # Tùy chọn
Thành phần:
def
: từ khóa để định nghĩa hàmten_ham
: tên hàm do lập trình viên đặttham_so
: các giá trị truyền vào hàm (có thể có hoặc không)return
: trả về giá trị (có thể có hoặc không)
4. Gọi hàm¶
ket_qua = ten_ham(gia_tri1, gia_tri2, ...)
II. Các loại hàm¶
1. Hàm không có tham số, không trả về giá trị¶
def chao_hoi():
print("Xin chào các bạn!")
print("Chào mừng đến với lớp học Python!")
# Gọi hàm
chao_hoi()
2. Hàm có tham số, không trả về giá trị¶
def chao_ten(ho_ten):
print(f"Xin chào {ho_ten}!")
print("Rất vui được gặp bạn!")
# Gọi hàm
chao_ten("Nguyễn Văn An")
chao_ten("Trần Thị Bình")
3. Hàm có tham số và trả về giá trị¶
def tinh_diem_trung_binh(toan, ly, hoa):
tong_diem = toan + ly + hoa
diem_tb = tong_diem / 3
return diem_tb
# Gọi hàm và nhận giá trị trả về
dtb = tinh_diem_trung_binh(8, 7, 9)
print(f"Điểm trung bình: {dtb:.2f}")
4. Hàm có tham số mặc định¶
def tinh_dien_tich_hinh_chu_nhat(chieu_dai, chieu_rong=1):
dien_tich = chieu_dai * chieu_rong
return dien_tich
# Gọi hàm với đầy đủ tham số
dt1 = tinh_dien_tich_hinh_chu_nhat(5, 3)
print(f"Diện tích 1: {dt1}")
# Gọi hàm với tham số mặc định
dt2 = tinh_dien_tich_hinh_chu_nhat(4) # chieu_rong = 1
print(f"Diện tích 2: {dt2}")
III. Ví dụ minh họa thực tế¶
Ví dụ 1: Kiểm tra số chẵn/lẻ¶
def kiem_tra_chan_le(so):
if so % 2 == 0:
return "chẵn"
else:
return "lẻ"
# Sử dụng hàm
so_nhap = int(input("Nhập một số: "))
ket_qua = kiem_tra_chan_le(so_nhap)
print(f"Số {so_nhap} là số {ket_qua}")
Ví dụ 2: Tính chu vi và diện tích hình tròn¶
def tinh_chu_vi_hinh_tron(ban_kinh):
chu_vi = 2 * 3.14159 * ban_kinh
return chu_vi
def tinh_dien_tich_hinh_tron(ban_kinh):
dien_tich = 3.14159 * ban_kinh * ban_kinh
return dien_tich
# Sử dụng hàm
r = float(input("Nhập bán kính: "))
cv = tinh_chu_vi_hinh_tron(r)
dt = tinh_dien_tich_hinh_tron(r)
print(f"Chu vi: {cv:.2f}")
print(f"Diện tích: {dt:.2f}")
Ví dụ 3: Xếp loại học lực¶
def xep_loai_hoc_luc(diem_tb):
if diem_tb >= 8.5:
return "Giỏi"
elif diem_tb >= 7.0:
return "Khá"
elif diem_tb >= 5.5:
return "Trung bình"
elif diem_tb >= 3.5:
return "Yếu"
else:
return "Kém"
# Sử dụng hàm
toan = float(input("Điểm Toán: "))
ly = float(input("Điểm Lý: "))
hoa = float(input("Điểm Hóa: "))
dtb = (toan + ly + hoa) / 3
loai = xep_loai_hoc_luc(dtb)
print(f"Điểm trung bình: {dtb:.2f}")
print(f"Xếp loại: {loai}")
Ví dụ 4: Tìm số lớn nhất trong danh sách¶
def tim_so_lon_nhat(danh_sach):
if len(danh_sach) == 0:
return None
so_lon_nhat = danh_sach[0]
for so in danh_sach:
if so > so_lon_nhat:
so_lon_nhat = so
return so_lon_nhat
# Sử dụng hàm
diem_kiem_tra = [7, 8.5, 6, 9.2, 5.5, 8]
diem_cao_nhat = tim_so_lon_nhat(diem_kiem_tra)
print(f"Điểm cao nhất: {diem_cao_nhat}")
IV. Bài tập vận dụng tại lớp¶
Bài 1: Tính chỉ số BMI¶
Đề bài: Viết hàm tinh_bmi(can_nang, chieu_cao)
để tính chỉ số BMI. Công thức: BMI = cân nặng / (chiều cao)²
Sau đó viết chương trình nhập cân nặng (kg) và chiều cao (m), gọi hàm và in kết quả.
💡 Phân tích đề
Các bước thực hiện:
- Định nghĩa hàm với 2 tham số: cân nặng và chiều cao
- Áp dụng công thức BMI = cân nặng / (chiều cao)²
- Trả về kết quả BMI
- Viết chương trình chính nhập dữ liệu và gọi hàm
- In kết quả với định dạng phù hợp
Input/Output mẫu:
Cân nặng (kg) | Chiều cao (m) | BMI | Đánh giá |
---|---|---|---|
70 |
1.75 |
22.86 |
Bình thường |
80 |
1.65 |
29.38 |
Thừa cân |
💡 Gợi ý code
def tinh_bmi(can_nang, chieu_cao):
"""Tính chỉ số BMI"""
bmi = can_nang / (chieu_cao ** 2)
return bmi
# Chương trình chính
can_nang = float(input("Nhập cân nặng (kg): "))
chieu_cao = float(input("Nhập chiều cao (m): "))
bmi = tinh_bmi(can_nang, chieu_cao)
print(f"Chỉ số BMI của bạn: {bmi:.2f}")
Bài 2: Đếm chữ số¶
Đề bài: Viết hàm dem_chu_so(n)
để đếm số chữ số của một số nguyên dương. Ví dụ: dem_chu_so(1234)
trả về 4
.
💡 Phân tích đề
Các bước thực hiện:
- Định nghĩa hàm với tham số là số nguyên dương
- Chuyển số thành chuỗi và đếm độ dài
- Hoặc dùng vòng lặp chia liên tục cho 10
- Trả về số lượng chữ số
- Test hàm với các số khác nhau
Input/Output mẫu:
Input | Chữ số | Kết quả |
---|---|---|
1234 |
1,2,3,4 |
4 |
56 |
5,6 |
2 |
7 |
7 |
1 |
💡 Gợi ý code
def dem_chu_so(n):
"""Đếm số chữ số của một số nguyên dương"""
# Cách 1: Chuyển thành chuỗi
return len(str(n))
# Cách 2: Dùng vòng lặp
# dem = 0
# while n > 0:
# dem += 1
# n //= 10
# return dem
# Test hàm
so = int(input("Nhập số cần đếm chữ số: "))
ket_qua = dem_chu_so(so)
print(f"Số {so} có {ket_qua} chữ số")
Bài 3: Tính giai thừa¶
Đề bài: Viết hàm tinh_giai_thua(n)
để tính giai thừa của một số nguyên dương. Ví dụ: tinh_giai_thua(5)
trả về 120
.
💡 Phân tích đề
Các bước thực hiện:
- Định nghĩa hàm với tham số là số nguyên dương
- Xử lý trường hợp đặc biệt: n = 0 hoặc n = 1 thì return 1
- Dùng vòng lặp nhân dồn từ 1 đến n
- Trả về kết quả giai thừa
- Test với các giá trị khác nhau
Input/Output mẫu:
Input | Tính toán | Kết quả |
---|---|---|
5 |
1×2×3×4×5 |
120 |
0 |
Quy ước |
1 |
3 |
1×2×3 |
6 |
💡 Gợi ý code
def tinh_giai_thua(n):
"""Tính giai thừa của một số nguyên dương"""
if n == 0 or n == 1:
return 1
giai_thua = 1
for i in range(2, n + 1):
giai_thua *= i
return giai_thua
# Test hàm
so = int(input("Nhập số cần tính giai thừa: "))
ket_qua = tinh_giai_thua(so)
print(f"{so}! = {ket_qua}")
Bài 4: Kiểm tra năm nhuận¶
Đề bài: Viết hàm kiem_tra_nam_nhuan(nam)
để kiểm tra một năm có phải năm nhuận không. Năm nhuận là năm chia hết cho 4 nhưng không chia hết cho 100, hoặc chia hết cho 400.
💡 Phân tích đề
Các bước thực hiện:
- Định nghĩa hàm với tham số là năm
- Áp dụng điều kiện năm nhuận:
- Chia hết cho 400 → năm nhuận
- Chia hết cho 100 nhưng không chia hết cho 400 → không nhuận
- Chia hết cho 4 nhưng không chia hết cho 100 → năm nhuận
- Trả về True/False
- Test với các năm đặc biệt
Input/Output mẫu:
Năm | Điều kiện | Kết quả |
---|---|---|
2020 |
Chia hết cho 4, không chia hết cho 100 |
True |
1900 |
Chia hết cho 100, không chia hết cho 400 |
False |
2000 |
Chia hết cho 400 |
True |
💡 Gợi ý code
def kiem_tra_nam_nhuan(nam):
"""Kiểm tra một năm có phải năm nhuận không"""
if nam % 400 == 0:
return True
elif nam % 100 == 0:
return False
elif nam % 4 == 0:
return True
else:
return False
# Test hàm
nam = int(input("Nhập năm cần kiểm tra: "))
if kiem_tra_nam_nhuan(nam):
print(f"Năm {nam} là năm nhuận")
else:
print(f"Năm {nam} không phải năm nhuận")
V. Bài tập về nhà¶
Bài 1: Kiểm tra số nguyên tố¶
Đề bài: Viết hàm la_so_nguyen_to(n)
để kiểm tra một số có phải số nguyên tố không. Số nguyên tố là số chỉ chia hết cho 1 và chính nó.
💡 Phân tích đề
Các bước thực hiện:
- Định nghĩa hàm với tham số là số cần kiểm tra
- Xử lý trường hợp đặc biệt: n < 2 → không phải số nguyên tố
- Duyệt từ 2 đến căn bậc 2 của n
- Nếu n chia hết cho bất kỳ số nào → không phải số nguyên tố
- Nếu không chia hết cho số nào → là số nguyên tố
- Trả về True/False
Input/Output mẫu:
Input | Kiểm tra | Kết quả |
---|---|---|
7 |
Không chia hết cho 2,3 |
True (nguyên tố) |
8 |
Chia hết cho 2 |
False (không nguyên tố) |
Bài 2: Chuyển đổi nhiệt độ¶
Đề bài: Viết hàm chuyen_doi_nhiet_do(nhiet_do, don_vi)
để chuyển đổi nhiệt độ:
- Nếu
don_vi
là "C": chuyển từ Celsius sang Fahrenheit (F = C × 9/5 + 32) - Nếu
don_vi
là "F": chuyển từ Fahrenheit sang Celsius (C = (F - 32) × 5/9)
💡 Phân tích đề
Các bước thực hiện:
- Định nghĩa hàm với 2 tham số: nhiệt độ và đơn vị
- Kiểm tra đơn vị đầu vào ("C" hoặc "F")
- Áp dụng công thức chuyển đổi tương ứng
- Trả về nhiệt độ đã chuyển đổi
- Test với các giá trị khác nhau
Input/Output mẫu:
Nhiệt độ | Đơn vị | Công thức | Kết quả |
---|---|---|---|
25 |
"C" |
25×9/5+32 |
77°F |
68 |
"F" |
(68-32)×5/9 |
20°C |
Bài 3: Tính tiền điện¶
Đề bài: Viết hàm tinh_tien_dien(so_kwh)
để tính tiền điện theo bậc thang:
- 50 kWh đầu: 1,500 đồng/kWh
- 51-100 kWh: 2,000 đồng/kWh
- Từ 101 kWh trở lên: 2,500 đồng/kWh
💡 Phân tích đề
Các bước thực hiện:
- Định nghĩa hàm với tham số là số kWh tiêu thụ
- Tính tiền theo từng bậc:
- Bậc 1: min(50, so_kwh) × 1500
- Bậc 2: min(50, max(0, so_kwh-50)) × 2000
- Bậc 3: max(0, so_kwh-100) × 2500
- Cộng tổng tiền các bậc
- Trả về tổng tiền điện
Input/Output mẫu:
kWh | Bậc 1 | Bậc 2 | Bậc 3 | Tổng tiền |
---|---|---|---|---|
120 |
50×1500 |
50×2000 |
20×2500 |
225,000đ |
Bài 4: Sắp xếp danh sách¶
Đề bài: Viết hàm sap_xep_danh_sach(ds, tang_dan=True)
để sắp xếp một danh sách số:
- Nếu
tang_dan=True
: sắp xếp tăng dần - Nếu
tang_dan=False
: sắp xếp giảm dần
💡 Phân tích đề
Các bước thực hiện:
- Định nghĩa hàm với 2 tham số: danh sách và hướng sắp xếp
- Sử dụng hàm sorted() với tham số reverse
- Nếu tang_dan=True → reverse=False
- Nếu tang_dan=False → reverse=True
- Trả về danh sách đã sắp xếp
- Test với các danh sách khác nhau
Input/Output mẫu:
Danh sách | tang_dan | Kết quả |
---|---|---|
[3,1,4,2] |
True |
[1,2,3,4] |
[3,1,4,2] |
False |
[4,3,2,1] |
VI. Ghi chú quan trọng¶
- Tên hàm: Nên đặt tên có ý nghĩa, sử dụng dấu gạch dưới để ngăn cách từ.
- Tham số: Có thể có nhiều tham số, ngăn cách bằng dấu phẩy.
- Return: Hàm có thể không có
return
, hoặcreturn
nhiều giá trị. - Phạm vi biến: Biến trong hàm chỉ tồn tại trong hàm đó.
- Gọi hàm: Phải định nghĩa hàm trước khi gọi.
````