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

*args и **kwargs

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

*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 представляет собой кортеж, в который передаются все значения. имя — это всего лишь соглашение: *args является наиболее распространенным, но *nums или *valori совершенно действительны.

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

Загрузка редактора…
Показать подсказку

сумма(числа) / длина(числа)

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#python.m5.l3.e2
Попыток: 0Загрузка…

Учитывая функцию `def point(x, y, z): верните 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 для перебора элементов в аргументах и ​​накопления их произведения.

Решение доступно после 3 попыток