I have to write a function which has 2 nested functions inside and computes only sum or difference of as many numbers as we want. Every equation end with "=". I wrote sth like this but it still doesn't work. What I am doing wrong?
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)
Function should work like that:
calculator(1)('+')(4)('-')(2)('=')
The result is 3. I can't use any package import or global variables.
You can also use a dictionary to define your operations, and make a very readable and simple function with space for expansion:
def calc(a: int): return lambda op: {
'+': lambda b: calc(a+b),
'-': lambda b: calc(a-b),
'/': lambda b: calc(a/b),
'*': lambda b: calc(a*b),
}.get(op, a)
print(calc(2)('+')(3)('-')(10)('/')(10)('*')(-100)('='))
Deducing from the form of the input, you need to return "functions" each time. One way of doing that is to use 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
For example, consider calculator(1)('+')(4)('-')(2)('='). The first part calculator(1)('+') means that calculator(1) itself is a function, which is then to be applied with an argument ('+'). So calculator(x) need to return a function operation.
Also you might want to record the result (1 in this case), by passing it to operation; that's why I added a parameter x (meaning the current result) to operation. Then I used lambda x: operation(_, x) to return a "partial function".
By the same reasoning, operation returns calculation, which in turns returns operation and so on, until operation is given with '='.