Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Python - Come posso migliorare?
Forum - Python - Come posso migliorare?

Avatar
Edex (Normal User)
Newbie


Messaggi: 12
Iscritto: 09/05/2011

Segnala al moderatore
Postato alle 14:08
Martedì, 10/05/2011
Salve a tutti.
Sono un neo utente e anche un neo programmatore. Da più di qualche mese ormai sto inoltrandomi nell'apprandere il python. Ho scritto un programmino: una semplice rubrica con funzioni di memorizzazione, modifica e visualizzazione dei numeri, implementando anche la possibilità di aggiungere un email al contatto.
Ora che l'ho scritto però voglio utilizzarlo per migliorare ancora: il mio sorgente magari non contiene bug (anche se non ne sono certo) però probabilmente è scritto in modo macchinoso e artificioso. Io non sono in grado di correggerlo per renderlo più snello è veloce per il semplice motivo che non riesco a capire come poterlo snellire. Speravo che qualcuno di voi potesse dirmi non tanto come migliorare questo mio programmino di esercizio, bensì speravo che mi poteste dare dei pareri su quanto sia "buono" o meno il codice che ho scritto e come posso migliorare il mio stile. Grazie, spero di essere stato chiaro.

Ecco il sorgente:
Codice sorgente - presumibilmente Python

  1. class Rubrica:
  2.         def __init__(self, nome, numero, email):
  3.                 self.nome = nome
  4.                 self.numero = numero
  5.                 self.email = email
  6.                
  7.         def __str__(self):
  8.                 return "%-20s %-15s %s" %(self.nome, self.numero, self.email)
  9.  
  10.         def str_numero(self):
  11.                 return "%-20s %s" %(self.nome, self.numero)
  12.  
  13.         def str_email(self):
  14.                 return "%-20s %s" %(self.nome, self.numero)
  15.  
  16. class Tipo_Dato:
  17.         def Quale_str(self):
  18.                 Quale_s()
  19.                 scelta = raw_input("")
  20.                 while 1:
  21.                  if scelta == "1":
  22.                         Met_O_num.Stampa()
  23.                         return
  24.                  elif scelta == "2":
  25.                         Met_O_em.Stampa()
  26.                         return
  27.                  elif scelta == "":
  28.                         return
  29.                  else:
  30.                         print "Scelta non valida"
  31.                         print "Per uscire dalla funzione premere invio"
  32.  
  33.  
  34.         def Quale_mod(self):
  35.                 Quale_s()
  36.                 scelta = raw_input("")
  37.                 while 1:
  38.                  if scelta == "1":
  39.                         Met_O_num.Mod()
  40.                         return
  41.                  elif scelta == "2":
  42.                         Met_O_em.Mod()
  43.                         return
  44.                  elif scelta == "":
  45.                         return
  46.                  else:
  47.                         print "Scelta non valida"
  48.                         print "Per uscire dalla funzione premere invio"
  49.  
  50.        
  51. class Operazioni_Numeri:
  52.         def Mod(self):
  53.                 nom = raw_input("")
  54.                 for x in Contatti:
  55.                         if nom == x.nome:
  56.                                 numero = raw_input("")
  57.                                 x.numero = numero
  58.                                 return
  59.                 else:
  60.                     print "Nessuna corrispondenza in rubrica"
  61.                     return
  62.  
  63.         def Cancella(self):
  64.                 nom = raw_input("")
  65.                 if nom == "":
  66.                         return
  67.                 for x in Contatti:
  68.                          if nom == x.nome:
  69.                                 i = Contatti.index(x)
  70.                                 del Contatti[i]
  71.                 else:
  72.                         print "Nessun nome corrispondete in rubrica"
  73.                         print "Per uscire dalla funzione premere invio"
  74.                         Met_O.Cancella()
  75.  
  76.         def Cancella_tutto(self):
  77.                 scelta = raw_input("Stai per cancellare l'intera rubrica sei sicuro?(s/N)")
  78.                 if scelta == "s":
  79.                         global Contatti
  80.                         Contatti = []
  81.                 elif scelta == "N":
  82.                         return
  83.                 else:
  84.                         print "Scelta non valida"
  85.                         Met_O.Cancella_tutto()
  86.  
  87.  
  88.         def Stampa(self):
  89.                 nom = raw_input("")
  90.                 print "%-20s %s" %("Nome", "Numero")
  91.                 print
  92.                 for x in Contatti:
  93.                         if nom == x.nome:
  94.                                 print x.str_numero()
  95.                                 print
  96.                                 return
  97.                 else:
  98.                         print "Nessuna corrispondenza in rubrica"
  99.                         return
  100.  
  101. class Operazioni_email:
  102.         def Mod(self):
  103.                 nom = raw_input("")
  104.                 for x in Contatti:
  105.                         if nom == x.nome:
  106.                                 email = raw_input("")
  107.                                 x.email = email
  108.                                 return
  109.                 else:
  110.                         print "Nessuna corrispondenza in rubrica"
  111.                         return
  112.  
  113.         def Stampa(self):
  114.                 nom = raw_input("")
  115.                 print "%-20s %s" ("Nome", "Email")
  116.                 print
  117.                 for x in Contatti:
  118.                         if nom == x.nome:
  119.                                 print x.str_email()
  120.                                 print
  121.                                 return
  122.                 else:
  123.                         print "Nessuna corrispondenza in rubrica"
  124.                         return
  125.  
  126. class Users:
  127.         def Recupero_dati(self):
  128.                 import pickle
  129.                 file_name = "C:\Users\Franco\Desktop\Rubrica_" + user + ".pck"
  130.                 file = open(file_name,"r")
  131.                 while 1:
  132.                  try:
  133.                     global Contatti
  134.                     x = pickle.load(file)
  135.                     Contatti.append(x)
  136.                  except:
  137.                     return
  138.  
  139.         def Recupero_user(self):
  140.                 import string
  141.                 global list_users
  142.                 f = open("C:\Users\Franco\Desktop\list_users.txt","r")
  143.                 list_users = string.split(f.read())
  144.  
  145.         def Controllo_user(self):
  146.                 global user
  147.                 user = raw_input("Inserisci Username, per aggiungerne uno scrivere x e poi invio")
  148.                 if user == "x":
  149.                    Crea_file()
  150.                    global list_users
  151.                    list_users.append(new_user)
  152.                 elif user in list_users:
  153.                    Met_U.Recupero_dati()
  154.                 else:
  155.                    print "Nessuno user corrispondente"
  156.                    Met_U.Controllo_user()
  157.                    
  158.  
  159. class Salva:
  160.         def Salva_numeri(self):
  161.                 import pickle
  162.                 if user != "x":
  163.                         file_name = "C:\Users\Franco\Desktop\Rubrica_" + user + ".pck"
  164.                 elif user == "x":
  165.                         file_name = "C:\Users\Franco\Desktop\Rubrica_" + new_user + ".pck"
  166.                 file = open(file_name, "w")
  167.                 for x in Contatti:
  168.                    pickle.dump(x, file)
  169.                 return
  170.  
  171.         def Salva_user(self):
  172.                 f = open("C:\Users\Franco\Desktop\list_users.txt","w")
  173.                 for x in list_users:
  174.                    f.write("%s " %(x))
  175.                 return
  176.  
  177.         def Vuoi_salvare(self):
  178.                 scelta = raw_input("Vuoi salvare?(s/N)")
  179.                 if scelta == "s":
  180.                         Met_S.Salva_user()
  181.                         Met_S.Salva_numeri()
  182.                 elif scelta == "N":
  183.                         return
  184.                 else:
  185.                         print "Scelta non valida"
  186.                         Met_S.Vuoi_salvare()
  187.  
  188.  
  189. #Funzioni di utilizzo generale
  190. def Menu():
  191.                 print "Cosa vuoi fare?"
  192.                 print "1-Aggiungi un contatto"
  193.                 print "2-Modifica un contatto"
  194.                 print "3-Visualizza un contatto"
  195.                 print "4-Visualizza tutti i contatti"
  196.                 print "5-Eliminare un contatto"
  197.                 print "6-Eliminare tutti i contatti"
  198.                 print "7-Esci"
  199.  
  200. def Crea_file():
  201.                    global new_user
  202.                    new_user = raw_input("Insersci il nuovo Username")
  203.                    file_name = "C:\Users\Franco\Desktop\Rubrica_" + new_user + ".pck"
  204.                    file = open(file_name, "w")
  205.                    file.close()
  206.  
  207. def Aggiungi():
  208.                 nome = raw_input("")
  209.                 numero = raw_input("")
  210.                 email = raw_input("")
  211.                 contatto = Rubrica(nome, numero, email)
  212.                 Contatti.append(contatto)
  213.  
  214. def Stampa_Tutto():
  215.                 lista_nomi = []
  216.                 for x in Contatti:
  217.                         lista_nomi.append(x.nome)
  218.                 lista_nomi.sort()
  219.                 Categorie()
  220.                 for x in lista_nomi:
  221.                         for y in Contatti:
  222.                                 if x == y.nome:
  223.                                         print Contatti[Contatti.index(y)]
  224.                 print
  225.                 return
  226.  
  227.  
  228. def Stampa():
  229.         nom = raw_input("")
  230.         Categorie()
  231.         for x in Contatti:
  232.                 if nom == x.nome:
  233.                     print x
  234.                     print
  235.                     return
  236.         else:
  237.                 print "Nessuna corrispondenza in rubrica"
  238.                 return
  239.  
  240. def Categorie():
  241.         print
  242.         print "%-20s %-15s %s" %("Nome","Numero","Email")
  243.         print
  244.  
  245. def Quale_s():
  246.         print "Su che tipo di dato vuoi operare?"
  247.         print "1-Un numero"
  248.         print "2-Una email"
  249.  
  250. Contatti = []
  251. Met_Tipo = Tipo_Dato()
  252. Met_O_em = Operazioni_email()
  253. Met_O_num = Operazioni_Numeri()
  254. Met_U = Users()
  255. Met_S = Salva()
  256. Met_U.Recupero_user()
  257. Met_U.Controllo_user()
  258. while 1:
  259.         Menu()
  260.         scelta = raw_input("Inserire la scelta")
  261.         if scelta == "1":
  262.                 Aggiungi()
  263.         elif scelta == "2":
  264.                 Met_Tipo.Quale_mod()
  265.         elif scelta == "3":
  266.                 Met_Tipo.Quale_str()
  267.         elif scelta == "4":
  268.                 Stampa_Tutto()
  269.         elif scelta == "5":
  270.                 Met_O_num.Cancella()
  271.         elif scelta == "6":
  272.                 Met_O_num.Cancella_tutto()
  273.         elif scelta == "7":
  274.                 Met_S.Vuoi_salvare()
  275.                 break
  276.         else:
  277.                 print "Scelta non valida"
  278.                 scelta = raw_input("Inserire la scelta")



