Bài học theo mô-đun (3/4)
*args và **kwargs
Đôi khi bạn muốn một hàm chấp nhận số biến của
lý lẽ. Python cung cấp cho bạn hai công cụ: *args (tập hợp các đối số vị trí
thành một bộ dữ liệu) và **kwargs (tập hợp các đối số từ khóa thành một lệnh).
*args: đối số vị trí có thể thay đổi
def somma_tutto(*nums):
totale = 0
for n in nums:
totale += n
return totale
somma_tutto(1, 2, 3) # 6
somma_tutto(1, 2, 3, 4, 5) # 15
somma_tutto() # 0Bên trong hàm, nums là một bộ chứa tất cả các giá trị được truyền. các
tên chỉ là quy ước: *args là tên phổ biến nhất, nhưng *nums hoặc
*valori hoàn toàn hợp lệ.
**kwargs: đối số từ khóa biến
def crea_config(**opzioni):
return opzioni
crea_config(debug=True, port=8080)
# {'debug': True, 'port': 8080}Bên trong hàm, opzioni là dict với {param_name: value}.
Kết hợp mọi thứ
Thứ tự cố định là: **tham số thông thường, *args, tham số mặc định, **kwargs**.
def f(primo, *args, opzione="x", **kwargs):
print(primo, args, opzione, kwargs)
f(1, 2, 3, opzione="y", extra=10)
# 1 (2, 3) y {'extra': 10}Giải nén trong cuộc gọi: * và **
Toán tử tương tự hoạt động theo cách khác: để "làm nổ tung" một danh sách/bộ dữ liệu thành các đối số vị trí hoặc một mệnh lệnh thành các đối số từ khóa.
def punto(x, y, z):
return (x, y, z)
coords = [1, 2, 3]
punto(*coords) # punto(1, 2, 3) → (1, 2, 3)
opts = {"x": 1, "y": 2, "z": 3}
punto(**opts) # punto(x=1, y=2, z=3)Mẫu bao bọc
def log_chiamata(fn, *args, **kwargs):
print(f"chiamo {fn.__name__} con {args=} {kwargs=}")
return fn(*args, **kwargs)
log_chiamata(max, 3, 1, 2) # calls max(3, 1, 2)
log_chiamata(sorted, [3, 1, 2], reverse=True)Thứ tự tham số trong chữ ký hàm
Khi xác định một hàm chấp nhận nhiều loại đối số, bạn phải tuân theo một thứ tự nghiêm ngặt trong chữ ký:
- Thông số vị trí tiêu chuẩn.
- Các biến thể vị trí
*args. - Thông số từ khóa có giá trị mặc định.
- Các biến thể từ khóa
**kwargs.
Hãy thử nó
Xác định `trung bình(*nums)` trả về giá trị trung bình số học (tổng / số). Gọi nó với 10, 20, 30 và gán kết quả cho `m`. Đánh giá `m`.
Hiển thị gợi ý
tổng(nums) / len(nums)
Giải pháp khả dụng sau 3 lần thử
Xem lại bài tập
Cho hàm `def point(x, y, z): return x + y + z` và dict `coords = {'x': 1, 'y': 2, 'z': 3}`, gọi điểm giải nén các coords và gán kết quả cho `s`. Đánh giá `s`.
Hiển thị gợi ý
điểm(** coords)
Giải pháp khả dụng sau 3 lần thử
Thử thách bổ sung
Write a function `multiply_all(*args)` that returns the product of all numbers passed as arguments. If no arguments are passed, it should return `1`. Finally, evaluate the call `multiply_all(2, 3, 4)`.
Hiển thị gợi ý
Sử dụng vòng lặp for để lặp lại các phần tử trong args và tích lũy tích của chúng.
Giải pháp khả dụng sau 3 lần thử