G. Подготовитель данных

Напишите функцию get_formatter, которая принимает два именованных параметра:
sep – разделитель, по умолчанию пробел;
end — завершающий символ, по умолчанию пустая строка.
Функция должна вернуть новую функцию, которая преобразует не определенное количество аргументов в строку, с заданным ранее разделителем и завершающим символом.

Примечание

В решении не должно быть вызовов требуемых функций.

Пример

Ввод

formatter = get_formatter()
print(formatter(1, 2, 3, 4, 5))

Вывод

1 2 3 4 5

Ввод

formatter = get_formatter(end="!", sep=", ")
print(formatter("Hello", "world"))

Вывод

Hello, world!

Решение

Наша задача — построить функцию-генератор, то есть такую функцию, которая возвращает другую функцию с заранее заданным поведением. Конкретно: мы хотим, чтобы при вызове get_formatter(sep, end) она возвращала функцию, умеющую принимать любое количество аргументов, объединять их в строку через разделитель sep и в конце добавлять end.

Грубо говоря, это как если бы мы настроили шаблон форматирования один раз — а дальше уже пользовались им многократно, просто передавая данные, которые нужно склеить в строку. Такой приём — важный элемент функционального стиля: настраиваем поведение, возвращаем «настроенную» функцию и применяем её там, где нужно.

Ниже представлены два подхода к реализации:

Второй вариант — более компактный, с использованием lambda, там, где это уместно.

Первый вариант — более явный, развёрнутый, с локальной функцией внутри make_formatter.

Посмотреть код

Решение

Python
def to_string(*items, separator=' ', ending=''):
    parts_as_strings = [str(item) for item in items]
    return separator.join(parts_as_strings) + ending


def get_formatter(sep=' ', end=''):
    def format_items(*args):
        return to_string(*args, separator=sep, ending=end)
    return format_items

Решение

Python
def to_string(*items, separator=' ', ending=''):
    string_parts = [str(item) for item in items]
    joined = separator.join(string_parts)
    return joined + ending


def get_formatter(sep=' ', end=''):
    return lambda *data_items: to_string(*data_items, separator=sep, ending=end)

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии