# Ask user to enter an expression and display output
def main():
    expression = input("Expression: ")

    print(calculate(splitter(expression)))


# Split expression into components and assign to variables as float values
def splitter(expression):
    x, y, z = expression.split()

    return x, y, z

# Calculate expression result
def calculate(x, y, z):
    x, z = float(x), float(z)

    if y == "+":
        return str(round((x + z), 1))
    elif y == "-":
        return str(round((x - z), 1))
    elif y == "*":
        return str(round((x * z), 1))
    else:
        return str(round((x / z), 1))



main()

I am getting traceback errors for any expression (1 + 1) I enter.

you are viewing a single comment's thread
view the rest of the comments
[–] 6 points 2 years ago* (last edited 2 years ago) (2 children)

Functions in Python can only return a single value. While you are allowed to comma-separate additional values, as you have done, they are combined into a single tuple object that wraps the intended values.

As such, your splitter function is returning a single tuple containing three strings. Your calculate function is expecting three individual arguments (I'm guessing that the error trace mentions this).

To get around this, you can use the splat/asterisk operator to "unpack" the items from the tuple:

a, b, c = splitter(expression)
# or, inline
calculate(*splitter(expression))

Edit: removed bad asterisk

  • source
  • hideshow 2 child comments
  • [–] 7 points 2 years ago* (1 child)

    Functions in Python can only return a single value

    that's not true accurate, this is valid code in this context:

    x, y, z = splitter(expression)
    

    Where x, y, and z are strings. But when you do this, akin to what OP did:

    value  = splitter(expression)
    

    then value is a tuple of 3 strings.

    In fact, unpacking with asterisk at assignment, like below, is not allowed:

    x, y, z = *splitter(expression)
    
        x, y, z = *splitter(expression)
                  ^^^^^^^^^^^^^^^^^^^^^
    SyntaxError: can't use starred expression here
    
  • source
  • parent
  • hideshow 1 child comment