Trong Python, *args và **kwargs là hai cú pháp đặc biệt được sử dụng khi định nghĩa hàm để cho phép truyền vào một số lượng tham số không giới hạn. Chúng giúp tăng tính linh hoạt và khả năng mở rộng cho các hàm của bạn.
*args (Non-Keyword Arguments)
*args được sử dụng để truyền một số lượng tham số không xác định vào hàm dưới dạng một tuple. Ký hiệu * trước tham số args cho phép bạn gói tất cả các tham số còn lại thành một tuple sau khi các tham số vị trí đã được gán giá trị.
Ví dụ:
python
def print_numbers(*args):
for arg in args:
print(arg)
print_numbers(1, 2, 3) # In ra: 1 2 3
print_numbers(4, 5) # In ra: 4 5
Trong ví dụ trên, hàm print_numbers nhận bất kỳ số lượng tham số nào và in chúng ra. Bạn cũng có thể kết hợp *args với các tham số vị trí bình thường:
python
def print_info(name, *args):
print(f"Name: {name}")
print("Additional info:")
for arg in args:
print(arg)
print_info("Alice", "Engineer", 25, "New York")
# In ra:
# Name: Alice
# Additional info:
# Engineer
# 25
# New York
**kwargs (Keyword Arguments)
**kwargs được sử dụng để truyền một số lượng tham số không xác định vào hàm dưới dạng một dictionary. Ký hiệu ** trước tham số kwargs cho phép bạn gói tất cả các tham số từ khóa còn lại thành một dictionary sau khi các tham số vị trí và *args đã được gán giá trị.
Ví dụ:
python
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="Alice", age=25, city="New York")
# In ra:
# name: Alice
# age: 25
# city: New York
Trong ví dụ trên, hàm print_info nhận bất kỳ số lượng tham số từ khóa nào và in chúng ra dưới dạng cặp khóa-giá trị. Bạn cũng có thể kết hợp **kwargs với các tham số vị trí và *args:
python
def print_details(name, *args, **kwargs):
print(f"Name: {name}")
print("Additional info:")
for arg in args:
print(arg)
print("Keyword arguments:")
for key, value in kwargs.items():
print(f"{key}: {value}")
print_details("Alice", "Engineer", 25, city="New York", country="USA")
# In ra:
# Name: Alice
# Additional info:
# Engineer
# 25
# Keyword arguments:
# city: New York
# country: USA
Một Số Lưu Ý
- Thứ tự của
*argsvà**kwargstrong định nghĩa hàm là quan trọng.*argsphải đứng trước**kwargs - Bạn có thể sử dụng bất kỳ tên nào cho
*argsvà**kwargsmiễn là tuân thủ quy tắc đặt tên biến trong Python. Tuy nhiên,*argsvà**kwargslà quy ước đặt tên phổ biến. - Nếu bạn không truyền bất kỳ tham số nào vào hàm,
*argssẽ là một tuple rỗng, và**kwargssẽ là một dictionary rỗng. - Bạn có thể sử dụng
*để "unpack" một tuple hoặc**để "unpack" một dictionary khi gọi hàm
Kết Luận
*args và **kwargs là hai cú pháp hữu ích trong Python, cho phép bạn định nghĩa các hàm linh hoạt hơn và có khả năng xử lý một số lượng tham số không giới hạn. Chúng giúp tăng tính mở rộng và tái sử dụng của mã nguồn, đồng thời cũng làm cho việc gọi hàm trở nên dễ dàng hơn trong nhiều trường hợp.
source: viblo