Как присвоить результат выполнения двух функций python в одну переменную и одну строку
У меня есть две функции:
def replacer(text):
return text.replace('*', '')
def replacer_(text):
return text.replace('!', '')
И текст который должен передаваться каждой из функций выше:
text = '*ello worl**!'
Мне необходимо после выполнения этих двух функций получить результат:
text = 'ello worl'
Я хочу написать код в одну строку, который мог бы присвоить и дать возможность использовать результат одной функции другой, чтобы не пришлось писать так и код был в одну строку (примеры ниже отображают нежелательный для меня код, для получения общего результата):
# первый плохой пример
result1 = replacer(text)
result = replacer_(result1)
# второй плохой пример
result1 = replacer(text); result = replacer_(result1)
Почему эти примеры являются для меня плохими и почему они нежелательны с моей стороны:
- Мои названия функций гораздо больше, чем приведены на примерах
- Название моей переменной с текстом гораздо больше, чем приведена на примере
- Код который был приведен выше, был добавлен в качестве примеров, чтобы решить мою другую текущую проблему, которая с этим связана (поэтому здесь всё на примерах)
- Из-за подозрения что это можно сделать более лучше, чем делать идентичные действия одного к другому
Также не хотелось бы видеть (из-за причин указанных выше):
result = replacer(replacer_(text))
Ответы (5 шт):
Можно создать простую функцию, принимающую на вход исходную строку и словарь со всеми заменами, которая будет в цикле делать замены:
# словарь замен: ключ - что меняем, значение - на что заменяем
mapping = {
"hi": "привет",
"all": "всем",
"how are you doing": "как дела"
}
def repl(s, map_):
res = s
# делаем в цикле все замены согласно словарю замен
for k, v in map_.items():
res = res.replace(k, v)
return res
Пример использования:
In [301]: repl("hi all! how are you doing?", mapping)
Out[301]: 'привет всем! как дела?'
Можно сделать ещё вот так: просто записать все нужные функции в список и по очереди их применить. Хотя вариант MaxU с маппингом лучше/правильнее.
def replacer(text):
return text.replace('*', '')
def replacer_(text):
return text.replace('!', '')
text = '*ello worl**!'
replacers = [
replacer,
replacer_
]
for r in replacers:
text = r(text)
print(text)
Вывод:
ello worl
По мотивам ответа @MaxU, но в один проход используя regexp.
import re
mapping = {
"hi": "привет",
"all": "всем",
"how are you doing": "как дела"
}
def repl(s, map_):
return re.sub("|".join(re.escape(k) for k in map_), lambda m: map_[m.group(0)], s)
print(repl("hi all! how are you doing?", mapping))
# Необходимый импорт
from functools import reduce
# Первая Ваша функция
def replacer(text):
return text.replace('*', '')
# Вторая Ваша функция
def replacer_(text):
return text.replace('!', '')
if __name__ == '__main__':
# Исходный текст
text = '*ello worl**!'
# Применение всех функций к исходному тексту в одну строку
result = reduce(lambda acc, func: func(acc), (replacer, replacer_), text)
# Вывод результата
print(result)
result = reduce(lambda acc, func: func(acc), (replacer, replacer_), text)
# ^ Свёртка
# ^ Правило свёртки
# ^ Множество объектов для свёртки
# ^ Начальное значение
Во внешней библиотеке toolz есть несколько подходящих функций, в частности
compose(f, g, h, ...)(x) = f(g(h(...(x))))
compose_left(f, g, h, ...)(x) = ...(h(g(f(x))))
pipe(x, f, g, h, ...) = ...(h(g(f(x))))
from toolz import pipe
result = pipe('*ello worl**!', replacer, replacer_)
Более содержательный пример
from toolz import compose_left
replacers = replacer, replacer_
replace_all = compose_left(*replacers)
result = replace_all('*ello worl**!')