ieri pomeriggio,nello schifo più totale di una giornata merdosa sono andato alla fnac e mi sono comprato uno di quei libretti di programmazione pocket di python…
il python mi ha sempre da un lato interessato, dall’altro l’ho sempre considerato fuffa, perciò ho deciso di approfondire…
e tra ieri e oggi ho letto un pò…
risultato: il python è una cazzofigata!
anche se parecchio macchinoso, è in grado di svolgere praticamente qualsiasi cosa con pochissime righe di codice…
pensate che lo usa la nasa, lo usa google, e lo usano persino nei film per fare gli effetti speciali! tipo in starwars…
eh si perchè il python è davvero multi-purpose: è possibile scrivere applicativi console, applicativi desktop e applicativi web, i quali girano su praticamente qualsiasi sistema operativo esistente, da windows a linux, dal mac all’iphone, da android alla playstation3 e così via…
quindi cazzofigata alla seconda!
bene, come primo programmino ovviamente il libretto presenta l’immancabile “Hello World” ma siccome la sintassi per eseguirlo è
print("Hello World")
ho pensato di cominciare con qualcosina di più evoluto…
un mailbomber ad esempio…
dopo poche righe di codice ho notato che era TROPPO evoluto per la mia esperienza con python (tipo mezz’ora di programmazione?) e allora ho deciso di passare al mio cavallo di battaglia, un programma che ho scritto in c++, c#, pascal e vb6 (per ora): la generazione di numeri primi.
il python è così semplice e intuitivo che in pochissimo tempo, qualche sbirciata al libro e qualche ricerca su google, ho scritto il mio primo programmino che, attraverso una versione velocizzata del “Crivello di Eratostene” trova tutti i numeri primi al di sotto del numero dato e li scrive in un file di testo nella stessa directory del programma
import math, sys, time #funzione def primo(n): i = 2 h = math.floor(math.sqrt(n)) while i <= h: if n % i == 0: return False i += 1 return True #main f = open('/primi.txt','w') x = 3 tot=1 try: num = int(raw_input ("Inserire un numero>2 ")) except: sys.exit("Input non corretto.") inizio=time.ctime() print "Inizio: ",inizio[11:-5] f.write(inizio[11:-5]) f.write("\n\n2\n") while x < num: if primo(x) == 1: riga=str(x),"\n" f.writelines(riga) tot += 1 x += 2 fine=time.ctime() f.write ("\n") f.write(fine[11:-5]) f.close() print "Fine: ",fine[11:-5] print "Scrittura eseguita: trovati",tot,"numeri primi" raw_input ("")
ditemi se non è troppo stupido??
in python non ci sono graffe o "endif" a delimitare i blocchi ma si basta tutto sull'indentazione, utile da imparare per tenere ordinato il codice...
commentiamolo...
con "import" si importano le librerie che occorrono all'esecuzione del programma (l'equivalente di #include in c++)
la funzione "primo" è definita semplicemente con "def" e non necessita di specificare il tipo dei parametri in entrata in quanto il python capisce da se il tipo delle variabili le quali non vanno nemmeno dichiarate, ma semplicemente inizializzate quando servono
con "open" creo il file nella directory indicata, in questo caso la stessa di dove si trova il programma e ho a disposizione il file in scrittura (con "w") o in lettura (con "r"), per cui non devo accedervi attraverso funzioni, classi o librerie particolari da includere
con raw_input accetto qualsiasi tipo di dato in entrata sia che sia un carattere sia che sia un numero e nella stessa riga provo a effettuare una conversione in numero e lo assegno direttamente alla variabile che inizializzo nel momento stesso, fantastico!
ecco, ora guardate il codice del programma, quanto saranno, 30 righe?
ed ecco lo stesso programma scritto in c++ che esegue praticamente lo stesso algoritmo:
#include #include #include #include #include using namespace std; int primo(long int n); int main() { ofstream primi; primi.open ("numeri_primi.txt"); long int n; long int i; long int t=0; long begin, end; double sizeb, sizekb; cout << "Questo programma trova tutti i numeri primi al di sotto di una cifra data" << endl << endl; do { cout << "Inserire un numero intero: "; cin >> n; } while (n<=2); system("cls"); cout << "Elaborazione in corso" << endl << endl; cout << "Attendere..."; primi << "2" << endl; for(i=3; i<=n; i=i+2) { if(primo(i)==1) { primi << i << endl; t++; } } primi.close(); ifstream lun ("numeri_primi.txt"); begin = lun.tellg(); lun.seekg (0, ios::end); end = lun.tellg(); lun.close(); sizeb=(end-begin); sizekb=sizeb/1024; system ("cls"); cout << "Elaborazione terminata" << endl << endl; cout << "Dati Memorizzati"<< endl<<< "Numeri primi trovati: "<<<< "Dimensione del file: "; if (sizeb<=1024) cout << sizeb <<" byte."<<<<=1024) cout << setprecision (3) << sizekb <<" kb."<<<<< setprecision (3) << sizekb/1024<<" mb."<<<(sqrt(double(n))); i=2; for(div=0;i<=h;i++) if(n%i==0) { div++; break; } if (div>0) return 0; else return 1; }
si nota la differenza eh?
questo in c++ non tiene conto del tempo di esecuzione del processo ma si preoccupa invece della dimensione del file prodotto, ma in sintesi fa la stessa cosa (quello in vb6 scrive i risultati in un db in mysql tramite connessione odbc)
dopo il python il c++ mi fa cagare...
fanculo ai punti e virgola!!
bello, bello, mi piace...