Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Trả về nhiều giá trị từ hàm Python (Return Multiple Values)

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ểmNhược điểmPhù 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
DictTruy cập bằng key, self-documentingVerbose, overhead dictNhiều giá trị, optional fields
Dataclass/NamedTupleType hint, IDE support, immutable optionBoilerplate (ít với dataclass)API public, cấu trúc phức tạp
ListMutableÍt dùng cho returnCần modify sau
GeneratorLazy, memory efficient, infiniteChỉ iterate 1 lần, không indexStream, sequence lớn

Best Practice

  • ≤ 3 giá trị: Tuple unpack a, b, c = func().
  • > 3 giá trị hoặc cần rõ nghĩa: dataclass hoặc NamedTuple.
  • Sequence lớn/vô hạn: Generator (yield).
  • Luôn type hint cho API rõ ràng.