Oppure

Loading
10/05/11 12:08
Edex
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:
class Rubrica:
        def __init__(self, nome, numero, email):
                self.nome = nome
                self.numero = numero
                self.email = email
                
        def __str__(self):
                return "%-20s %-15s %s" %(self.nome, self.numero, self.email)

        def str_numero(self):
                return "%-20s %s" %(self.nome, self.numero)

        def str_email(self):
                return "%-20s %s" %(self.nome, self.numero)

class Tipo_Dato:
        def Quale_str(self):
                Quale_s()
                scelta = raw_input("")
                while 1:
                 if scelta == "1":
                        Met_O_num.Stampa()
                        return
                 elif scelta == "2":
                        Met_O_em.Stampa()
                        return
                 elif scelta == "":
                        return
                 else:
                        print "Scelta non valida"
                        print "Per uscire dalla funzione premere invio"


        def Quale_mod(self):
                Quale_s()
                scelta = raw_input("")
                while 1:
                 if scelta == "1":
                        Met_O_num.Mod()
                        return
                 elif scelta == "2":
                        Met_O_em.Mod()
                        return
                 elif scelta == "":
                        return
                 else:
                        print "Scelta non valida"
                        print "Per uscire dalla funzione premere invio"

        
class Operazioni_Numeri:
        def Mod(self):
                nom = raw_input("")
                for x in Contatti:
                        if nom == x.nome:
                                numero = raw_input("")
                                x.numero = numero
                                return
                else:
                    print "Nessuna corrispondenza in rubrica"
                    return

        def Cancella(self):
                nom = raw_input("")
                if nom == "":
                        return
                for x in Contatti:
                         if nom == x.nome:
                                i = Contatti.index(x)
                                del Contatti[i]
                else:
                        print "Nessun nome corrispondete in rubrica"
                        print "Per uscire dalla funzione premere invio"
                        Met_O.Cancella()

        def Cancella_tutto(self):
                scelta = raw_input("Stai per cancellare l'intera rubrica sei sicuro?(s/N)")
                if scelta == "s":
                        global Contatti
                        Contatti = []
                elif scelta == "N":
                        return
                else:
                        print "Scelta non valida"
                        Met_O.Cancella_tutto()


        def Stampa(self):
                nom = raw_input("")
                print "%-20s %s" %("Nome", "Numero")
                print
                for x in Contatti:
                        if nom == x.nome:
                                print x.str_numero()
                                print
                                return
                else:
                        print "Nessuna corrispondenza in rubrica"
                        return

class Operazioni_email:
        def Mod(self):
                nom = raw_input("")
                for x in Contatti:
                        if nom == x.nome:
                                email = raw_input("")
                                x.email = email
                                return
                else:
                        print "Nessuna corrispondenza in rubrica"
                        return

        def Stampa(self):
                nom = raw_input("")
                print "%-20s %s" ("Nome", "Email")
                print
                for x in Contatti:
                        if nom == x.nome:
                                print x.str_email()
                                print
                                return
                else:
                        print "Nessuna corrispondenza in rubrica"
                        return

class Users:
        def Recupero_dati(self):
                import pickle
                file_name = "C:\Users\Franco\Desktop\Rubrica_" + user + ".pck"
                file = open(file_name,"r") 
                while 1:
                 try:
                    global Contatti
                    x = pickle.load(file)
                    Contatti.append(x)
                 except:
                    return

        def Recupero_user(self):
                import string
                global list_users
                f = open("C:\Users\Franco\Desktop\list_users.txt","r")
                list_users = string.split(f.read())

        def Controllo_user(self):
                global user
                user = raw_input("Inserisci Username, per aggiungerne uno scrivere x e poi invio")
                if user == "x":
                   Crea_file()
                   global list_users
                   list_users.append(new_user)
                elif user in list_users:
                   Met_U.Recupero_dati()
                else:
                   print "Nessuno user corrispondente"
                   Met_U.Controllo_user()
                   

class Salva:
        def Salva_numeri(self):
                import pickle
                if user != "x":
                        file_name = "C:\Users\Franco\Desktop\Rubrica_" + user + ".pck"
                elif user == "x":
                        file_name = "C:\Users\Franco\Desktop\Rubrica_" + new_user + ".pck"
                file = open(file_name, "w")
                for x in Contatti:
                   pickle.dump(x, file)
                return

        def Salva_user(self):
                f = open("C:\Users\Franco\Desktop\list_users.txt","w")
                for x in list_users:
                   f.write("%s " %(x))
                return

        def Vuoi_salvare(self):
                scelta = raw_input("Vuoi salvare?(s/N)")
                if scelta == "s":
                        Met_S.Salva_user()
                        Met_S.Salva_numeri()
                elif scelta == "N":
                        return
                else:
                        print "Scelta non valida"
                        Met_S.Vuoi_salvare()


