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

di Anonimizzato29857 il
2 risposte
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

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