Lesson 13: Functions (Hàm)

🎯 Mục Tiêu

  • Nắm bắt Function (hàm) là gì, tác dụng của việc tái sử dụng code.
  • Cách khởi tạo một Hàm, truyền Tham Số (Parameters) và nhập Số Liệu (Arguments).
  • Trả về (Return Value) và hệ quả của nó.
  • Tùy chọn nâng cao như: Keyword Arguments, Default Parameters.
  • Kỹ thuật tùy biến đa tham số (Vô hạn) *args và **kwargs.
  • Phân biệt biến cục bộ (Local) vs toàn cục (Global Scope).

Tạo Function Cơ Bản (Creating Functions)

Function là công cụ gộp một khối Code có cùng mục đích lại với nhau thành 1 cụm thống nhất để “GỌI” sử dụng ở nơi khác.

  • Thay vì chép lại 1 đoạn code dài 10 dòng ở 5 nơi khác nhau (50 dòng); tạo 1 Hàm có chứa 10 dòng đó, và gọi nó 5 lần (vỏn vẹn 5 dòng) giúp file bạn gọn hơn, dễ tìm và diệt bugs hơn.
# Bước 1: Định nghĩa Hàm với chữ 'def'
def greet():
    print("Hello, World!")

# Bước 2: THỰC THI (Gọi Hàm) bằng cụm tên + Dấu Ngoặc Tròn ()
greet()  # Hello, World!

Parameters và Arguments

  • Parameters là tên Biến nằm bên trong định nghĩa của Hàm dùng để chờ số liệu cung cấp vào.
  • Arguments là giá trị thật truyền vào trong dấu ngoặc Khi Gọi Hàm.
def greet(name):  # <--- name chính là Parameters
    print(f"Hello, {name}!")

greet("An")     # <--- "An" chính là Arguments
greet("Minh")   # Hello, Minh!

# Hàm chạy Phép Toán
def add(a, b):
    result = a + b
    print(f"Kết quả là {result}")

add(5, 3)  # Kết quả là 8

Trả về Value (Return)

Lệnh return là trái tim của một Hàm nếu bạn muốn hàm dùng để TÍNH TOÁN và GIAO RA một kết quả để ghi nhớ thành biến mới dùng được ở các Code khác phía sau. (Nếu chỉ có print() bạn chỉ có thể nhìn dòng chữ in ra chứ biến không lưu giữ kết quả tính).

  • Note: Khi gọi lệnh return thì lập tức Hàm sẽ thoái lui ngay lập tức và dừng chạy. Bất kỳ đoạn Code nào bên dưới return và cùng cấp lùi dòng với nó trở nên VÔ NGHĨA.
# Lệnh return Giao hàng
def add(a, b):
    return a + b

result_1 = add(5, 3) # Hàm lấy 8 giao lại cho biến result_1 để lưu giữ
print(result_1)      # 8

# Trả về nhiều giá trị 1 lúc như 1 tuple
def get_info():
    name = "Python"
    version = 3.12
    return name, version

# Sử dụng Tuple Unpacking như ở Bài 10 xử lý
n, v = get_info() # name: 'n' và version: 'v'

Tham Số Mặc Định (Default Parameters) & Keywords ARG

  • Default Parameters: Đặt một giá trị sẵn cho lệnh nếu người dùng QUÊN hoặc biểu quyết không cần nhập đối số thứ cấp nào đó.
  • Keyword Args: Khi bạn có 10 parameter trong 1 hàm, bạn khó để nhớ vị trí thứ tự đúng (Positional). Giúp bạn gắn đích danh vào luôn không cần thứ tự.
# DEFAULT PARAMETER 
# (Luôn đảm bảo tham số default phải để CÙI CÙNG ở bên phải các tham số bình thường)
def greet(name="Khách (Guest)"):
    print(f"Hello, {name}!")

greet()         # Hello, Khách (Guest)! (Do thiếu, hàm ưu tiên lấy Mặc Định)
greet("An")     # Hello, An!


# KEYWORD ARGUMENT
def describe(city, name, age):
    print(f"{name}, {age} tuổi, sống ở {city}")

# Sử dụng Tự Chuyển Nhận diện đích danh mà không màng thứ tự
describe(age=25, name="An", city="HN")

Số Lượng Tham số tùy biến (*args và **kwargs)

Có khi bạn muốn thiết lập Hàm để người ngoài có thể “Nhập bao nhiêu chữ số thì nhập tùy ý”.

  • *args: Chuyển 1 đống Argument (ví dụ: a, b, c, d) vào thành 1 Tuple gọn gàng giúp tính khối lượng lớn.
  • **kwargs: Chuyển 1 đống danh tính (x=1, y=2) vào thành 1 Dictionary lồng gọn gàng.
# *args - Tùy Biến Lẻ
def sum_all(*numbers):  # (Sẽ tạo Tuple tên là numbers)
    return sum(numbers)

print(sum_all(1, 2, 3, 4, 5))  # Kết quả bằng 15


# **kwargs - Tùy Biến Có Tên
def print_info(**info): # (Sẽ tạo Dict chứa thông tin)
    for key, value in info.items():
        print(f"{key}: {value}")

print_info(name="An", age=25, city="Hà Nội", status="Single")

Scope (Phạm Vi Biến)

Một biến bên trong Hàm chỉ thuộc về riêng Hàm đấy. Ở thế giới thực ngoài hàm hoàn toàn vô nghĩa và “Không hiểu nó là ai”

x = 10 # GỌI LÀ GLOBAL SCOPE (Mọi người dùng chung)

def my_function():
    # Khai báo
    y = 5 # GỌI LÀ LOCAL SCOPE (Biến Độc Giới Hạn trong Hàm)

    print(x)  # Hợp Lệ - Có thể đọc biến anh cả ở ngoài
    print(y)  # Local

my_function()
# print(y)  # ❌ NameError - Chương trình chết ngang vì y chỉ có trong Hàm mình nó sài.

Docstrings (Tài Liệu Hướng Dẫn Kèm Theo)

Docstrings là cách Comment nâng cao dành cho Hàm để viết tài liệu chuẩn hoá, ghi ở Dòng Đầu Tiên trong cụm Block của Definition được bao bọc nhờ 3 cặp ngoặc chữ (""" """).

def calculate_area(width, height):
    """
    Tính diện tích hình chữ nhật dựa trên 2 tham số rộng và cao.
    
    Args:
        width(float): Chiều rộng
        height(float): Chiều cao
    
    Returns:
        float: Diện tích (width * height)
    """
    return width * height

# Sau đó, Khi 1 đồng nghiệp gọi hàm print(calculate_area.__doc__), toàn bộ HDSD này sẽ hiện ra cho họ biết hàm mằn gì!

💡 Key Takeaways

  • Hàm tuân thủ quan điểm DRY (Don’t Repeat Yourself) trong Code.
  • Luôn nắm rõ phương pháp dùng lệnh return là công cụ thiết yếu.
  • Phân biệt minh bạch giữa Local và Global Scope. Biến khởi gán trong hàm thì chỉ tồn tại trong hàm.

➡️ Bài Tiếp Theo Lesson 14 – Lambda Functions

Leave a Reply

Your email address will not be published. Required fields are marked *