Как создать список из функций (+, -, *, /)
Как создать список из функций (+, -, *, /) используя функцию, которая как аргумент принимает имя (текстом) одной из 4-х арифметических операций
1я часть задачи заключалась в том, чтобы написать функцию, которая как аргумент принимает имя (текстом) одной из 4-х арифметических операций (сумма, сложение, вычитание, деление) и возвращает другую функцию, которая выполняет эту операцию для 2х переменных:
def func_factory(operation):
if operation == 'summ':
def summ(a, b):
return a + b
return summ
elif operation == 'mul':
def mul(a, b):
return a * b
return mul и т.д.
summation = func_factory('mul')
res = summation(12, 2)
print(res)
2я часть. Используя эту функцию нужно создать список из полученных функций (выполняющих арифметические операции) и применить их по очереди к одной и той же паре аргументов
Должно получиться:
lst = [summ, mul, subtract, divide]
for func in lst:
func(x,y)
Ответы (3 шт):
Вот решения ваших задач
def func_factory(operation):
if operation == 'summ':
def summ(a, b):
return a + b
return summ
elif operation == 'mul':
def mul(a, b):
return a * b
return mul
elif operation == 'subtract':
def subtract(a, b):
return a - b
return subtract
elif operation == 'divide':
def divide(a, b):
return a / b
return divide
else:
raise Exception
x = int(input())
y = int(input())
funcs_names = ['summ', 'mul', 'subtract', 'divide']
lst = [func_factory(i) for i in funcs_names]
for func in lst:
print(func(x, y))
UPD Данный код работает и я его оставлю как пример того, как это может работать. Но, не используйте данный код в своих проектах и вот почему (согласно PEP8):
Always use a def statement instead of an assignment statement that binds a lambda expression directly to an identifier
Всегда используйте выражение def, а не присваивание лямбда-выражения к имени
Правильное использование:
def f(x): return 2*x
НЕ правильное использование:
f = lambda x: 2*x
Коротко: не присваивайте имена для lambda выражений
Вставлю свое решение, может понравится
def operation(*args):
func = {
"minus": lambda a, b : a - b,
"plus" : lambda a, b : a + b,
"substract":lambda a, b : a * b,
"divide":lambda a, b : a / b
}
if args:
for i in args:
assert i in func.keys()
return func[i]
return func
Посмотрим на результаты
>>> operation("minus")(10,2)
8
>>> operation("plus")(10,2)
12
>>> operation("substract")(10,2)
20
>>> operation("divide")(10,2)
5.0
>>> for name, func in f.items():
... func(10,2)
...
8
12
20
5.0
Ну, и в итоге, что будет если передадим чушь
>>> operation("blabla")(10,2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 10, in operation
AssertionError
Что и требовалось ожидать.
просто для расширения ассортимента. решение с использованием модуля operator
import operator as op
def func(oper):
funcs_names = {
'+': op.__add__,
'*': op.__mul__ ,
'-': op.__sub__,
'/': op.truediv
}
try:
return funcs_names[oper]
except KeyError:
raise ValueError('Неверная операция')
print(func('*')(5, 7)) # 35