Delucidazioni sulla sintassi di Python in seguito all'errore "SyntaxError: invalid syntax"

di il
2 risposte

Delucidazioni sulla sintassi di Python in seguito all'errore "SyntaxError: invalid syntax"

Buonasera,
Da qualche settimana mi sono affacciato alla scrittura di codici con "Python" e per esercitarmi ho deciso di creare una classe "Frazioni". In sostanza si occupa di leggere due frazioni, fare le operazioni elementari e semplificare il risultato con l'algoritmo di Euclide.
Ebbene, il programma andava benone fino a che non ho deciso di implementare un menù (con else/if funziona) tramite un "vocabolario". La mia idea era di fare una sorta di "switch", come in Java, ma a quanto pare non è possibile; dunque mi sono deciso a procedere come precedentemente spiegato.
Al momento dell'esecuzione appaiono errori multipli:

File "<ipython-input-65-79758fa4186e>", line 122
    7: f3 = f1 + f2
          ^
SyntaxError: invalid syntax
Spero in un vostro ausilio, di seguito il codice completo.

SyntaxError: invalid syntax
class Frazione:

  def __init__(self, numeratore=0, denominatore=0):
    self.__numeratore = numeratore
    self.__denominatore = denominatore

  @property
  def numeratore(self):
    return self.__numeratore

  @numeratore.setter
  def numeratore(self, numeratore):
    self.__numeratore = numeratore

  @property
  def denominatore(self):
    return self.__denominatore

  @denominatore.setter
  def denominatore(self, numeratore):
    self.__denominatore = denominatore

  def __add__(self, f2):
    denominatore = self.__denominatore * f2.denominatore
    numeratore = denominatore / self.__denominatore * self.__numeratore + denominatore / f2.denominatore * f2.numeratore

    if numeratore > denominatore:
      a = numeratore
      b = denominatore
    else:
      a = denominatore
      b = numeratore

    while(b!=0):
      r = a % b
      a = b 
      b = r
      mcd = a

    numeratore = numeratore / mcd
    denominatore = denominatore / mcd
    return Frazione(numeratore, denominatore)

  def __sub__(self, f2):
    denominatore = self.__denominatore * f2.denominatore
    numeratore = denominatore / self.__denominatore * self.__numeratore + denominatore / f2.denominatore * f2.numeratore

    if numeratore > denominatore:
      a = numeratore
      b = denominatore
    else:
      a = denominatore
      b = numeratore

    while(b!=0):
      r = a % b
      a = b 
      b = r
      mcd = a

    numeratore = numeratore / mcd
    denominatore = denominatore / mcd
    return Frazione(numeratore, denominatore)

  def __mul__(self, f2):
    denominatore = self.__denominatore * f2.denominatore
    numeratore = self.__numeratore * f2.numeratore

    if numeratore > denominatore:
      a = numeratore
      b = denominatore
    else:
      a = denominatore
      b = numeratore

    while(b!=0):
      r = a % b
      a = b 
      b = r
      mcd = a

    numeratore = numeratore / mcd
    denominatore = denominatore / mcd
    return Frazione(numeratore, denominatore)

  def __mul__(self, f2):
    denominatore = self.__denominatore * f2.numeratore
    numeratore = self.__numeratore * f2.denominatore

    if numeratore > denominatore:
      a = numeratore
      b = denominatore
    else:
      a = denominatore
      b = numeratore

    while(b!=0):
      r = a % b
      a = b 
      b = r
      mcd = a

    numeratore = numeratore / mcd
    denominatore = denominatore / mcd
    return Frazione(numeratore, denominatore)

  def __str__(self):
    return str(self.__numeratore) + "/" + str(self.__denominatore)

  def riduzione(self, valore):#self
    switcher = {
      1: print("La prima frazione corrisponde a " , f1,"\n"),
      2: print("La seconda frazione corrisponde a " , f2,"\n"),
      3: print("Inserire il nuovo numeratore (f1)")
         f1.numeratore = input(),
      4: print("Inserire il nuovo denominatore (f1)")
         f1.denominatore = input(),
      5: print("Inserire il nuovo numeratore (f2):")
         f2.numeratore = input(),
      6: print("Inserire il nuovo denominatore (f2):")
         f2.denominatore = input(),
      7: f3 = f1 + f2
         print("La somma tra la prima frazione e la seconda vale " , f3,"\n"),
      8: f3 = f1 - f2
         print("La differenza tra la prima frazione e la seconda vale " , f3,"\n"),
      9: f3 = f1 * f2
         print("Il prodotto tra la prima frazione e la seconda vale " , f3,"\n"),
      10: f3 = f1 / f2
          print("Il rapporto tra la prima frazione e la seconda vale " , f3,"\n"),
    }
    return switcher.get(valore, "Il valore inserito non è stato riconosciuto.")
