Bỏ qua

Image

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ơndễ 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àm
  • ten_ham: tên hàm do lập trình viên đặt
  • tham_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:

  1. Định nghĩa hàm với 2 tham số: cân nặng và chiều cao
  2. Áp dụng công thức BMI = cân nặng / (chiều cao)²
  3. Trả về kết quả BMI
  4. Viết chương trình chính nhập dữ liệu và gọi hàm
  5. 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:

  1. Định nghĩa hàm với tham số là số nguyên dương
  2. Chuyển số thành chuỗi và đếm độ dài
  3. Hoặc dùng vòng lặp chia liên tục cho 10
  4. Trả về số lượng chữ số
  5. 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}{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:

  1. Định nghĩa hàm với tham số là số nguyên dương
  2. Xử lý trường hợp đặc biệt: n = 0 hoặc n = 1 thì return 1
  3. Dùng vòng lặp nhân dồn từ 1 đến n
  4. Trả về kết quả giai thừa
  5. 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:

  1. Định nghĩa hàm với tham số là năm
  2. Áp dụng điều kiện năm nhuận:
  3. Chia hết cho 400 → năm nhuận
  4. Chia hết cho 100 nhưng không chia hết cho 400 → không nhuận
  5. Chia hết cho 4 nhưng không chia hết cho 100 → năm nhuận
  6. Trả về True/False
  7. 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:

  1. Định nghĩa hàm với tham số là số cần kiểm tra
  2. Xử lý trường hợp đặc biệt: n < 2 → không phải số nguyên tố
  3. Duyệt từ 2 đến căn bậc 2 của n
  4. Nếu n chia hết cho bất kỳ số nào → không phải số nguyên tố
  5. Nếu không chia hết cho số nào → là số nguyên tố
  6. 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:

  1. Định nghĩa hàm với 2 tham số: nhiệt độ và đơn vị
  2. Kiểm tra đơn vị đầu vào ("C" hoặc "F")
  3. Áp dụng công thức chuyển đổi tương ứng
  4. Trả về nhiệt độ đã chuyển đổi
  5. 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:

  1. Định nghĩa hàm với tham số là số kWh tiêu thụ
  2. Tính tiền theo từng bậc:
  3. Bậc 1: min(50, so_kwh) × 1500
  4. Bậc 2: min(50, max(0, so_kwh-50)) × 2000
  5. Bậc 3: max(0, so_kwh-100) × 2500
  6. Cộng tổng tiền các bậc
  7. 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:

  1. Định nghĩa hàm với 2 tham số: danh sách và hướng sắp xếp
  2. Sử dụng hàm sorted() với tham số reverse
  3. Nếu tang_dan=True → reverse=False
  4. Nếu tang_dan=False → reverse=True
  5. Trả về danh sách đã sắp xếp
  6. 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ặc return 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.

````