Bài 5. Hàm

Hàm là đoạn mã có tên, viết một lần dùng nhiều lần. Đây là công cụ quan trọng nhất để chương trình gọn và dễ bảo trì.

35 phútCơ bản
Bạn sẽ học được
  • Định nghĩa và gọi hàm
  • Dùng tham số, giá trị mặc định và giá trị trả về
  • Hiểu phạm vi biến cục bộ và toàn cục
  • Viết chú thích mô tả hàm (docstring)
Thuật ngữ cần biết
Hàm (function)
Khối lệnh có tên, nhận đầu vào và có thể trả kết quả.
Tham số (parameter)
Tên biến khai báo trong định nghĩa hàm.
Đối số (argument)
Giá trị thật truyền vào khi gọi hàm.
return
Lệnh trả kết quả về nơi gọi và kết thúc hàm.
Phạm vi (scope)
Vùng mà một biến còn hiệu lực.

Định nghĩa và gọi hàm

def chao(ten):
    print("Xin chào,", ten)

chao("Lan")
chao("Minh")

Từ khóa def mở đầu, tên hàm, danh sách tham số trong ngoặc, dấu hai chấm, thân hàm thụt lề.

Giá trị trả về và tham số mặc định

def dien_tich_hcn(dai, rong=1):
    """Tính diện tích hình chữ nhật."""
    return dai * rong

print(dien_tich_hcn(5, 3))   # 15
print(dien_tich_hcn(5))      # 5, rong lấy mặc định
print(dien_tich_hcn(rong=2, dai=4))  # truyền theo tên

Một hàm có thể trả nhiều giá trị: return tong, tich (thực chất trả về một bộ).

Phạm vi biến

x = 10          # biến toàn cục
def thu():
    x = 99      # biến cục bộ, không ảnh hưởng x ngoài
    return x
thu()
print(x)        # vẫn 10

Biến tạo trong hàm chỉ tồn tại trong hàm. Nên truyền dữ liệu bằng tham số và nhận kết quả bằng return thay vì dùng biến toàn cục.

Hàm nhỏ giải quyết một việc

def la_nguyen_to(n):
    if n < 2:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

print([n for n in range(1, 30) if la_nguyen_to(n)])
Tình huống: Tính tiền hóa đơn

Cửa hàng cần tính tiền sau giảm giá nhiều lần. Viết một hàm dùng chung thay vì chép công thức nhiều chỗ.

def tinh_tien(gia, so_luong, giam=0):
    tong = gia * so_luong
    return tong * (1 - giam)

print(tinh_tien(45000, 3))
print(tinh_tien(45000, 3, giam=0.1))
Mẹo hay

Một hàm nên làm đúng một việc và có tên là động từ: tinh_tong, kiem_tra_email.

Lưu ý

Nếu hàm quên return, kết quả là None. Đừng dùng danh sách rỗng [] làm giá trị mặc định tham số; hãy dùng None.

Thực hành
  1. Viết hàm max2(a, b) trả số lớn hơn.
  2. Viết hàm đổi độ C sang độ F.
  3. Viết hàm kiểm tra năm nhuận, dùng lại ở bài điều kiện.
  4. Viết hàm nhận danh sách điểm, trả điểm trung bình.
Tóm tắt bài học
  • def tạo hàm, return trả kết quả.
  • Tham số có thể có giá trị mặc định, truyền theo vị trí hoặc tên.
  • Biến trong hàm là cục bộ.
  • Chia chương trình thành các hàm nhỏ, tên rõ nghĩa.