Перейти до основного вмісту
Модуль 5 · Урок 3 із 419/36 у курсі~12 min
Модульні уроки (3/4)

*args і **kwargs

Іноді вам потрібна функція, яка приймає змінну кількість аргументи. Python надає два інструменти: *args (збирає позиційні аргументи у кортеж) і **kwargs (збирає аргументи ключових слів у dict).

*args: змінні позиційні аргументи

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

Усередині функції nums є кортежем з усіма переданими значеннями. The назва є лише умовністю: *args є найпоширенішим, але *nums або *valori are perfectly valid.

**kwargs: змінні ключові аргументи

Python
def crea_config(**opzioni):
    return opzioni

crea_config(debug=True, port=8080)
# {'debug': True, 'port': 8080}

Усередині функції opzioni є dict із {param_name: value}.

Поєднуючи все

Фіксований порядок такий: **звичайні параметри, *args, параметри за замовчуванням, **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}

Розпакування в дзвінку: * та **

Той самий оператор працює навпаки: щоб «розбити» список/кортеж у позиційні аргументи або dict у ключові аргументи.

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)

Візерунок обгортки

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)

Впорядкування параметрів у сигнатурах функцій

Визначаючи функцію, яка приймає кілька типів аргументів, ви повинні дотримуватися суворого порядку в підписі:

  1. Стандартні позиційні параметри.
  2. Позиційні параметри *args.
  3. Параметри ключових слів зі значеннями за замовчуванням.
  4. Параметри ключового слова **kwargs.

Спробуйте

вправи#python.m5.l3.e1
Спроби: 0Завантаження…

Визначте `average(*nums)`, який повертає середнє арифметичне (сума / кількість). Викличте це за допомогою 10, 20, 30 і призначте результат `m`. Оцініть `m`.

Завантаження редактора…
Показати підказку

sum(nums) / len(nums)

Рішення доступне після 3 спроб

Повторна вправа

вправи#python.m5.l3.e2
Спроби: 0Завантаження…

Дано функцію `def point(x, y, z): return x + y + z` і dict `coords = {'x': 1, 'y': 2, 'z': 3}`, координати розпакування точки виклику та присвоєння результату `s`. Оцініть `s`.

Завантаження редактора…
Показати підказку

точка (**координати)

Рішення доступне після 3 спроб

Додатковий виклик

вправи#python.m5.l3.e3
Спроби: 0Завантаження…

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

Завантаження редактора…
Показати підказку

Використовуйте цикл for, щоб перебирати елементи в args і накопичувати їх продукт.

Рішення доступне після 3 спроб