*args và **kwargs trong Python

hướng dẫn học python tìm hiểu ngôn ngữ lập trình python nguyễn Đức mùi

Trong Python, *args**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.

hướng dẫn học python tìm hiểu ngôn ngữ lập trình python nguyễn Đức mùi

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**kwargs

Chúng ta có thể sử dụng đồng thời cả *args**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:

  • *args gom tất cả tham số vị trí (1, 2, 3) thành một tuple.
  • **kwargs gom 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

  • *args dù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.
  • **kwargs dùng để truyền một danh sách tham số không giới hạn dưới dạng tê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**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.

Menu Python>>

Hotline: 039.2266.928
Khóa học Toefl
Phone now