P.S. so che è una grande rischiesta ma spero che qualcuno di voi abbia la volontà e il tempo di aiutarmi :D

Ultima modifica effettuata da Edex il 10/05/2011 alle 14:10
PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Up
2
Down
V
Segnala al moderatore
Postato alle 16:53
Martedì, 10/05/2011
Guarda sotto per spiegazioni più accurate:
Codice sorgente - presumibilmente Python

  1. def Quale_mod(self):
  2.                 Quale_s()
  3.                 scelta = raw_input("")
  4.                 while 1: # While 1 non è consigliato (1*)
  5.                  if scelta == "1":
  6.                         Met_O_num.Mod()
  7.                         return # Credo Troppi Return! (2*)
  8.                  elif scelta == "2":
  9.                         Met_O_em.Mod()
  10.                         return # Credo Troppi Return! (2*)
  11.                  elif scelta == "":
  12.                         return # Credo Troppi Return! (2*)
  13.                  else:
  14.                         print "Scelta non valida"
  15.                         print "Per uscire dalla funzione premere invio"
  16.  
  17.        
  18. class Operazioni_Numeri:
  19.         def Mod(self):
  20.                 nom = raw_input("")
  21.                 for x in Contatti:
  22.                         if nom == x.nome:
  23.                                 numero = raw_input("")
  24.                                 x.numero = numero
  25.                                 return # Credo Troppi Return! (2*1)
  26.                 else:
  27.                     print "Nessuna corrispondenza in rubrica"
  28.                     return # Credo Troppi Return! (2*)
  29.  
  30.         def Cancella(self):
  31.                 nom = raw_input("")
  32.                 if nom == "":
  33.                         return
  34.                 for x in Contatti:
  35.                          if nom == x.nome:
  36.                                 i = Contatti.index(x) # Perchè 2 ist.? (3*)
  37.                                 del Contatti[i]
  38.                 else:
  39.                         print "Nessun nome corrispondete in rubrica"
  40.                         print "Per uscire dalla funzione premere invio"
  41.                         Met_O.Cancella()


