Menu
Coddy logo textTech

Basic operators

Lesson 12 of 29 in Coddy's Calculator project using Python course.

The next step is to struct list into our basic structure.

Consider the calculation, 1 + 2 + 3, first we transform it into the list - [1, '+', 2, '+', 3] and then we struct it into what our eval function get - ['+',  ['+', 1, 2], 3].

In this step we only care about structuring the list into the format the eval function get.

Examples:

  • [4.5, '-', 3]  ->  ['-', 4.5, 3]
  • [4.5, '-', 3, '+', 2]  ->  ['+', ['-', 4.5, 3], 2]
  • [1, 'sub', 2, 'add', 3, '+', 4]  ->  ['+', ['add', ['sub', 1, 2], 3], 4]
challenge icon

Challenge

Medium

Create the function struct which gets list in the above format and returns the format applicable to the eval function.

Currently deal only with basic operators '+' and '-'.

Try it yourself

def calc(op, n1, n2=None):
    if not isinstance(n1, int) and not isinstance(n1, float):
        raise Exception('Invalid number "' + str(n1) + '"')

    if n2 is None:
        if op == '+' or op == 'add':
            return n1
        if op == '-' or op == 'sub':
            return -n1

        raise Exception('Invalid operator "' + op + '"')

    if not isinstance(n2, int) and not isinstance(n2, float):
        raise Exception('Invalid number "' + str(n2) + '"')

    if op == '+' or op == 'add':
        return n1 + n2
    if op == '-' or op == 'sub':
        return n1 - n2
    if op == '*' or op == 'mul':
        return n1 * n2
    if op == '/' or op == 'div':
        if n2 == 0:
            raise Exception("Division by zero")
        return n1 / n2
    if op == '%' or op == 'mod':
        if n2 == 0:
            raise Exception("Division by zero")
        return n1 % n2
    if op == '^' or op == 'pow':
        return n1 ** n2

    raise Exception('Invalid operator "' + op + '"')


def eval(lst):
    if not isinstance(lst, list):
        raise Exception('Failed to evaluate "' + str(lst) + '"')
    if len(lst) == 2:
        op = lst[0]
        n = lst[1]
        if not isinstance(n, list):
            return calc(op, n)

        if isinstance(n, list):
            n = eval(n)

        return calc(op, n)
    elif len(lst) == 3:
        op = lst[0]
        n1 = lst[1]
        n2 = lst[2]
        if not isinstance(n1, list) and not isinstance(n2, list):
            return calc(op, n1, n2)
        
        if isinstance(n1, list):
            n1 = eval(n1)
        if isinstance(n2, list):
            n2 = eval(n2)

        return calc(op, n1, n2)
    else:
        raise Exception('Failed to evaluate "' + str(lst) + '"')

All lessons in Calculator project using Python