Menu
Coddy logo textTech

Operatori di primo livello

Lezione 13 di 29 del corso Progetto di calcolatrice con Python di Coddy.

Come abbiamo visto prima, in matematica c'è un ordine.

Gli operatori '*', '/' e '%' vengono calcolati prima di '+' e '-'.

In questo corso chiamiamo gli operatori '*', '/' e '%' operatori di livello uno.

E gli operatori '+' e '-' operatori di livello due.

challenge icon

Sfida

Facile

Attualmente struct supporta solo gli operatori di livello due.

Il tuo compito è aggiungere il supporto per gli operatori di livello uno a struct.

Assicurati che l’ordine dei calcoli sia rispettato!

Esempi:

  • 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]]

Provalo tu

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

Tutte le lezioni di Progetto di calcolatrice con Python

Esercitati da solo: Compilatore Python online