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
*args
và**kwargs
trong định nghĩa hàm là quan trọng.*args
phải đứng trước**kwargs
- Bạn có thể sử dụng bất kỳ tên nào cho
*args
và**kwargs
miễn là tuân thủ quy tắc đặt tên biến trong Python. Tuy nhiên,*args
và**kwargs
là 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,
*args
sẽ là một tuple rỗng, và**kwargs
sẽ 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.