Python hàm có thể trả về nhiều giá trị cùng lúc (thực chất trả về một tuple). Các giá trị có thể unpack trực tiếp vào biến.
Cách 1: Tuple (Mặc định, phổ biến nhất)
def func(x):
y0 = x + 1
y1 = x * 3
y2 = y0 ** 3
return y0, y1, y2 # Tự động thành tuple
a, b, c = func(2)
print(a, b, c) # 3 6 27
Cách 2: Dictionary (Có tên key, dễ đọc)
def func(x):
y0 = x + 1
y1 = x * 3
y2 = y0 ** 3
return {'y0': y0, 'y1': y1, 'y2': y2}
result = func(2)
print(result['y1']) # 6
Cách 3: Class / Named Tuple / Dataclass (Cấu trúc rõ ràng)
from dataclasses import dataclass
@dataclass
class Result:
y0: int
y1: int
y2: int
def func(x):
return Result(x + 1, x * 3, (x + 1) ** 3)
r = func(2)
print(r.y0, r.y1, r.y2) # 3 6 27
print(r) # Result(y0=3, y1=6, y2=27)
Cách 4: List (Mutable sequence)
def func(x):
result = [x + 1]
result.append(x * 3)
result.append((x + 1) ** 3)
return result
lst = func(2)
print(lst) # [3, 6, 27]
Cách 5: Generator (yield) - Cho nhiều giá trị, tiết kiệm bộ nhớ
def func(x):
y0 = x + 1
yield y0
yield x * 3
yield y0 ** 3
# Dùng như iterator
for val in func(2):
print(val)
# 3
# 6
# 27
# Hoặc unpack (chỉ khi biết số lượng)
a, b, c = func(2)
So sánh & Khuyến nghị
| Cách | Ưu điểm | Nhược điểm | Phù hợp |
|---|---|---|---|
| Tuple | Đơn giản, built-in, unpack dễ | Nhớ thứ tự, khó đọc nếu nhiều giá trị | 2-5 giá trị, cố định |
| Dict | Truy cập bằng key, self-documenting | Verbose, overhead dict | Nhiều giá trị, optional fields |
| Dataclass/NamedTuple | Type hint, IDE support, immutable option | Boilerplate (ít với dataclass) | API public, cấu trúc phức tạp |
| List | Mutable | Ít dùng cho return | Cần modify sau |
| Generator | Lazy, memory efficient, infinite | Chỉ iterate 1 lần, không index | Stream, sequence lớn |
Best Practice
- ≤ 3 giá trị: Tuple unpack
a, b, c = func(). - > 3 giá trị hoặc cần rõ nghĩa:
dataclasshoặcNamedTuple. - Sequence lớn/vô hạn: Generator (yield).
- Luôn type hint cho API rõ ràng.