Разработайте функцию get_operator
, которая принимает строковое обозначение одной из целочисленных математических операций Python
(+
, -
, *
, //
, **
) и возвращает соответствующую функцию двух переменных.
Примечание
В решении не должно быть вызовов требуемых функций.
Пример
Ввод
operator_plus = get_operator("+")
print(operator_plus(3, 5))
Вывод
8
Ввод
operator_power = get_operator("**")
print(operator_power(2, 10))
Вывод
1024
Решение
Нам предложено написать функцию, которая будет получать на вход оператор и возвращать функцию, которая могла бы выполнить соответствующую операцию с двумя аргументами.
Как мы знаем функция в python такой же объект, как и переменная, а значит, если написать
def sum(a, b)
return a + b
def func()
return sum
то func(a, b) будет эквивалентно вызову sum(a, b)
Обладая этим знанием, решить задачу не составляет труда.
Основой любого решения будет набор условий, которые возвращают ту или иную заранее описанную функцию.
Посмотреть код
Решение
def get_operator(operator: str):
def operator_add(a, b):
return a + b
def operator_sub(a, b):
return a - b
def operator_mul(a, b):
return a * b
def operator_floordiv(a, b):
return a // b
def operator_pow(a, b):
return a ** b
if operator == '+':
return operator_add
if operator == '-':
return operator_sub
if operator == '*':
return operator_mul
if operator == '//':
return operator_floordiv
if operator == '**':
return operator_pow
raise ValueError(f"Unsupported operator: {operator}")
Решение
def get_operator(operator: str):
if operator == '+':
return lambda a, b: a + b
if operator == '-':
return lambda a, b: a - b
if operator == '*':
return lambda a, b: a * b
if operator == '//':
return lambda a, b: a // b
if operator == '**':
return lambda a, b: a ** b
raise ValueError(f"Unsupported operator: {operator}")
Решение
import operator as op
def get_operator(operator: str):
mapping = {
'+': op.add,
'-': op.sub,
'*': op.mul,
'//': op.floordiv,
'**': op.pow,
}
try:
return mapping[operator]
except KeyError:
raise ValueError(f"Unsupported operator: {operator}")