Trong Python, *args và **kwargs cho phép hàm nhận một số lượng tham số không xác định. Điều này giúp tăng tính linh hoạt khi thiết kế các hàm có thể xử lý nhiều đầu vào khác nhau.

Ví dụ:
Sử dụng *args:
def tong(*args):
return sum(args)
print(tong(1, 2, 3, 4))
print(tong(5, 10, 15))
Kết quả:
10 30
Sử dụng **kwargs:
def hien_thi(**kwargs):
for k, val in kwargs.items():
print(k, val)
hien_thi(a=1, b=2, c=3)
Kết quả:
a 1 b 2 c 3
1. *args là gì?
Trong định nghĩa hàm, *args được sử dụng để truyền vào một danh sách tham số có độ dài tùy ý. Tham số này không có tên khóa (non-keyword arguments).
Ví dụ, giả sử chúng ta muốn viết một hàm nhân tất cả các số truyền vào:
def nhan(*args):
ket_qua = 1
for num in args:
ket_qua *= num
return ket_qua
print(nhan(2, 3, 4))
print(nhan(5, 6))
Kết quả:
24 30
*args giúp gom tất cả tham số truyền vào thành một iterable (danh sách, tuple), từ đó có thể duyệt qua hoặc áp dụng các hàm như map(), filter(), v.v.
Ví dụ 1: Duyệt qua *args
def hien_thi_chuoi(*args):
for chuoi in args:
print(chuoi)
hien_thi_chuoi("Xin chào", "Chào mừng", "đến", "Python")
Kết quả:
Xin chào Chào mừng đến Python
Ví dụ 2: *args với tham số cố định
def vi_du(arg_dau, *args):
print("Tham số đầu tiên:", arg_dau)
for arg in args:
print("Tham số tiếp theo:", arg)
vi_du("Python", "Java", "C++", "JavaScript")
Kết quả:
Tham số đầu tiên: Python Tham số tiếp theo: Java Tham số tiếp theo: C++ Tham số tiếp theo: JavaScript
2. **kwargs là gì?
Trong định nghĩa hàm, **kwargs cho phép truyền một số lượng tham số không giới hạn dưới dạng cặp tên khóa – giá trị (dạng từ điển).
Ví dụ:
def thong_tin(**kwargs):
for k, val in kwargs.items():
print(f"{k} = {val}")
thong_tin(ten="Hải", tuoi=25, dia_chi="Hà Nội")
Kết quả:
ten = Hải tuoi = 25 dia_chi = Hà Nội
Ở đây, mỗi tham số được truyền vào dưới dạng tên khóa=value, và chúng được gom vào một từ điển (dict) để xử lý.
Ví dụ 1: Lưu trữ thông tin
def hien_thi_thong_tin(**kwargs):
for key, val in kwargs.items():
print(f"{key} -> {val}")
hien_thi_thong_tin(mon_hoc="Toán", diem=9, hoc_ky="HK1")
Kết quả:
mon_hoc -> Toán diem -> 9 hoc_ky -> HK1
Ví dụ 2: **kwargs với tham số cố định
def vi_du(arg1, **kwargs):
print("Tham số cố định:", arg1)
for key, val in kwargs.items():
print(f"{key} = {val}")
vi_du("Lập trình", ngon_ngu="Python", do_kho="Dễ")
Kết quả:
Tham số cố định: Lập trình ngon_ngu = Python do_kho = Dễ
3. Kết hợp *args và **kwargs
Chúng ta có thể sử dụng đồng thời cả *args và **kwargs trong cùng một hàm để chấp nhận cả tham số không có tên khóa và tham số có tên khóa.
Ví dụ:
def vi_du(*args, **kwargs):
print("Các tham số không có khóa:", args)
print("Các tham số có khóa:", kwargs)
vi_du(1, 2, 3, a=4, b=5)
Kết quả:
Các tham số không có khóa: (1, 2, 3)
Các tham số có khóa: {'a': 4, 'b': 5}
Trong hàm trên:
*argsgom tất cả tham số vị trí (1, 2, 3) thành một tuple.**kwargsgom tất cả tham số có tên khóa (a=4, b=5) thành một từ điển (dict).
Kết luận
*argsdùng để truyền một danh sách tham số không giới hạn mà không cần chỉ định tên khóa.**kwargsdùng để truyền một danh sách tham số không giới hạn dưới dạngtên khóa=value.- Kết hợp cả hai giúp hàm linh hoạt hơn, có thể nhận cả tham số vị trí và tham số từ điển.
Với *args và **kwargs, chúng ta có thể viết các hàm linh hoạt, dễ sử dụng và có khả năng mở rộng tốt hơn trong Python.
