Tengo que escribir una función que tenga 2 funciones anidadas dentro y calcule solo la suma o la diferencia de tantos números como queramos. Cada ecuación termina con "=". Escribí algo así pero todavía no funciona. ¿Que estoy haciendo mal?
def calculator(x: int): def operation(operator: str): def calculation(y: int): while operator != "=": if operators[i] == "=": result -= digits[j] elif operators[i] == "+": result += digits[j] else: break return result return operator return calculator(result)La función debería funcionar así:
calculator(1)('+')(4)('-')(2)('=')El resultado es 3. No puedo usar ninguna importación de paquetes o variables globales.
También puede usar un diccionario para definir sus operaciones y hacer una función muy legible y simple con espacio para expansión:
def calc(a: int): return lambda op: { '+': lambda b: calc(a+b), '-': lambda b: calc(ab), '/': lambda b: calc(a/b), '*': lambda b: calc(a*b), }.get(op, a) print(calc(2)('+')(3)('-')(10)('/')(10)('*')(-100)('='))Deduciendo de la forma de la entrada, debe devolver "funciones" cada vez. Una forma de hacerlo es usar lambda :
def calculator(x: int): def operation(op: str, x: int): if op == '=': return x else: return lambda _: calculation(_, op, x) def calculation(y: int, op: str, x: int): if op == '+': return lambda _: operation(_, x + y) else: return lambda _: operation(_, x - y) # mind the order of x & y return lambda _: operation(_, x) print(calculator(1)('+')(4)('-')(2)('=')) # 3 print(calculator(3)('-')(10)('+')(6)('=')) # -1 Por ejemplo, considere calculator(1)('+')(4)('-')(2)('=') . La primera parte calculator(1)('+') significa que calculator(1) en sí misma es una función, que luego se aplica con un argumento ('+') . Entonces la calculator(x) necesita devolver una operation de función.
También es posible que desee registrar el resultado ( 1 en este caso), pasándolo a operation ; es por eso que agregué un parámetro x (que significa el resultado actual) a la operation . Luego usé lambda x: operation(_, x) para devolver una "función parcial".
Por el mismo razonamiento, operation devuelve calculation , que a su vez devuelve operation y así sucesivamente, hasta que se da operation con '=' .