Напишите функцию 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.
Посмотреть код
Решение
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
Решение
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)