*args и **kwargs

Тренажер по Python для пользователей с начальным уровнем подготовки.

Тренажер по Python

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

Мы разберем:

  • Как упаковывать лишние позиционные аргументы в кортеж.
  • Как собирать именованные аргументы в словарь.
  • Правильный порядок определения параметров.
  • Распаковку списков и словарей при вызове функций.

Задания варьируются от простого заполнения пропусков до поиска ошибок в структуре функций и предсказания результата работы кода. Будьте внимательны к типам данных (кортежи vs словари) и синтаксису звездочек.

Список тем

Определение функции с произвольным числом аргументов

id: 40040_task_args_intro_1

Напишите определение функции, которая принимает любое количество позиционных аргументов. Внутри функции эти аргументы доступны как кортеж. Обратите внимание: при использовании переменной внутри функции звездочка уже не ставится.

Заполните пропуски
def show_items(input1S):
    print(f"Получено {len(input2S)} элементов")
    for item in input2S:
        print(item)

show_items(1, 2, 3, 4)
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Определите типы данных контейнеров

id: 40040_task_predict_types_2

Функция принимает как позиционные, так и именованные аргументы через специальные конструкции. Проанализируйте код и выберите, какой вывод он сгенерирует, основываясь на типах данных, в которые Python упаковывает эти аргументы.

Выберите правильный вариант ответа
def check_types(*args, **kwargs):
    print(type(args))
    print(type(kwargs))

check_types(1, 2, a=3, b=4)
Сообщения
Проверить
Показать подсказку

Перебор именованных аргументов

id: 40040_task_kwargs_iter_3

Допишите код функции, которая принимает произвольное количество именованных аргументов и выводит их ключи и значения.

Заполните пропуски
def print_config(input1S):
    for key, value in input2S.items():
        print(f"{key}: {value}")

print_config(host='localhost', port=8080)
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Распределение аргументов при вызове

id: 40040_task_sort_args_4

Дана функция `def complex_func(a, *args, **kwargs):`. Распределите значения из вызова функции `complex_func(10, 20, 30, mode='fast', level=5)` по соответствующим переменным внутри функции.

Перетяните элементы в соответствующие блоки
Переменная a
Кортеж args
Словарь kwargs
10
20
30
'mode': 'fast'
'level': 5
Сообщения
Проверить
Показать подсказку

Соберите функцию-сумматор

id: 40040_task_build_sum_5

Составьте функцию `total_sum`, которая принимает любое количество чисел и возвращает их сумму. В наборе есть лишняя строка с неверным синтаксисом цикла.

Перетяните в правильном порядке строки из одного блока в другой
def total_sum(*numbers):
    result = 0
    for num in numbers:
        result += num
    return result
    for num in *numbers:
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Порядок параметров в определении функции

id: 40040_task_sequence_def_6

В Python порядок определения параметров функции строго регламентирован. Расставьте части определения функции в правильном порядке, чтобы код был синтаксически верным.

Расставьте строки в правильном порядке
def super_func(
required,
*args,
default=None,
**kwargs):
    pass
Сообщения
Проверить
Показать подсказку

Сопоставьте оператор и его действие

id: 40040_task_compare_ops_7

Сопоставьте символы звездочек с их значением в разных контекстах (определение функции и вызов функции).

Сопоставьте строки в правой части с соответствующими строками в левой по порядковому номеру
def func(*args) - Упаковка
def func(**kwargs) - Упаковка
func(*lst) - Распаковка
func(**dct) - Распаковка
позиционных аргументов в кортеж
именованных аргументов в словарь
списка/кортежа в отдельные аргументы
словаря в именованные аргументы
Сообщения
Проверить
Показать подсказку

Исправьте синтаксическую ошибку

id: 40040_task_error_order_8

В этом определении функции нарушен порядок специальных аргументов, что вызовет ошибку `SyntaxError`. Исправьте строку определения.

Найдите ошибку и исправьте
def processor(data, **kwargs, *args):
    print(data)
    print(args)
    print(kwargs)
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Результат распаковки словаря

id: 40040_task_give_unpack_9

У нас есть функция, которая форматирует строку по шаблону. Что выведет код при использовании распаковки словаря?

Что должно получиться?
def introduce(name, job):
    print(f"I am {name} the {job}")

user = {'name': 'Bob', 'job': 'Builder'}
introduce(**user)
Сообщения
Проверить
Показать подсказку

Написание функции-обертки (Wrapper)

id: 40040_task_bank_wrapper_10

Заполните пропуски, чтобы создать функцию `wrapper`, которая принимает ЛЮБЫЕ аргументы, печатает сообщение 'Log', а затем вызывает оригинальную функцию `func` с этими же аргументами без изменений. Это классический пример использования `*args` и `**kwargs`.

Нужно правильно расставить в пропуски предложенные варианты
def func(a, b, c=3):
    return a + b + c

def wrapper(input1S, input2S):
    print('Log')
    return func(input3S, input4S)
*args
**kwargs
args
kwargs
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку
НайтиКурс.Ру