1*) La scritta dice: "Premi Invio" ma con while 1 e nessun break non potrà mai uscire dalla funzione (Il mio antivirus segnala il file per quel motivo!)

2*) E' più appropriato che una funzione termini da un solo puntoquindi conviene mettere un return dopo tutto il blocco e non uno dentro ogni blocco

2*1) Dentro ad un ciclo (se porti i return fuori) se non vuoi che controlli quello dopo quello che ha trovato inseriscici break

3*) Per trovare e cancellare un valore convien usare remove:
Codice sorgente - presumibilmente Python

  1. i = Contatti.index(x) # Perchè 2 ist.? (3*)
  2.       del Contatti[i]
  3. ####################
  4. #               Diventa:             #
  5. ####################
  6.       Contatti.remove(x)



Altri commenti:
  Oltre la mancanza di commenti ci sono altri punti con while 1 (Oltre il main)
  E in pickle conviene specificare anche il protocollo se no quando cambierà la versione di pickle diventerà incompatibile (Se non si mette si considera -1 cioè l'ultimo protocollo.... se se ne aggiunge un altro non carica più il file!) cerca con Google per trovare i protocolli (Ti consiglio di usare il 2)

In conclusione: non sembra che tu stia programmando il python da poco! :)

Grazie a tutti per i commenti che mi saranno molto utili sicuramente! :D - Edex - 10/05/11 17:28
Scusate sono nuovo e non sapevo come usare i commenti. Grazie per le tue spiegazioni Dario.. vedrò di metterle in pratica!;) inoltre prendo la tua ultima frase come un complimento e te ne ringrazio :D - Edex - 10/05/11 17:31
PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Up
1
Down
V
Segnala al moderatore
Postato alle 16:39
Martedì, 10/05/2011
ciao!
come hai imparato python?
Se su giude online allora puoi migliorare molto, se con un libro pure.
Io ti consiglio i leggere dive into python, che è gratis, http://it.diveintopython.org/,
è per conoscitori avanzati di python però|
qui trovi molti bei libri utili: http://www.python.it/doc/libri/.