#-------------------------------------------------------------

print("Inserire numeratore e denominatore della prima frazione")
f1 = Frazione(int(input( "Numeratore= ")), int(input("Denominatore= ")))

print("Inserire numeratore e denominatore della seconda frazione")
f2 = Frazione(int(input( "Numeratore= ")), int(input("Denominatore= ")))

cnt=0

while (cnt!= 'e'):

  print ("""Cosa si desidera fare ? \n
           Premere 1 per visualizzare la prima frazione \n
           Premere 2 per visualizzare la seconda frazione \n
           Premere 3 per modificare il numeratore della prima frazione \n
           Premere 4 per modificare il denominatore della prima frazione \n
           Premere 5 per modificare il numeratore della seconda frazione \n
           Premere 6 per modificare il denominatore della seconda frazione \n
           Premere 7 per eseguire una addizione \n
           Premere 8 per eseguire una sottrazione \n
           Premere 9 per eseguire una moltiplicazione \n
           Premere 10 per eseguire una divisione \n
           Premere 'e' per uscire dal programma.""") #"""  servono per fare le cose su più righe
           
  ItemsMenu = Frazione()
  print(ItemsMenu.riduzione(int(input())))  

2 Risposte

  • Re: Delucidazioni sulla sintassi di Python in seguito all'errore "SyntaxError: invalid syntax"

    Non sono un grande esperto di classi Python, ma mettere un menu dentro una classe mi pare un po' fuori dalla "buona programmazione". Mettere delle funzioni dentro un dizionario non è possibile, a meno di non fare uso di trucchi e barbatrucchi.
    Per quanto riguarda la tua classe, hai due volte il metodo "__mul__", ove il secondo va sostituito con "__truediv__".
    Cancella il metodo "riduzione", ed al fondo della tua classe metti questo:
    if __name__ == "__main__":
        print("Inserire numeratore e denominatore della prima frazione")
        f1 = Frazione(int(input("Numeratore= ")), int(input("Denominatore= ")))
    
        print("Inserire numeratore e denominatore della seconda frazione")
        f2 = Frazione(int(input("Numeratore= ")), int(input("Denominatore= ")))
    
        cnt = '0'
    
        while (cnt != 'e'):
            print("""Cosa si desidera fare ?
               Premere 1 per visualizzare la prima frazione
               Premere 2 per visualizzare la seconda frazione
               Premere 3 per modificare il numeratore della prima frazione
               Premere 4 per modificare il denominatore della prima frazione
               Premere 5 per modificare il numeratore della seconda frazione
               Premere 6 per modificare il denominatore della seconda frazione
               Premere 7 per eseguire una addizione
               Premere 8 per eseguire una sottrazione
               Premere 9 per eseguire una moltiplicazione
               Premere 10 per eseguire una divisione
               Premere 'e' per uscire dal programma.""")  # """  servono per fare le cose su più righe
    
    
            cnt = input()
            if cnt == '1':
                print(f1)
            elif cnt == '2':
                print(f2)
            elif cnt == '3':
                print("Inserire il nuovo numeratore (f1)")
                f1.numeratore = input()
            elif cnt == '4':
                print("Inserire il nuovo denominatore (f1)")
                f1.denominatore = input()
            elif cnt == '5':
                print("Inserire il nuovo numeratore (f2):")
                f2.numeratore = input()
            elif cnt == '6':
                print("Inserire il nuovo denominatore (f2):")
                f2.denominatore = input()
            elif cnt == '7':
                f3 = f1 + f2
                print("La somma tra la prima frazione e la seconda vale ", f3, "\n")
            elif cnt == '8':
                f3 = f1 - f2
                print("La differenza tra la prima frazione e la seconda vale ", f3, "\n")
            elif cnt == '9':
                f3 = f1 * f2
                print("Il prodotto tra la prima frazione e la seconda vale ", f3, "\n")
            elif cnt == '10':
                f3 = f1 / f2
                print("Il rapporto tra la prima frazione e la seconda vale ", f3, "\n")
            elif cnt == 'e':
                continue
            else:
                print("Il valore inserito non è stato riconosciuto.")
    
    In pratica il menu va fuori della classe.
  • Re: Delucidazioni sulla sintassi di Python in seguito all'errore "SyntaxError: invalid syntax"

    Anzitutto grazie per la risposta; effettivamente il secondo metodo "mul" è sbagliato, o meglio era mia intenzione fare l'override della divisione, dunque al suo posto ci vuole "div".
    Anche la mia prima scelta era stata fare una serie di costrutti "if-else", ma speravo ci fosse la possibilità di fare qualcosa di meno lungo. Mi par di capire però che la cosa non sia fattibile...
    Grazie comunque.
Devi accedere o registrarti per scrivere nel forum
2 risposte