|
|
E ora qualcosa di completamente differente... Python Istantaneo di Magnus Lie Hetland tradotto da Alex Martelli Questo è un corso rapido di minima sul linguaggio di programmazione Python. Per saperne di più, dai un'occhio alla documentazione sul sito web di Python, http://www.python.org/, specialmente il tutorial. Se ti stai chiedendo perchè ti dovrebbe interessare, guarda la pagina dei paragoni, dove Python è paragonato ad altri linguaggi. Questa introduzione ha ricevuto molte lodi da lettori soddisfatti, ed è stata tradotta in vari linguaggi, fra cui Portoghese, Russo, Norvegese, Coreano e Spagnolo. (Pagina Python di M. L. Hetland) 1. Fondamenti x,y,z = 1,2,3 first, second = second, first a = b = 123 I blocchi sono indicati dall'indentazione, e solo
dall'indentazione. (Nè
if x < 5 or (x > 10 and x < 20): print "Il valore è OK." if x < 5 or 10 < x < 20: print "Il valore è OK." for i in [1,2,3,4,5]: print "Iterazione numero", i x = 10 while x >= 0: print "x ancora non negativo." x = x-1 I primi due esempi sono equivalenti. La variabile indice data nel ciclo # Stampa i valori da 0 a 99 compresi.
for value in range(100):
print value
(La riga che inizia con "
Ok; ora ne sai abbastanza per (in teoria) implementare qualsiasi
algoritmo in Python. Aggiungiamo un po' di interazione
elementare con l'utente. Per avere input dall'utente (da
un prompt di testo), usa la funzione built-in
x = input("Immettere un numero: ") print "Il quadrato del numero è", x*x La funzione Nota: Se vuoi leggere una stringa con Quindi, abbiamo coperto strutture di controllo, input e output -- ora ci servono delle belle strutture dati. Le più importanti sono liste e dizionari. Le liste sono scritte con parentesi quadre, e possono naturalmente essere annidate: name = ["Cleese", "John"] x = [[1,2,3],[y,z],[[[]]]] Una delle cose carine delle liste è che puoi accederne gli elementi separatamente o a gruppi, attraverso indiciamento e affettamento. L'indiciamento si fa (come in molti altri linguaggi) appendendo l'indice fra parentesi quadre alla lista. (Nota che il primo elemento ha indice 0). print name[1], name[0] # Stampa "John Cleese"
name[0] = "Smith"
L'affettamento è quasi come l'indiciamento, eccetto che scriverai
sia l'indice d'inizio sia quello di fine del risultato, con un due-punti
(" x = ["spam","spam","spam","spam","spam","eggs","and","spam"]
print x[5:7] # Stampa la lista ["eggs","and"]
Nota che la fine è non-compresa. Se manca uno degli indici, significa
che vuoi tutto in quella direzione. Per esempio
A proposito di indiciamento, potrebbe interessarti sapere
che la funzione built-in
Ora, dunque -- e i dizionari? Per farla semplice, sono come liste, ma i loro contenuti non sono ordinati. Come si indicizzano allora? Bè, ogni elemento ha una chiave, cioè un "nome" che è usato per trovare l'elemento proprio come in un vero dizionario. Un paio di dizionari d'esempio: { "Alice" : 23452532, "Boris" : 252336, "Clarice" : 2352525, "Doris" : 23624643} person = { 'first name': "Robin", 'last name': "Hood", 'occupation': "Scoundrel" } Ora, per avere l'occupazione di
person['last name'] = "of Locksley" Semplice, no? Come le liste, i dizionari possono contenere altri dizionari. O anche liste. E naturalmente anche le liste possono contenere dizionari. Quindi, si possono facilmente fare strutture dati piuttosto avanzate. 2. Funzione def square(x):
return x*x
print square(2) # Stampa 4
Per quelli di voi che lo capiscono: tutti i parametri in Python sono
passati
per riferimento (come, ad esempio, in Java). Per quelli che
non lo capiscono:
non ve ne preoccupate Python ha gran copia di cose graziose come gli argomenti con nome e gli argomenti di default e può gestire un numero variabile di argomenti a una singola funzione. Per altre informazioni su questo, vedere il tutorial di Python, sezione 4.7. Se sai usare le funzioni in generale, questo è quel che ti serve
sapere su di loro in Python. (Ah sì... la keyword
Una cosa che potrebbe esserti utile sapere, però, è che in
Python le funzioni sono
valori. Così, se hai una funzione come queeble = square queeble(2) Stampa 4 Per chiamare una funzione senza argomenti devi ricordarti di scrivere
3. Oggetti e roba... class Basket:
# Ricorda sempre l'argomento *self*
def __init__(self,contents=None):
self.contents = contents or []
def add(self,element):
self.contents.append(element)
def print_me(self):
result = ""
for element in self.contents:
result = result + " " + `element`
print "Contiene:"+result
Cose nuove qui:
Nessun metodo (nè variabile membro) è protetto (o privato o simile)
in Python. L'incapsulamento è praticamente questione di stile di
programmazione. (Se ti serve davvero, ci sono convenzioni sui
nomi che permettono un po' di
privacy Ora, quella logica corto-circuito... Tutti i valori in Python possono essere usati come valori logici.
Alcuni dei più "vuoti", come
Ora, le espressioni logiche come
Questo meccanismo fa sì che if a: print a else: print b potrebbe essere scritta anche: print a or b In effetti, questo è piuttosto idiomatico in Pyton, quindi meglio
abituarcisi. È quel che facciamo nel metodo
if contents: self.contents = contents else: self.contents = [] Naturalmente, ora sai che c'è un modo migliore. E perchè non gli
diamo il valore di default di
Un altro modo di fare quanto sopra è: def __init__(self, contents=[]): self.contents = contents[:] Puoi indovinare come questo funziona? Invece di usare la stessa
lista vuota dappertutto, usiamo l'espressione
Così, per fare effettivamente un
b = Basket(['apple','orange']) b.add("lemon") b.print_me() Ci sono altri metodi magici oltre a def __str__(self): result = "" for element in self.contents: result = result + " " + `element` return "Contains:"+result Ora, se volessimo stampare il Basket
print b Ganzo, eh? Le sottoclassi si fanno così: class SpamBasket(Basket):
# ...
Python permette eredità multipla, quindi puoi avere varie
superclassi fra parentesi, separate da virgole. Le classi si istanziano così:
Se, nel costruttore di
Per altre meraviglie sulla programmazione a oggetti in Python, vedi la sezione 9 del tutorial. 4. Un trucco mentale Jedi. Ti piacciono i concetti sbalorditivi? Allora, se sei davvero audace, potresti dare un'occhiata al saggio di Guido van Rossum sulle metaclassi. Se però preferisci che il tuo cervello non esploda, potrebbe bastarti questo trucchetto.
Python usa spazi di nomi dinamici e non lessicali. Questo significa che se hai una funzione così: def orange_juice(): return x*2 ... dove una variabile (in questo caso x = 3 y = orange_juice() # y è ora 6 x = 1 y = orange_juice() # y è ora 2 Di solito, questo è il tipo di comportamento che desideri (benchè questo esempio sia un po' artificioso - raramente si accede così alle variabili.) Tuttavia, a volte può essere carino avere qualcosa di simile a uno spazio di nomi statico, cioè, memorizzare alcuni valori dall'ambiente nella funzione quando viene creata. Il modo di fare questo in Python è attraverso gli argomenti di default. x = 4 def apple_juice(x=x): return x*2 Qui, l'argomento
x = 3 y = apple_juice() # y is now 8 x = 1 y = apple_juice() # y is now 8 Così - il valore di def tomato_juice(): x = 4 return x*2 o anche def carrot_juice(): return 8 Tuttavia, il punto è che il valore di Vogliamo una funzione che lavora così: from math import sin, cos sincos = compose(sin,cos) x = sincos(3) Dove (Nota che qui stiamo usando funzioni come argomento... il che è un trucco già parecchio carino in sè.) Chiaramente,
def compose(fun1, fun2):
def inner(x):
pass # ...
return inner
Potremmo essere tentati di scrivere
from math import sin, cos
def fun1(x):
return x + " world!"
def fun2(x):
return "Hello,"
sincos = compose(sin,cos) # usa la versione sbagliata
x = sincos(3)
Ora, che valore avrebbe def compose(fun1, fun2): def inner(x, fun1=fun1, fun2=fun2): return fun1(fun2(x)) return inner Ora dobbiamo solo sperare che nessuno passi alla funzione
risultante più di un argomento, perchè questo la romperebbe
def compose(f1, f2): return lambda x, f1=f1, f2=f2: f1(f2(x)) Conciso, ma chiaro. Devi amarlo (E se non ne hai capito nulla, non preoccuparti. Almeno spero
ti abbia convinto che Python è più che "solo un linguaggio
di scripting"...
5. E ora... import string x = string.split(y) Oppure... from string import split x = split(y) Per altre informazioni sui moduli della libreria standard, dai un'occhiata a www.python.org/doc/lib. Contengono un mucchio di roba utile.
Tutto il codice nel modulo/script è eseguito quando viene importato. Se vuoi che il tuo programma possa essere usato sia come modulo importabile sia come programma eseguibile, aggiungi alla fine di esso qualcosa come: if __name__ == "__main__": go() Questo è un modo magico per dire che se questo modulo viene
fatto girare come script eseguibile (cioè, se non stiamo venendo
importati da un altri script), allora va chiamata la funzione
E per quelli di voi che vogliono rendere eseguibile uno script su UN*X, usate la seguente prima riga per farlo funzionare da solo: #!/usr/bin/env python
Infine, breve menzione di un concetto importante: le Eccezioni. Alcune operazioni (come dividere per zero, o leggere da un file inesistente) producono una condizione di errore, cioè di eccezione. Puoi anche farti le tue, sollevandole in momenti appropriati. Se non viene gestita l'eccezione, il tuo programma termina e
stampa un messaggio di errore. Puoi evitarlo con una
istruzione di
def safe_division(a,b): try: return a/b except ZeroDivisionError: return None
try: unsafe_division(a,b) except ZeroDivisionError: print "Something was divided by zero in unsafe_division" Nei casi in cui normalmente non ci sarebbe uno specifico problema, però potrebbe succedere, usare le eccezioni permette di evitare costosi controlli ecc. Beh, questo è tutto. Spero tu abbia imparato qualcosa. Ora
vai e gioca. E ricorda il motto
per imparare il Python:
"Use the source, Luke." (Traduzione: leggi tutto il codice su cui
puoi mettere le mani C'è una cosa che può meritare di essere detta su questo esempio.
La variabile
while not done: while not done: # Itera sino ad un break while not done: # Eseguito solo se il primo non ha posto "done" ad 1 Una versione equivalente, forse più chiara, ma nella mia opinione meno bellina, sarebbe: while not done: while 1: # Itera sino ad un break if not done: while 1: # Eseguito solo se il primo non ha posto "done" ad 1 L'unica ragione per cui ho usato la variabile Alcuni altri esempi si trovano sulla pagina dei bocconcini di Joe Strout.
Copyright © Magnus Lie Hetland (magnus@hetland.org) Ultima modifica dell'originale: Wed May 19 23:29:50 MET DST 1999 |