Chuyển đến nội dung chính
Mô-đun 5 · Bài học 3 trong tổng số 419/36 trong khóa học~12 min
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

Python
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()                # 0

Bê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

Python
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**.

Python
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.

Python
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

Python
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ý:

  1. Thông số vị trí tiêu chuẩn.
  2. Các biến thể vị trí *args.
  3. Thông số từ khóa có giá trị mặc định.
  4. Các biến thể từ khóa **kwargs.

Hãy thử nó

tập thể dục#python.m5.l3.e1
Nỗ lực: 0Đang tải…

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`.

Đang tải trình chỉnh sửa…
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

tập thể dục#python.m5.l3.e2
Nỗ lực: 0Đang tải…

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`.

Đang tải trình chỉnh sửa…
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

tập thể dục#python.m5.l3.e3
Nỗ lực: 0Đang tải…

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)`.

Đang tải trình chỉnh sửa…
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ử