E' da diverso tempo che sento parlare spesso di Python e finalmente mi sono deciso di acquistare un libro introduttivo per conoscere questo linguaggio.
Il libro è Python della serie Pocket di Apogeo (i migliori per iniziare a mio parere) e l'ho letto tutto di un fiato con il computer davanti per provare il codice !!
Il primo impatto con questo linguaggio devo dire che è stato grande, sembra davvero interessante. Poi darò un'occhiata allo stato del porting in .NET.
Ecco le caratteristiche che lo rendono appetibile:
- Orientato agli oggetti
- Veramente semplice da imparare ( io ci ho messo 5 ore per familiarizzare con la sintassi, i costrutti e i tipi di dati )
- Utilizza la tipizzazione dinamica ma è fortemente tipizzato
- Tipi di dati potenti e facili da usare come liste, insiemi e dizionari
- Estensibile in C e in C++
- Possibilità di includere l'interprete Python nei nostri programmi
- Portabile (se non si utilizzano moduli dedicati a uno specifico sistema operativo come PyWin32 )
- Semplicissimo da installare
- Particolare e potente metodo di accesso a uno o più elementi su tipi di dati sequenziali come liste e stringhe (Slicing)
- Disponibilità di migliaia di moduli già realizzati e facili da utilizzare, compresi quelli per la realizzazione di interfacce grafiche multipiattaforma
- Permette l'overloading degli operatori
- Semplicità di creazione di pacchetti per il deployment anche su macchine senza interprete Python (modulo Inno Setup)
- Gratuito
Alcune cose che mi hanno fatto un pò storcere il naso sono:
- Indentazione obbligatoria e assenza di parentesi nei costrutti if, for ecc
Si avete capito bene. L'interprete Python richiede in modo obbligatorio l'indentazione e si basa su quella per determinare i blocchi di codice.
Lo scopo è quello di migliorare la leggibilità dei programmi semplicemente impedendo di scrivere in modo disordinato.
Non ho esperienza con questo linguaggio quindi non saprei se alla fine questo si traduce in un reale vantaggio. - Non si hanno parole chiave per rendere privato un membro di una classe. Per fare questo si deve anteporre al nome del membro due caratteri underscore.
Questa scelta mi porterà senz'altro a non utilizzare mai membri privati in Python anche se ciò è contro il fondamentale principio dell' information hiding.
Inoltre anche se utilizziamo questa convenzioni il Python permette ancora di accedere al membro definito ma con una sintassi differente ( uhmmmm )
Alcuni pezzi di codice divertenti e curiosi:
Assegnare un valore all'ultimo elemento di una lista:
elenco = [ 'a', 'b', 'c', 1, 2]
elenco[-1] = 3
Estrarre una sottostringa:
stringa = "Angella Andrea is my name"
nome = stringa[8:14]
print nome # visualizza 'Andrea'
Moltriplicazione di stringhe:
stringa = "ciao " * 5
print stringa # visualizza 'ciao ciao ciao ciao ciao'
Non c'è limite alle dimensioni di un numero intero:
print 2 ** 10000 # visualizza tutte le cifre intere di 2 elevato a 10000 (e sono tante)
Il linguaggio supporta anche i numeri complessi:
a = 3 + 2j
b = 2 - 4j
print a + b
Unico ciclo su liste distinte:
nomi = ["Andrea", "Stefano", "Alessandro"]
cognomi = ["Cognome1", "Cognome2", "Cognome3"]
anni = [23, 23, 26]
for nome, cognome, eta in zip(nomi, cognomi, anni):
print "%s %s ha %s anni" % (nome, cognome, eta)
Esiste anche la clausola else nel costrutto for.
Le istruzioni vengono eseguite sempre alla fine del ciclo a meno che non si termina con break:
for num in range(100):
for fat in range(2, num):
if num % fat == 0:
print num, "è ", fat, "*", num/fat
break
else:
print num, "è un numero primo"
Scaricare una pagina web e salvarla su un file.
Siccome non esistono parentesi per delimitare i blocchi è necessario avere a disposizione un modo per indicare un blocco vuoto (pass).
E' possibile utilizzare la clausola else anche per la gestione delle eccezioni:
import urllib
try:
urllib.urlretrieve("http://www.google.it", "c:\pagina.html")
except:
pass
finally:
print "Codice sempre eseguito"
else:
print "Codice sempre eseguito se non sono state sollevate eccezioni"
Funzioni che restituiscono più di un valore:
def funzione(n):
return 2*n, n*n
doppio, quadrato = funzione(5) # restituisce 10 e 25
Una funzione è un oggetto a tutti gli effetti e può essere passato come argomento di funzioni:
def stampa(arg):
print arg
def esegui(funz, arg):
funz(arg)
esegui(stampa, "Ciao") # stampa a video "Ciao"
Semplicità di serializzare e deserializzare gli oggetti e quindi creare un semplice database basato su file (modulo shelve):
import shelve
class Studente:
def __init__(this, matricola, nome):
this.matricola = matricola
this.nome = nome
def __str__(this):
return "Studente " + this.nome + " matricola " + str(this.matricola)
s1 = Studente(111111, "Andrea")
s2 = Studente(222222, "Stefano")
# Serializzo gli oggetti su un file
db = shelve.open("db")
db["studente1"] = s1 # serializza lo studente su file
db["studente2"] = s2 # serializza lo studente su file
db.close();
# Leggo gli oggetti deserializzando il file
db = shelve.open("db")
s1 = db["studente1"]
s2 = db["studente2"]
print s1 # Visualizza 'Studente Andrea matricola 111111'
print s2 # Visualizza 'Studente Stefano matricola 222222'
Certamente la piattaforma .NET rimane sempre la mia preferita accompagnata ovviamente dal potentissimo editor Visual Studio con il fantastico Intellisense !
Se ho stimolato la curiosità di qualcuno l'indirizzo da cui scaricare l'interprete Python o anche i sorgenti è http://www.python.org/