beh, tornando a noi, è difficile trovare qualcuno che abbia tempo per autarti.
un modo utile per imparare a scrivere bene è scrivere tanto.
inventati programmi sempre più difficili, tipo uno per giocare a briscola col computer, oppure un programma per gestire un sito via ftp ecc ecc...
usa anche molte librerie per trovare le tue preferite e usarle nel momento giusto.
spero di esserti stato utile! :k::k:

Grazie :D - Edex - 10/05/11 17:30
PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Up
0
Down
V
Segnala al moderatore
Postato alle 14:35
Martedì, 10/05/2011
Non conosco Python e quindi non saprei come aiutarti, ma scorrendo il sorgente si nota subito che è privo di commenti, mentre è sempre buona norma metterli
sia quando sviluppi un programma tuo (aiuta a comprenderli meglio anche a distanza di tempo), ma specialmente quando il sorgente sai che verrà letto o guardato da qualcun'altro, come in questo caso

Grazie :D - Edex - 10/05/11 17:32
Quoto per i commenti, sono super utili - Ultimo - 11/05/11 15:39
PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Up
0
Down
V
Segnala al moderatore
Postato alle 14:19
Mercoledì, 11/05/2011
senno, prova a potenziare ulteriormente il tuo programma, non so:
- fai in modo di poter creare un pdf o un file excel con i dati dei contatti;
- fai un'interfaccia grafica;
- non so...
puoi fare un sacco di cose per migliorare!

PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Up
0
Down
V
Segnala al moderatore
Postato alle 22:52
Giovedì, 12/05/2011

PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Up
0
Down
V
Segnala al moderatore
Postato alle 14:40
Venerdì, 13/05/2011
ah, è stato il libro su cui hoo conosciuto python!
veramente ben fatto!
lo puoi anche liberamente stampare, lo dice la licenza!

PM