Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Tìm hiểu về *args và **kwargs trong Python
Trong Python, *args
và **kwargs
là những cách sử dụng phổ biến trong các hàm, cho phép bạn truyền một số lượng tham số tùy ý vào hàm.
*args
: Cho phép truyền một số lượng tham số không xác định vào hàm dưới dạng tuple.**kwargs
: Cho phép truyền một số lượng tham số không xác định dưới dạng các cặp key-value (từ điển - dictionary).
*args
trong Python
Sử dụng *args
cho phép bạn truyền bất kỳ số lượng đối số nào vào một hàm. Bên trong hàm, *args
sẽ gói tất cả các đối số đó thành một tuple. Bạn có thể lặp qua tuple này để xử lý các tham số.
Ví dụ:
def foo(*args): for a in args: print(a) # Gọi hàm với 1 tham số foo(1) # Kết quả: # 1 # Gọi hàm với nhiều tham số foo("Patrick", 30, 1) # Kết quả: # Patrick # 30 # 1
**kwargs
trong Python
Sử dụng **kwargs
cho phép bạn truyền vào một số lượng tham số không xác định dưới dạng các cặp key-value. Bên trong hàm, **kwargs
sẽ chuyển các tham số này thành một dictionary. Bạn có thể duyệt qua dictionary này để xử lý.
Bài viết này được đăng tại [free tuts .net]
Ví dụ:
def foo(**kwargs): for key, value in kwargs.items(): print(key, value) # Gọi hàm với các tham số dạng key-value foo(name="Pat", age="30") # Kết quả: # name Pat # age 30
Kết hợp *args
và **kwargs
trong Python
Bạn có thể kết hợp *args
và **kwargs
với các tham số cố định trong hàm. Điều này cho phép bạn truyền vào cả các tham số cố định, tham số không xác định, và các tham số key-value.
Ví dụ:
def foo(name, *args, **kwargs): print("Name:", name) for a in args: print("Arg:", a) for key, value in kwargs.items(): print(f"{key}: {value}") foo("Patrick", 30, 1, role='Software Engineer', level=3) # Kết quả: # Name: Patrick # Arg: 30 # Arg: 1 # role: Software Engineer # level: 3
Unpacking (Mở rộng đối số) trong Python
Ngoài việc sử dụng *args
và **kwargs
để nhận tham số, bạn cũng có thể sử dụng chúng để mở rộng các đối số khi gọi hàm.
- Với
*
: Bạn có thể mở rộng các danh sách, tuple, set, hoặc string thành các đối số của hàm, miễn là độ dài tương ứng với các tham số trong hàm. - Với
**
: Bạn có thể mở rộng dictionary thành các cặp key-value, miễn là số lượng key và tên key khớp với các tham số.
Ví dụ:
def foo(a, b, c): print(a, b, c) # Mở rộng danh sách my_list = [1, 2, 3] foo(*my_list) # Kết quả: # 1 2 3 # Mở rộng chuỗi my_string = "ABC" foo(*my_string) # Kết quả: # A B C # Mở rộng dictionary my_dict = {'a': 4, 'b': 5, 'c': 6} foo(**my_dict) # Kết quả: # 4 5 6
Lưu ý khi sử dụng
- Thứ tự tham số: Khi kết hợp tham số thông thường,
*args
, và**kwargs
, bạn phải tuân thủ thứ tự: các tham số thông thường →*args
→**kwargs
. Ví dụ:
def foo(arg1, *args, **kwargs): pass
-
Không lạm dụng
*args
và**kwargs
: Dùng chúng khi cần thiết, tránh làm mất tính minh bạch của hàm. Trong một số trường hợp, việc khai báo cụ thể các tham số sẽ giúp hàm dễ đọc và dễ bảo trì hơn.
Kết bài
*args
dùng để nhận một số lượng đối số không xác định dưới dạng tuple.**kwargs
dùng để nhận các tham số key-value không xác định dưới dạng dictionary.- Cả hai đều giúp bạn tạo các hàm linh hoạt hơn khi xử lý nhiều loại đầu vào.
- Bạn có thể sử dụng chúng để mở rộng danh sách, tuple, hoặc dictionary khi gọi hàm.
Với cách sử dụng linh hoạt và mạnh mẽ, *args
và **kwargs
là công cụ không thể thiếu trong Python, đặc biệt trong các trường hợp cần viết hàm xử lý nhiều loại tham số khác nhau.