Cách sử dụng *args và **kwargs trong hàm Python

Làm chủ *args và **kwargs trong Python. Tìm hiểu cách viết các hàm linh hoạt với các đối số từ khóa và vị trí động, giải nén các bộ sưu tập và xây dựng các hàm bao bọc.

Hãy thử Giải pháp này trong Trình chỉnh sửa

Tổng quan

Trong Python, bạn thường sẽ cần thiết kế các hàm có thể chấp nhận số lượng đối số thay đổi. Ví dụ: hàm tính tổng của số nguyên bất kỳ hoặc hàm ghi nhật ký siêu dữ liệu với các trường khác nhau. Thay vì buộc người dùng phải chuyển một danh sách hoặc từ điển, Python cung cấp hai ký hiệu đặc biệt: `*args` và `**kwargs`.

Cú pháp `*args` cho phép một hàm chấp nhận bất kỳ số lượng đối số vị trí nào. Dấu hoa thị đơn `*` hoạt động như một toán tử giải nén. Khi được đặt trong định nghĩa hàm, nó sẽ thu thập các đối số vị trí bổ sung vào một bộ dữ liệu có tên là `args`. Điều này cho phép bạn lặp lại các giá trị đầu vào, chạy tính toán hoặc chuyển chúng sang hàm khác một cách dễ dàng.

Mặt khác, cú pháp `**kwargs` cho phép một hàm chấp nhận bất kỳ số lượng đối số từ khóa (được đặt tên) nào. Dấu hoa thị kép `**` thu thập các đối số này vào một từ điển có tên `kwargs`. Điều này cực kỳ hữu ích để chuyển các cấu hình tùy chọn, đối số kiểu dáng hoặc thuộc tính cơ sở dữ liệu. Hãy nhớ rằng tên 'args' và 'kwargs' là quy ước; chức năng thực tế được điều khiển bởi dấu hoa thị đơn và đôi.

Đầu ra mã & thực thi

Mã này minh họa việc sử dụng *args để tính tổng các số biến, **kwargs để in hồ sơ người dùng và kết hợp cả hai trong một hàm duy nhất.

def sum_all(*args):
    print("args type:", type(args).__name__)
    return sum(args)

print("Sum (1, 2, 3):", sum_all(1, 2, 3))
print("Sum (10, 20):", sum_all(10, 20))

def print_profile(**kwargs):
    print("kwargs type:", type(kwargs).__name__)
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_profile(name="Bob", role="developer", country="US")

def master_function(first, *args, **kwargs):
    print(f"First argument: {first}")
    print(f"Additional positional args: {args}")
    print(f"Keyword args: {kwargs}")

master_function("hello", 1, 2, 3, debug=True, user_id=42)
Đầu ra thiết bị đầu cuối
args type: tuple
Sum (1, 2, 3): 6
args type: tuple
Sum (10, 20): 30
kwargs type: dict
name: Bob
role: developer
country: US
First argument: hello
Additional positional args: (1, 2, 3)
Keyword args: {'debug': True, 'user_id': 42}

Triển khai từng bước

  • Sử dụng một dấu hoa thị trước một tham số (ví dụ: *args) để tập hợp các đối số vị trí thành một bộ dữ liệu.
  • Sử dụng dấu hoa thị kép trước tham số (ví dụ: **kwargs) để thu thập các đối số từ khóa vào từ điển.
  • Duy trì thứ tự tham số chính xác: tham số tiêu chuẩn, *args, tham số chỉ từ khóa, sau đó là **kwargs.
  • Sử dụng cú pháp giải nén khi gọi hàm bằng cách chuyển *iterable hoặc **dictionary.

Câu hỏi thường gặp

Tôi có phải sử dụng tên "args" và "kwargs" không?

Không, đây là những quy ước cộng đồng tiêu chuẩn. Chỉ có tiền tố * và ** là bắt buộc về mặt cú pháp. Bạn có thể viết *values ​​và **options, nhưng nên sử dụng *args và **kwargs để dễ đọc.

Thứ tự đúng khi xác định hàm là gì?

Thứ tự đúng của các đối số trong chữ ký hàm là: đối số vị trí, *args, đối số chỉ từ khóa và cuối cùng là **kwargs.

Chủ đề liên quan

Tài nguyên Python được đề xuất

Mở rộng kiến thức của bạn với các hướng dẫn tương tác, bảng ghi chú và so sánh mã có liên quan.