#Funzioni di utilizzo generale
def Menu():
                print "Cosa vuoi fare?"
                print "1-Aggiungi un contatto"
                print "2-Modifica un contatto"
                print "3-Visualizza un contatto"
                print "4-Visualizza tutti i contatti"
                print "5-Eliminare un contatto"
                print "6-Eliminare tutti i contatti"
                print "7-Esci"

def Crea_file():
                   global new_user
                   new_user = raw_input("Insersci il nuovo Username")
                   file_name = "C:\Users\Franco\Desktop\Rubrica_" + new_user + ".pck"
                   file = open(file_name, "w")
                   file.close()

def Aggiungi():
                nome = raw_input("")
                numero = raw_input("")
                email = raw_input("")
                contatto = Rubrica(nome, numero, email)
                Contatti.append(contatto)

def Stampa_Tutto():
                lista_nomi = []
                for x in Contatti:
                        lista_nomi.append(x.nome)
                lista_nomi.sort()
                Categorie()
                for x in lista_nomi:
                        for y in Contatti:
                                if x == y.nome:
                                        print Contatti[Contatti.index(y)]
                print
                return


def Stampa():
        nom = raw_input("")
        Categorie()
        for x in Contatti:
                if nom == x.nome:
                    print x
                    print
                    return
        else:
                print "Nessuna corrispondenza in rubrica"
                return

def Categorie():
        print
        print "%-20s %-15s %s" %("Nome","Numero","Email")
        print

def Quale_s():
        print "Su che tipo di dato vuoi operare?"
        print "1-Un numero"
        print "2-Una email"

Contatti = []
Met_Tipo = Tipo_Dato()
Met_O_em = Operazioni_email()
Met_O_num = Operazioni_Numeri()
Met_U = Users()
Met_S = Salva()
Met_U.Recupero_user()
Met_U.Controllo_user()
while 1:
        Menu()
        scelta = raw_input("Inserire la scelta")
        if scelta == "1":
                Aggiungi()
        elif scelta == "2":
                Met_Tipo.Quale_mod()
        elif scelta == "3":
                Met_Tipo.Quale_str()
        elif scelta == "4":
                Stampa_Tutto()
        elif scelta == "5":
                Met_O_num.Cancella()
        elif scelta == "6":
                Met_O_num.Cancella_tutto()
        elif scelta == "7":
                Met_S.Vuoi_salvare()
                break
        else:
                print "Scelta non valida"
                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 10/05/11 12:10
aaa
10/05/11 12:35
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
10/05/11 14:39
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, it.diveintopython.org/,
è per conoscitori avanzati di python però|
qui trovi molti bei libri utili: 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:
10/05/11 14:53
Guarda sotto per spiegazioni più accurate:
        def Quale_mod(self):
                Quale_s()
                scelta = raw_input("")
                while 1: # While 1 non è consigliato (1*)
                 if scelta == "1":
                        Met_O_num.Mod()
                        return # Credo Troppi Return! (2*)
                 elif scelta == "2":
                        Met_O_em.Mod()
                        return # Credo Troppi Return! (2*)
                 elif scelta == "":
                        return # Credo Troppi Return! (2*)
                 else:
                        print "Scelta non valida"
                        print "Per uscire dalla funzione premere invio"
 
       
class Operazioni_Numeri:
        def Mod(self):
                nom = raw_input("")
                for x in Contatti:
                        if nom == x.nome:
                                numero = raw_input("")
                                x.numero = numero
                                return # Credo Troppi Return! (2*1)
                else:
                    print "Nessuna corrispondenza in rubrica"
                    return # Credo Troppi Return! (2*)
 
        def Cancella(self):
                nom = raw_input("")
                if nom == "":
                        return
                for x in Contatti:
                         if nom == x.nome:
                                i = Contatti.index(x) # Perchè 2 ist.? (3*)
                                del Contatti[i]
                else:
                        print "Nessun nome corrispondete in rubrica"
                        print "Per uscire dalla funzione premere invio"
                        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:
      i = Contatti.index(x) # Perchè 2 ist.? (3*)
      del Contatti[i]
####################
#               Diventa:             #
####################
      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! :)
11/05/11 12:19
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!
12/05/11 20:52
Ti consiglio di leggere python.it/doc/Howtothink/… :)
13/05/11 12:40
ah, è stato il libro su cui hoo conosciuto python!
veramente ben fatto!
lo puoi anche liberamente stampare, lo dice la licenza!