Menu
Coddy logo textTech

Level one operators

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

As we discussed before there is an order in math.

The operators '*', '/' and '%' calculated before '+' and '-'.

In this course we call to the operators '*', '/' and '%' - level one operators.

And the operators '+' and '-' - level two operators.

challenge icon

Challenge

Easy

Currently struct only supports level two operators.

Your task is to add support for level one operators for struct.

Make sure the order of calculations is taking place!

Examples:

  • struct([3, '*', 2])  ->  ['*', 3, 2]
  • struct([1, '+', 2, 'mul', 3])  ->  ['+', 1, ['mul', 2, 3]]
  • struct([2, 'mod', 3, '-', 4, '/', 5.2])  ->  ['-', ['mod', 2, 3], ['/', 4, 5.2]]

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) + '"')


OPERATORS = ['+', '-', 'add', 'sub']
def struct(lst):
    i = 0
    while i < len(lst):
        if lst[i] in OPERATORS:
            if len(lst) == 3:
                return [lst[i], lst[i - 1], lst[i + 1]]
            temp = lst[:i - 1]
            temp.append([lst[i], lst[i - 1], lst[i + 1]])
            temp += lst[i + 2:]
            lst = temp
        else:
            i += 1
    return lst

All lessons in Calculator project using Python