Trong bài viết này, chúng ta sẽ tìm hiểu về Python * args và ** kwargs, cách sử dụng và chức năng của chúng với các ví dụ.
Trong lập trình, chúng ta định nghĩa một hàm để tạo một đoạn mã có thể sử dụng lại thực hiện hoạt động tương tự. Để thực hiện thao tác đó, chúng ta gọi một hàm với giá trị cụ thể, giá trị này được gọi là đối số của hàm trong Python.
Chúng tôi khuyên bạn nên đọc Hàm Python và Đối số hàm Python.
Giả sử, chúng ta xác định một hàm để cộng 3 số.
Ví dụ 1: Hàm cộng 3 số
def adder(x,y,z): print("sum:",x+y+z) adder(10,12,13)
Khi chúng tôi chạy chương trình trên, kết quả đầu ra sẽ là
tổng: 35
Trong chương trình trên, chúng ta có adder()
hàm với ba đối số x, y và z. Khi chúng tôi truyền ba giá trị trong khi gọi adder()
hàm, chúng tôi nhận được tổng của 3 số làm đầu ra.
Cho phép xem điều gì sẽ xảy ra khi chúng ta truyền hơn 3 đối số trong adder()
hàm.
def adder(x,y,z): print("sum:",x+y+z) adder(5,10,15,20,25)
Khi chúng tôi chạy chương trình trên, kết quả đầu ra sẽ là
TypeError: adder () nhận 3 đối số vị trí nhưng 5 đối số được đưa ra
Trong chương trình trên, chúng ta đã truyền 5 đối số cho adder()
hàm thay vì 3 đối số mà chúng ta nhận được TypeError
.
Giới thiệu về * args và ** kwargs trong Python
Trong Python, chúng ta có thể truyền một số lượng biến đối số cho một hàm bằng cách sử dụng các ký hiệu đặc biệt. Có hai biểu tượng đặc biệt:
- * args (Đối số không phải từ khóa)
- ** kwargs (Đối số từ khóa)
Chúng tôi sử dụng * args và ** kwargs làm đối số khi chúng tôi không chắc chắn về số lượng đối số cần truyền trong các hàm.
Python * args
Như trong ví dụ trên, chúng tôi không chắc chắn về số lượng đối số có thể được truyền cho một hàm. Python có * args cho phép chúng ta truyền số lượng biến các đối số không phải từ khóa vào hàm.
Trong hàm, chúng ta nên sử dụng dấu hoa thị *
trước tên tham số để truyền các đối số có độ dài thay đổi *
.
Ví dụ 2: Sử dụng * args để truyền các đối số có độ dài thay đổi cho hàm
def adder(*num): sum = 0 for n in num: sum = sum + n print("Sum:",sum) adder(3,5) adder(4,5,6,7) adder(1,2,3,5,6)
Khi chúng tôi chạy chương trình trên, kết quả đầu ra sẽ là
Tổng: 8 Tổng: 22 Tổng: 17
Trong chương trình trên, chúng tôi đã sử dụng * num như một tham số cho phép chúng tôi truyền danh sách đối số có độ dài thay đổi vào adder()
hàm. Bên trong hàm, chúng ta có một vòng lặp để thêm đối số được truyền vào và in kết quả. Chúng tôi đã chuyển 3 bộ giá trị khác nhau với độ dài thay đổi làm đối số cho hàm.
Python ** kwargs
Python chuyển đối số không phải từ khóa có độ dài thay đổi vào hàm bằng cách sử dụng * args nhưng chúng ta không thể sử dụng điều này để chuyển đối số từ khóa. Đối với vấn đề này, Python đã có một giải pháp được gọi là ** kwargs, nó cho phép chúng ta truyền độ dài thay đổi của các đối số từ khóa cho hàm.
Trong hàm, chúng tôi sử dụng dấu sao kép **
trước tên tham số để biểu thị loại đối số này. Các đối số được truyền dưới dạng từ điển và các đối số này tạo thành một từ điển bên trong hàm có tên giống với tham số không bao gồm dấu hoa thị kép **
.
Ví dụ 3: Sử dụng ** kwargs để chuyển các đối số từ khóa biến cho hàm
def intro(**data): print("Data type of argument:",type(data)) for key, value in data.items(): print("() is ()".format(key,value)) intro(Firstname="Sita", Lastname="Sharma", Age=22, Phone=1234567890) intro(Firstname="John", Lastname="Wood", Email="[email protected]", Country="Wakanda", Age=25, Phone=9876543210)
Khi chúng tôi chạy chương trình trên, kết quả đầu ra sẽ là
Kiểu dữ liệu của đối số: Firstname là Sita Họ là Sharma Tuổi là 22 Điện thoại là 1234567890 Loại dữ liệu của đối số: Firstname là John Lastname là Wood Email là [email protected] Quốc gia là Wakanda Tuổi là 25 Điện thoại là 9876543210
Trong chương trình trên, chúng ta có một hàm intro()
với ** data là một tham số. Chúng tôi đã chuyển hai từ điển có độ dài đối số thay đổi cho intro()
hàm. Chúng ta có hàm for loop bên trong intro()
hoạt động trên dữ liệu của từ điển được truyền vào và in ra giá trị của từ điển.
Những điều cần ghi nhớ:
- * args và * kwargs là từ khóa đặc biệt cho phép hàm nhận đối số độ dài thay đổi.
- * args chuyển một số thay đổi của danh sách đối số không có từ khóa và hoạt động nào của danh sách có thể được thực hiện.
- ** kwargs chuyển từ điển số lượng đối số từ khóa thay đổi để hoạt động trên đó có thể thực hiện hoạt động của từ điển.
- * args và ** kwargs làm cho chức năng trở nên linh hoạt.