[Python] Ottimizzazione codice

Leonardo learts92 a gmail.com
Dom 27 Apr 2008 16:57:14 CEST


Salve a tutti.
Sono agli inizi con Python, sto imparando grazie a varie guide trovate
online, e sto iniziando ad addentrarmi nell'ottimizzazione del codice.
Ora, ho scritto questo piccolo programmino (con GUI in pyGTK) che
accetta dei numeri come input, ne calcola la media, e restituisce la
media, il numero maggiore immesso, il numero minore, il numero pių
vicino alla media.
Ora, vorrei dei consigli su come ottimizzare il codice, magari
sostituendo qualche ciclo if con qualcosa di pių performante o simili =D
posto il codice: (non insultatemi perchč non c'č nemmeno un commento o
una doc string xD)


        import pygtk
        pygtk.require('2.0')
        import gtk
        
        def Media(numeri):
        	divisore = len(numeri)
        	a = 0
        	for num in numeri:
        		a = a + float(num)
        	try:
        		media = float(a) / float(divisore)
        		return media
        	except:
        		return None
        	
        def DistanzaDallaMedia(numero, media):
        	numero = float(numero)
        	distanzamedia = abs(numero - media)
        	return distanzamedia
        
        class Finestra:
        	def __init__(self):
        		self.win = gtk.Window(gtk.WINDOW_TOPLEVEL)
        		self.win.set_title("Calcolo media aritmetica")
        		self.win.connect("destroy", self.esci)
        		self.win.connect("delete_event", self.delete_event)
        		self.win.set_default_size(400,300)
        		self.vbox = gtk.VBox(0,0)
        		self.label = gtk.Label("Inserisci qui sotto i numeri dei quali
        vuoi fare la media, separati da spazi.")
        		self.entry = gtk.Entry(100)
        		self.button = gtk.Button("Esegui", gtk.STOCK_EXECUTE)
        		self.button.connect("clicked", self.CalcolaMedia)
        		self.risultato = gtk.Label("Clicca su esegui, qui comparira'
        il risultato")
        		self.statistiche = gtk.Label("Clicca su esegui, qui
        compariranno alcune statistiche")
        		self.vbox.pack_start(self.label)
        		self.vbox.pack_start(self.entry)
        		self.vbox.pack_start(self.button)
        		self.vbox.pack_start(self.risultato)
        		self.vbox.pack_end(self.statistiche)
        		self.win.add(self.vbox)
        		self.win.show_all()
        
        	def GetUserInput(self, widget):
        		UserInput = widget.get_text()
        		return UserInput
        		
        	def OttieniNumeri(self):
        		UserInput = self.GetUserInput(self.entry)
        		import string
        		Numeri = string.split(UserInput)
        		Numeri = map(int, Numeri)
        		return Numeri
        		
        	def CalcolaMedia(self, widget):
        		Numeri = self.OttieniNumeri()
        		MediaCalcolata = Media(Numeri)
        		if MediaCalcolata: 
        			self.risultato.set_text("La media calcolata equivale a  " +
        str(MediaCalcolata))
        			Statistiche = {}
        			for num in Numeri:
        				if 'maggiore' not in Statistiche.keys():
        					Statistiche['maggiore'] = num
        					Statistiche['minore'] = num
        					Statistiche['vicino_media'] = num
        				else:
        					if DistanzaDallaMedia(num, MediaCalcolata) <
        DistanzaDallaMedia(Statistiche['vicino_media'], MediaCalcolata):
        						Statistiche['vicino_media'] = num
        					if num > Statistiche['maggiore']:
        						Statistiche['maggiore'] = num
        					elif num < Statistiche['minore']:
        						Statistiche['minore'] = num
        			self.StampaStatistiche(Statistiche)
        		else:
        			self.risultato.set_text("Devi inserire almeno un numero!")
        			
        	def StampaStatistiche(self, Statistiche):
        		self.statistiche.set_text("Il numero maggiore inseirto e' " +
        str(Statistiche['maggiore']) + "\nIl numero minore inserito e' "
        + str(Statistiche['minore']) + "\nIl numero inserito piu' vicino
        alla media e': " + str(Statistiche['vicino_media']))
        				
        		
        	def delete_event(self, widget, event, data=None):
        		return False
                		
        	def esci(self, widget, data=None):
        		gtk.main_quit()
        		
        	def main(self):
        		gtk.main()
        		
        if __name__ == "__main__":
        	PrimaFinestra = Finestra()
        	PrimaFinestra.main()



Maggiori informazioni sulla lista Python