Trong bài viết này, chúng ta sẽ thảo luận *args
và **kwargs
bằng Python cùng với cách sử dụng của chúng và một số ví dụ.
Khi viết một hàm, chúng ta thường cần truyền giá trị cho hàm. Những giá trị này được gọi là đối số chức năng.
Vấn đề với đối số chức năng
Hãy định nghĩa một hàm để cộng hai số trong Python. Chúng tôi sẽ viết nó như thế này:
def add(x, y):
return x+y
print(add(2,3))
Đầu ra:
5
Nếu bạn cần thêm ba số thì sao? Đơn giản, chúng ta có thể sửa đổi hàm để chấp nhận ba đối số và trả về tổng của chúng là:
def add(x, y, z):
return x+y+z
print(add(2, 3, 5))
Đầu ra:
10
Đó không phải là khá đơn giản? Đúng!
Nhưng nếu chúng ta lại được yêu cầu chỉ cộng hai số thì sao? Chức năng sửa đổi của chúng tôi sẽ giúp chúng tôi có được tổng? Hãy xem nào:
def add(x, y, z):
return x+y+z
print(add(2, 3))
Đầu ra:
Traceback (most recent call last):
File "D:\Quarantine\Test\Blog-Codes\args-kwargs\main.py", line 14, in <module>
print(add(2, 3))
TypeError: add() missing 1 required positional argument: 'z'
Bạn thấy vấn đề?
Vấn đề phát sinh khi chúng ta có một số đối số thay đổi. Chúng ta có nên tiếp tục sửa đổi hàm để chấp nhận số lượng đối số chính xác không? Tất nhiên là không, chúng tôi sẽ không làm điều này.
Vì vậy, phải có một số cách khác để làm điều đó. Đây là đâu *args
và **kwargs
nhay vao.
Bạn có thể dùng *args
và **kwargs
làm đối số của hàm khi bạn không chắc chắn về số lượng đối số cần truyền vào hàm.
Cách sử dụng *args trong Python
*args
cho phép chúng tôi chuyển một số biến đối số không phải từ khóa cho hàm Python. Trong hàm, chúng ta nên sử dụng dấu hoa thị (*
) trước tên tham số để truyền một số đối số thay đổi.
def add(*args):
print(args, type(args))
add(2, 3)
Đầu ra:
(2, 3) <class 'tuple'>
Do đó, chúng tôi chắc chắn rằng các đối số được truyền này tạo một bộ bên trong hàm có cùng tên với tham số không bao gồm *
.
Bây giờ chúng ta hãy viết lại add()
chức năng với một số lượng đối số thay đổi.
def add(*numbers):
total = 0
for num in numbers:
total += num
return total
print(add(2, 3))
print(add(2, 3, 5))
print(add(2, 3, 5, 7))
print(add(2, 3, 5, 7, 9))
Đầu ra:
5
10
17
26
Lưu ý rằng tên của đối số không nhất thiết phải là args
– nó có thể là bất cứ thứ gì. Trong trường hợp này nó là numbers
. Nhưng nó thường là một cách tiêu chuẩn để sử dụng *args
như một cái tên.
Cách sử dụng **kwargs trong Python
**kwargs
cho phép chúng tôi chuyển một số lượng đối số từ khóa khác nhau cho hàm Python. Trong hàm, chúng ta sử dụng dấu hoa thị kép (**
) trước tên tham số để biểu thị loại đối số này.
def total_fruits(**kwargs):
print(kwargs, type(kwargs))
total_fruits(banana=5, mango=7, apple=8)
Đầu ra:
{'banana': 5, 'mango': 7, 'apple': 8} <class 'dict'>
Do đó, chúng ta thấy rằng các đối số, trong trường hợp này, được truyền dưới dạng từ điển và các đối số này tạo ra một từ điển bên trong hàm có tên giống như tham số loại trừ **
.
Bây giờ, hãy hoàn thành total_fruits()
hàm trả về tổng số trái cây.
def total_fruits(**fruits):
total = 0
for amount in fruits.values():
total += amount
return total
print(total_fruits(banana=5, mango=7, apple=8))
print(total_fruits(banana=5, mango=7, apple=8, oranges=10))
print(total_fruits(banana=5, mango=7))
Đầu ra:
20
30
12
Lưu ý rằng tên của đối số không nhất thiết phải là kwargs
– một lần nữa, nó có thể là bất cứ điều gì. Trong trường hợp này, nó là fruits
. Nhưng nó thường là một cách tiêu chuẩn để sử dụng **kwargs
như một cái tên.
Phần kết luận
Trong bài viết này, chúng ta đã tìm hiểu về hai từ khóa đặc biệt trong Python – *args
và **kwargs
. Những điều này làm cho một hàm Python trở nên linh hoạt để nó có thể chấp nhận một số lượng đối số và đối số từ khóa tương ứng.
Cảm ơn vì đã đọc!
Bạn có thể tìm thấy mã cho blog này ở đây.