Nếu bạn không biết có bao nhiêu đối số sẽ được truyền vào hàm của mình, hãy thêm ____16_______ trước tên tham số trong định nghĩa hàm
Bằng cách này, hàm sẽ nhận được một bộ đối số và có thể truy cập các mục tương ứng
Ví dụ
Nếu số lượng đối số không xác định, hãy thêm ____16_______ trước tên tham số
def my_function[*kids]
print["Đứa trẻ nhỏ nhất là " + kids[2]]
my_function["Emil", "Tobias", "Linus"]
Tự mình thử »Đối số tùy ý thường được rút ngắn thành *args trong tài liệu Python
Hàm là các khối xây dựng trong Python. Họ lấy 0 hoặc nhiều đối số và trả về một giá trị. Python khá linh hoạt về cách các đối số được truyền cho một hàm. *args và **kwargs giúp xử lý các đối số dễ dàng và rõ ràng hơn
Các phần quan trọng là “*” và “**”. Bạn có thể sử dụng bất kỳ từ nào thay cho args và kwargs nhưng thông thường người ta thường sử dụng các từ args và kwargs. Vì vậy, không cần những cuộc phiêu lưu không cần thiết
Trong bài đăng này, chúng ta sẽ xem qua 10 ví dụ mà tôi nghĩ sẽ làm cho khái niệm về *args và **kwargs trở nên rõ ràng
ví dụ 1
Xét hàm tính tổng hai số sau
def addition[a, b]:
return a + bprint[addition[3,4]]
7
Hàm này tổng chỉ có hai số. Điều gì sẽ xảy ra nếu chúng ta muốn một hàm tính tổng ba hoặc bốn số?
Trong những trường hợp như vậy, chúng ta có thể sử dụng *args làm tham số
* args cho phép một hàm lấy bất kỳ số lượng đối số vị trí nào
def addition[*args]:
result = 0
for i in args:
result += i
return result
Các tham số được truyền cho hàm cộng được lưu trữ trong một bộ dữ liệu. Do đó, chúng ta có thể lặp qua biến args
print[addition[]]
0print[addition[1,4]]
5print[addition[1,7,3]]
11
ví dụ 2
Trước ví dụ thứ hai, tốt hơn là giải thích sự khác biệt giữa đối số vị trí và đối số từ khóa
- Đối số vị trí chỉ được khai báo bằng tên
- Đối số từ khóa được khai báo bằng tên và giá trị mặc định
Khi một hàm được gọi, các giá trị cho các đối số vị trí phải được cung cấp. Nếu không, chúng tôi sẽ nhận được một lỗi
Nếu chúng ta không chỉ định giá trị cho đối số từ khóa, nó sẽ nhận giá trị mặc định
def addition[a, b=2]: #a is positional, b is keyword argument
return a + bprint[addition[1]]
3def addition[a, b]: #a and b are positional arguments
return a + bprint[addition[1]]
TypeError: addition[] missing 1 required positional argument: 'b'
Bây giờ chúng ta có thể làm ví dụ thứ hai. Có thể sử dụng *args và các biến được đặt tên cùng nhau. Hàm sau in các đối số đã truyền tương ứng
def arg_printer[a, b, *args]:
print[f'a is {a}']
print[f'b is {b}']
print[f'args are {args}']arg_printer[3, 4, 5, 8, 3]
a is 3
b is 4
args are [5, 8, 3]
Hai giá trị đầu tiên được trao cho a và b. Các giá trị còn lại được lưu trữ trong bộ args
ví dụ 3
Python muốn chúng ta đặt đối số từ khóa sau đối số vị trí. Chúng ta cần ghi nhớ điều đó khi gọi một hàm
Xem xét ví dụ sau
arg_printer[a=4, 2, 4, 5]SyntaxError: positional argument follows keyword argument
Nếu chúng ta gán một giá trị cho một đối số vị trí, nó sẽ trở thành một đối số từ khóa. Vì nó được theo sau bởi các đối số vị trí, nên chúng tôi nhận được Lỗi cú pháp
Ví dụ 4
Trong hàm sau, tùy chọn là một đối số từ khóa [nó có giá trị mặc định]
def addition[a, b, *args, option=True]:
result = 0
if option:
for i in args:
result += i
return a + b + result
else:
return result
Hàm này thực hiện thao tác cộng nếu tùy chọn là True. Vì giá trị mặc định là True, nên hàm trả về tổng của các đối số trừ khi tham số tùy chọn được khai báo là Sai
print[addition[1,4,5,6,7]]
23print[addition[1,4,5,6,7, option=False]]
0
Ví dụ 5
**kwargs thu thập tất cả các đối số từ khóa không được xác định rõ ràng. Do đó, nó thực hiện thao tác tương tự như *args nhưng đối với đối số từ khóa
**kwargs cho phép một hàm lấy bất kỳ số lượng đối số từ khóa nào
Theo mặc định, **kwargs là một từ điển rỗng. Mỗi đối số từ khóa không xác định được lưu trữ dưới dạng một cặp khóa-giá trị trong từ điển **kwargs
________số 8_______Ví dụ 6
Chúng ta có thể sử dụng cả *args và **kwargs trong một hàm nhưng *args phải được đặt trước **kwargs
def arg_printer[a, b, *args, option=True, **kwargs]:
print[a, b]
print[args]
print[option]
print[kwargs]arg_printer[1, 4, 6, 5, param1=5, param2=6]
1 4
[6, 5]
True
{'param1': 5, 'param2': 6}
Ví dụ 7
Chúng ta có thể đóng gói và giải nén các biến sử dụng *args và **kwargs
def addition[*args]:
result = 0
for i in args:
result += i
return result
0Nếu chúng ta chuyển một danh sách cho hàm trên, nó sẽ được lưu trữ trong args tuple dưới dạng một phần tử duy nhất
def addition[*args]:
result = 0
for i in args:
result += i
return result
1Nếu chúng ta đặt dấu hoa thị trước lst, các giá trị trong danh sách sẽ được giải nén và lưu trữ riêng trong bộ args
def addition[*args]:
result = 0
for i in args:
result += i
return result
2Ví dụ 8
Chúng ta có thể vượt qua nhiều lần lặp để được giải nén cùng với các phần tử đơn lẻ. Tất cả các giá trị sẽ được lưu trữ trong bộ args
def addition[*args]:
result = 0
for i in args:
result += i
return result
3Ví dụ 9
Chúng tôi cũng có thể thực hiện việc đóng gói và giải nén với các đối số từ khóa
def addition[*args]:
result = 0
for i in args:
result += i
return result
4Nhưng có thể lặp lại được truyền dưới dạng đối số từ khóa phải là ánh xạ, chẳng hạn như từ điển
def addition[*args]:
result = 0
for i in args:
result += i
return result
5Ví dụ 10
Nếu chúng ta cũng chuyển các đối số từ khóa bổ sung cùng với một từ điển, chúng sẽ được kết hợp và lưu trữ trong từ điển kwargs