Trong Python, *args và **kwargs là hai cơ chế cho phép bạn truyền một số lượng không xác định các đối số vào một hàm. Chúng được sử dụng để viết hàm linh hoạt hơn, có thể chấp nhận nhiều tham số hơn mà không cần phải xác định trước số lượng tham số cụ thể. Dưới đây là mô tả chi tiết về cả hai.
*argsKhái Niệm: *args được sử dụng để truyền một danh sách các đối số không xác định vào một hàm. Khi bạn sử dụng *args, Python sẽ gom tất cả các đối số không được chỉ định thành một tuple.
Cách Sử Dụng:
def my_function(*args):
    for arg in args:
        print(arg)
my_function(1, 2, 3)  # In ra 1, 2, 3
my_function('a', 'b', 'c', 'd')  # In ra a, b, c, d
Kết Quả:
1 2 3 a b c d
Trong ví dụ trên, hàm my_function có thể nhận bất kỳ số lượng đối số nào và in chúng ra.
**kwargsKhái Niệm: **kwargs được sử dụng để truyền một danh sách các đối số không xác định dưới dạng cặp khóa-giá trị vào một hàm. Khi bạn sử dụng **kwargs, Python sẽ gom tất cả các đối số không được chỉ định thành một dictionary.
Cách Sử Dụng:
def my_function(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")
my_function(name='Alice', age=25, city='New York')
Kết Quả:
name: Alice age: 25 city: New York
Trong ví dụ này, hàm my_function nhận các đối số dưới dạng cặp khóa-giá trị và in ra từng cặp.
*args và **kwargs?*args và **kwargs sẽ rất hữu ích.*args và **kwargsBạn có thể kết hợp cả *args và **kwargs trong cùng một hàm. Khi đó, *args phải được định nghĩa trước **kwargs.
def my_function(*args, **kwargs):
    print("Arguments:", args)
    print("Keyword arguments:", kwargs)
my_function(1, 2, 3, name='Alice', age=25)
Kết Quả:
Arguments: (1, 2, 3)
Keyword arguments: {'name': 'Alice', 'age': 25}
*args và **kwargs là các công cụ mạnh mẽ trong Python giúp bạn tạo ra các hàm linh hoạt và dễ mở rộng. Việc sử dụng chúng cho phép bạn xử lý một số lượng đối số không xác định mà không cần phải xác định rõ ràng chúng trong phần định nghĩa hàm, làm cho mã của bạn sạch hơn và dễ bảo trì hơn.