"Scrivi una funzione in Python che valuti un'espressione data."
def valuta_espressione(espressione):
      
    # uno stack per memorizzare i valori interi 
    valori = [] 
  
    # uno stack per memorizzare gli operatori 
    ops = [] 
    i = 0
      
    while i < len(espressione): 
          
        # Il token corrente è uno spazio vuoto, 
        # saltalo. 
        if espressione[i] == ' ': 
            i += 1
            continue
              
        # Il token corrente è una parentesi aperta, 
        # inseriscila in 'ops' 
        elif espressione[i] == '(': 
            ops.append(espressione[i]) 
              
        # Il token corrente è un numero, inseriscilo 
        # nello stack per i numeri. 
        elif espressione[i].isdigit(): 
            val = 0
              
            # Potrebbero esserci più di una 
            # cifra nel numero. 
            while (i < len(espressione) and
                espressione[i].isdigit()): 
                  
                val = (val * 10) + int(espressione[i]) 
                i += 1
                  
            valori.append(val) 
  
        # È stata incontrata una parentesi chiusa, risolvi 
        # l'intera parentesi. 
        elif espressione[i] == ')': 
              
            while len(ops) != 0 and ops[-1] != '(': 
                  
                val2 = valori.pop() 
                val1 = valori.pop() 
                op = ops.pop() 
                  
                valori.append(performOp(val1, val2, op)) 
              
            # rimuovi la parentesi aperta. 
            ops.pop() 
              
        # Il token corrente è un operatore. 
        else: 
              
            # Finché la cima di 'ops' ha la stessa o 
            # maggiore precedenza rispetto al token corrente, 
            # che è un operatore. 
            # Applica l'operatore sulla cima di 'ops' 
            # ai primi due elementi nello stack dei valori. 
            while (len(ops) != 0 and
                precedenza(ops[-1]) >= precedenza(espressione[i])): 
                  
                val2 = valori.pop() 
                val1 = valori.pop() 
                op = ops.pop() 
                  
                valori.append(performOp(val1, val2, op)) 
                  
            # Inserisci il token corrente in 'ops'. 
            ops.append(espressione[i]) 
          
        i += 1
          
     # L'intera espressione è stata analizzata a questo 
    # punto, applica gli operatori rimanenti ai valori rimanenti. 
    while len(ops) != 0: 
          
        val2 = valori.pop() 
        val1 = valori.pop() 
        op = ops.pop() 
          
        valori.append(performOp(val1, val2, op)) 
      
    # La cima di 'valori' contiene il risultato, restituiscilo. 
    return valori[-1]