Каррирование 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
→ Ссылка