|
|
![]() ![]() ![]() ![]() |
|
|
Python
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.
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
Programmazione ad oggetti e roba varia...
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 Bello, 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.
Trucchi di Python
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"...
E per finire...
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.
|