Python - Hướng Dẫn Đầu Bạn Về Chú Thích Hàm

Xin chào, các nhà lập trình Python nhảy mùn! Hôm nay, chúng ta sẽ bơi lội vào thế giới thú vị của Chú Thích Hàm. Đừng lo nếu bạn mới bắt đầu học lập trình – tôi sẽ hướng dẫn bạn qua khái niệm này bước bước, như thế tôi đã làm cho hàng ngàn học viên trong những năm dạy học. Vậy hãy lấy ly đồ uống yêu thích của bạn, thoải mái ngồi và hãy cùng nhau khám phá cuộc phiêu lưu Python này!

Python - Function Annotations

Chú Thích Hàm Là Gì?

Chú thích hàm là một tính năng trong Python cho phép chúng ta thêm metadata vào các tham số và giá trị trả về của hàm. Hãy nghĩ về chúng như những ghi chú nhỏ mà chúng ta gắn vào các hàm để cung cấp thông tin bổ sung. Chúng không ảnh hưởng đến cách hoạt động của hàm, nhưng có thể rất hữu ích cho tài liệu và kiểm tra loại dữ liệu.

Hãy bắt đầu với một ví dụ đơn giản:

def chao_ten(name: str) -> str:
return f"Xin chào, {name}!"

Trong ví dụ này, : str sau name là một chú thích nhận diện rằng name nên là một chuỗi. Phần -> str ở cuối cho rằng hàm sẽ trả về một chuỗi.

Tại Sao Sử Dụng Chú Thích Hàm?

  1. Chúng làm cho mã của bạn dễ đọc hơn.
  2. Chúng giúp các nhà phát triển khác (và tương lai của bạn!) hiểu mã của bạn tốt hơn.
  3. Chúng có thể được sử dụng bởi các công cụ kiểm tra loại để phát hiện lỗi tiềm ẩn.

Bây giờ, hãy đi sâu hơn vào các loại chú thích khác nhau!

Chú Thích Hàm Với Tham Số

Chúng ta có thể chú thích các tham số hàm để chỉ ra loại dữ liệu mà chúng ta mong đợi. Dưới đây là một ví dụ:

def tinh_dien_tich(length: float, width: float) -> float:
return length * width

Trong hàm này, chúng ta đang nói rằng cả lengthwidth nên là số thực (số thập phân), và hàm sẽ trả về một số thực.

Hãy thử sử dụng nó:

dien_tich = tinh_dien_tich(5.5, 3.2)
print(f"Diện tích là: {dien_tich}")

Output:

Diện tích là: 17.6

Nhớ rằng, các chú thích này không enforcement các loại – bạn vẫn có thể gọi tinh_dien_tich("hello", "world"), nhưng điều đó không có nghĩa lắm!

Chú Thích Hàm Với Loại Trả Về

Chúng ta đã thấy chú thích -> float cho loại trả về, nhưng hãy xem một ví dụ phức tạp hơn:

def lay_thong_tin_user(user_id: int) -> dict:
# Hãy tưởng tượng hàm này lấy dữ liệu người dùng từ cơ sở dữ liệu
return {
"id": user_id,
"name": "Alice",
"age": 30,
"email": "[email protected]"
}

user = lay_thong_tin_user(12345)
print(f"Tên người dùng: {user['name']}")

Output:

Tên người dùng: Alice

Ở đây, chúng ta đang chỉ ra rằng hàm nhận một số nguyên user_id và trả về một từ điển.

Chú Thích Hàm Với Biểu Thức

Chú thích không nhất thiết phải là các loại đơn giản – chúng có thể là các biểu thức phức tạp hơn. Dưới đây là một ví dụ:

from typing import List, Union

def xu_ly_cac_item(items: List[Union[int, str]]) -> List[str]:
return [str(item).upper() for item in items]

ket_qua = xu_ly_cac_item([1, "hello", 42, "world"])
print(ket_qua)

Output:

['1', 'HELLO', '42', 'WORLD']

Trong ví dụ này, List[Union[int, str]] có nghĩa là hàm mong đợi một danh sách mà mỗi mục có thể là một số nguyên hoặc một chuỗi.

Chú Thích Hàm Với Tham Số Mặc Định

Chúng ta có thể kết hợp chú thích với các tham số mặc định. Dưới đây là cách làm:

def chao_user(name: str = "Khách") -> str:
return f"Chào mừng, {name}!"

print(chao_user())
print(chao_user("Alice"))

Output:

Chào mừng, Khách!
Chào mừng, Alice!

Trong hàm này, chúng ta đang nói rằng name nên là một chuỗi, và nếu không có tên được cung cấp, mặc định là "Khách".

Kết Hợp Tất Cả

Bây giờ, hãy xem một ví dụ phức tạp hơn kết hợp nhiều kỹ thuật chú thích khác nhau:

from typing import List, Dict, Union

def phân_tích_bán_hàng(data: List[Dict[str, Union[str, float]]]) -> Dict[str, float]:
total_sales = 0.0
items_sold = 0

for transaction in data:
total_sales += transaction['amount']
items_sold += 1

return {
"total_sales": total_sales,
"average_sale": total_sales / items_sold if items_sold > 0 else 0
}

sales_data = [
{"item": "Widget A", "amount": 10.99},
{"item": "Widget B", "amount": 5.99},
{"item": "Widget C", "amount": 15.99}
]

ket_qua = phân_tích_bán_hàng(sales_data)
print(f"Total sales: ${ket_qua['total_sales']:.2f}")
print(f"Average sale: ${ket_qua['average_sale']:.2f}")

Output:

Total sales: $32.97
Average sale: $10.99

Ví dụ này cho thấy cách chúng ta có thể sử dụng các chú thích phức tạp để mô tả cấu trúc dữ liệu đầu vào và giá trị trả về.

Tóm Tắt Các Phương Pháp Chú Thích Hàm

Dưới đây là bảng tóm tắt các cách khác nhau chúng ta có thể sử dụng chú thích hàm:

Phương pháp Ví dụ Mô tả
Chú thích Tham số def func(x: int): Đề xuất loại cho một tham số
Chú thích Loại Trả Về def func() -> str: Đề xuất loại trả về của hàm
Giá trị Mặc Định với Chú Thích def func(x: int = 0): Kết hợp một đề xuất loại với giá trị mặc định
Chú thích Loại Phức Tạp def func(x: List[int]): Sử dụng các loại từ module typing để đề xuất loại cụ thể hơn
Nhiều Loại (Union) def func(x: Union[int, str]): Đề xuất rằng một tham số có thể là một trong số các loại

Nhớ rằng, các chú thích này là những gợi ý, không phải là các quy tắc nghiêm ngặt. Python sẽ không ngăn bạn sử dụng các loại khác, nhưng các công cụ như mypy có thể sử dụng các chú thích này để phát hiện lỗi tiềm ẩn trước khi bạn chạy mã của mình.

Và thế là, các bạn đã hoàn thành cuộc hành trình qua thế giới Chú Thích Hàm của Python. Hy vọng hướng dẫn này đã sáng bừng khái niệm này cho bạn. Nhớ rằng, cách tốt nhất để học là bằng cách thực hành, vì vậy đừng ngần ngại thử nghiệm các chú thích này trong mã của bạn. Chúc các bạn mã lập luôn được chú thích tốt!

Credits: Image by storyset