Каррирование Python
Подскажите, правильно ли написан код к данной задаче? Оценили очень низко, в связи с этим еще вопрос: если задача решена неверно, то как стоило её решить и в чем суть каррирования в Python?
import math # импорт модуля
def func(x1, x2, x3, c):
return x1 ** 2 + math.sqrt(x2) + x3/(x1 + x2) + c
example = func(5, 16, 7, 1)
print(example)
def func1(x1=5):
def func2(x2):
def func3(x3=7):
def func4(c):
print(x1 ** 2 + math.sqrt(x2) + x3 / (x1 + x2) + c)
return func4
return func3
return func2
func1()(16)()(1)
Ответы (2 шт):
Автор решения: mkkik
→ Ссылка
Вероятно, понятие каррирования (как частичное применение/выполнение) не совсем подходит для того, как это принято реализовывать в питоне (по сути, создается функция-обертка с передачей аргументов по-умолчанию).
from functools import partial
import math
def func(x1, x2, x3, c):
return x1 ** 2 + math.sqrt(x2) + x3/(x1 + x2) + c
func_x1_x3_fixed = partial(func, x1=5, x3=7)
assert(func_x1_x3_fixed(x2=16, c=1) == func(5, 16, 7, 1))
Автор решения: n1tr0xs
→ Ссылка
Возможно, от вас хотели увидеть это:
def func(x1, x2, x3, c):
return x1**2 + x2**.5 + x3/(x1+x2) + c
def curry(func):
def f1(x1=5):
def f2(x2):
def f3(x3=7):
def f4(c):
return x1**2 + x2**.5 + x3/(x1+x2) + c
return f4
return f3
return f2
return f1
curried = curry(func)
curried()(16)()(1)
или это:
def func(x1, x2, x3, c):
return x1**2 + x2**.5 + x3/(x1+x2) + c
def curry(func):
def f1(x2):
def f2(c):
return 25 + x2**.5 + 7/(5+x2) + c
return f2
return f1
curried = curry(func)
curried(16)(1)
Идентичные примеры с использованием lambda:
def curry(func):
return lambda x1=5: lambda x2: lambda x3=7: lambda c: x1**2 + x2**.5 + x3/(x1+x2) + c
или так:
def curry(func):
return lambda x2: lambda c: 25 + x2**.5 + 7/(5+x2) + c
