Python Lezione 4 Giugno 2008
Python
Python è un linguaggio di programmazione interpretato. Il linuaggio interpretato è simile agli altri linguaggi in circolazione ma, invece di essere trasformato direttamente in codice binario dal meccanismo automatico, viene interpretato da questo e poi mandato all'hardware. Un linguaggio interpretato non ha bisogno di essere ricompilato: il codice scritto viene interpretato da un interprete a run-time (tempo di esecuzione) e tradotto al volo nel linguaggio macchina. Quindi i programmi python possono girare su qualsiasi hardware e sistema operativo su cui è stato portato l'interprete. Ovviamente, questa cosa si paga sul tempo di esecuzione pure: l'approccio ha si i suoi vantaggi, ma rispetto a un linguaggio compilato direttamente in linguaggio macchina per creare un eseguibile, python e gli altri liguaggi interpretati risultano essere più lenti.
Esistono vari interpreti: Cpython, o classic python, è l'interprete "ufficiale", scritto in C e disponibile per linux, mac e windows. Jython è un interprete scritto al 100% in Java, e si interfaccia strettamente ai programmi e alla libreria Java, IronPython è un interprete python che gira sulla piattaforma .NET mentre PyPy è (anche) un interprete python scritto in.. python
La prima riga di ogni script python deve iniziare con #!/usr/bin/env python
il #! del file fa capire al sistema operativo (solo su sistemi posix, quindi unix/linux) che quello non è un file di testo ma un eseguibile da eseguire con l'inteprete python.
COMMENTI
- sono righe che l'interprete salta e non legge
es:
# stampa:”hello word”
Lo statement print valuta tutte le espressioni presenti e quindi le stampa a video. L'espressione da valutare può essere anche un semplice numero o una semplice stringa
print 3
stampa 3, e anche se scrivo
print “3”
stampa lo stesso anche se abbiamo passato prima un intero, poi una stringa. Questo è normale, perchè il numero "tre" viene rappresentato dal simbolo 3 nel sistema decimale.
Invece, se scrivo
print 3+2
otteniamo a video 5: l'inteprete ha valutato l'espressione, ha eseguito la somma e stampato il situlato. Mentre se scriviamo
print “3+2”
il risolutato è
3+2
in quanto abbiamo passato la stringa composta dal carattere 3, dal simbolo + e dal carattere 2.
Le variabili in python non devono essere dichiarate: esistono dalla prima volta in cui gli viene assegnato un valore
messaggio=”hello world” print messaggio
se questo programma viene eseguito il risultatato sarà: hello world l'interprete valuta l'espressione messaggio e stampa il suo contenuto
ECCEZIONE
- se io commento la definizione di messaggio (es: # messaggio = " hello world " ) il programma non sa cos'è messaggio e se scrivo:
print messaggio
il risultato sarà:name error, che, viene chiamato eccezione.
LE STRINGHE
Gli oggetti di tipo stringa supportano svariati metodi e proprietà. E' da notare che le stringhe sono immutabili. Se una stringa viene dichiarata la seconda volta, quella precedente viene buttata, non viene modificata per fare spazio alla nuova.
messaggio=”ciao” messaggio=”ciao mondo” print messaggio
stampa
ciao mondo
In Python non si possono sommare cose diverse, o meglio, lo posso fare solo se è definita una conversione tra i due tipo. Le stringhe supportano anche alcuni operatori base:
print messaggio*2
l'esecuzione darà
messaggio messaggio
esempio:
Print “ciao”+” mondo”
lo eseguo e mi darà:
ciao mondo
Funzione DIR
messaggio=”ciao” dir(messaggio)
a questo punto il programma da una serie di caratteri incomprensibili. Praticamente dà i metodi che suporta la stringa messaggio.
I metodi
sono operazioni che i vari oggetti supportano. alcuni metodi, vedendo con la funzione dir(), iniziano e terminano con __ . Tali metodi, chiamati metodi speciali, non dovrebbero essere chiamati direttamente, senza che ci sia una ragione specifica per farlo (ovvero: sapete quello che state facendo). In generale possono essere pensati come privati o riservati, anche se non essendoci controlli di accesso come in altri linguaggi (public private del java o del c++ ad esempio) nessuno vieta di chiamarli.
Ad esempio, il metodo __add__ delle stringhe è chiamato quando si fa la somma di due stringhe.
"ciao" + " mondo"
chiama in realtà
"ciao".__add__(" mondo")
__ doc__ ce l'hanno tutti gli oggetti (stringhe, interi...), e contiene una stringa di documentazione dell'oggetto.
i metodi che iniziano per is servono per controllare se una certa proprietà della stringa in esame è vera: es:
messaggio.isalpha()
mi dice se messaggio è o meno alfanumerico (composto solo da numeri e cifre, senza spazi, tab, ritorno carrello ecc ecc). isalpha è un oggetto quindi ha le proprietà doc . se io scrivo
messaggio.isalpha.__doc__
mi dice che fa.
es:
messaggio=”gigio” messaggio2= messaggio.upper()
es: TYPE(3) mi dice che variabile è. se è intero o stringa oppure un complesso, un float o un tipo definito dall'utente. Se io scrivo DIR(3) mi da tutta la lista dei metodi e delle proprietà degli int (dato che 3 è in intero)
Esistono stringhe, interi, float (numeri con virgola)booleano (che ha due valori, vero o falso, True e False)e i vari contenitori:
LE LISTE
es. lo scaffale ha I pc, I pc sono oggetti (pc1,pc2...).Se voglio uno scaffale di pc senza dare I nomi a tutti gli oggetti, definisco lo scaffale. Lo scaffale si chiama Lista .si usano le parentesi quadre con oggetti separati da virgola es. a = [ “pc1” , “schermo rotto” , 2] dir (scaffale) da la lista dei metodi, da qui si capisce che la lista è un oggetto. Se io faccio
b = dir (a)
o
a.append(“4”)
aggiunge alla lista a il 4. la lista MUTA! Se faccio print (“a”) mi da la lista degli oggetti più il 4.
TUPLE
è una lista non mutabile. La tupla è molto piu veloce rispetto alla lista. Con tuple si usano le parentesi tonde.
DIZIONARI
il dizionario si definisce con le parentesi graffe {chiave:valore, chiave:valore} a{chiave} da il valore associato alla chiave.
Dizionari liste e tuple sono dele sequenze e sono iterable e si possono scorrere.
If elif else
if condizione :
indentato roba da fare se vero.
Python supporta o tab o spazio, si decide quanti tab o spazi alla prima indentazione. Meglio lo spazio perchè in futuro I tab verranno lasciati. Di solito si usa 4 spazi. Non c'è la graffa in pyton o I begin o gli end, si chiude e si apre la riga solo se si indenta.
Esempio:
a=3 b=1
if a >b: print (“ a è maggiore di b”) elif a==b: print (“ a è uguale a b”) else: print(“b è maggiore di a”)
in questo programma definisco due valori, a e b. Chiedo al programma se aè maggiore di b di scrivere : a è maggiore di b, se a è uguale a b di scrivere che a è uguale a b e in tutte le altre condizioni (else) di scrivere che a è minore di b.
2.is, is not or, and,!=
if a is 1: print (“si”) elif a is not 1: print (“no”)
if a is 1 and b is 3: print (“si”)
if a is 1 or b is 3: print (“okkei”)
!= è il diverso.
append, insert
a.append(“4”)
aggiunge alla lista a il 4. Se faccio print (“a”) mi da la lista degli oggetti più il 4.
con insert devo inserire anche la posizione
a.insert(2,34)
mette il 34 in posizione 2
for
specifica un ciclo, fa le cose tante volte fino ad una condizione. For variabile in una sequenza di qualche tipo. Es: for elemento in a:
print elemento
es b è una tupla. Allora posso scrivere:
for elem in b print “altro elemento” “print elem”
elem o qualsiasi altro nome gli dia è ogni elemento dentro la tupla o lista o dizionario.
Se io voglio sia la chiave sia il valore in un dizionario (se metto elem mi mette solo la chiave) posso fare: for chiave in a: print “chiave: “ + chiave print “valore: “ + a[chiave]
DOPO I DUE PUNTI METTO SEMPRE IL TAB.
xrange
xrange è un iterable di dieci elementi con il primo valore uguale a 0 .E' una lista ma non ha le proprietà di una lista. se io voglio fare un for da uno a dieci (cioè la somma da uno a 10)
es: for I xrange(10)
print I
lui stampa 1 2 3 4 5 6 7 8 9 10
range
è una lista.se io scrivo:
print range(10)
lui mi da [0,1,2,3,4,5,6,7,8,9]. è più lento di xrange e poi sta morendo
len
len (a)
da la lunghezza della stringa
enumerate
se io ho una lista di tre elmenti a=[“ciao”,”bel”, “mondo”]
for I, elem in enumerate(a):
print str(I) + “:” + elem
da la posizione corrente di ogni elemento. 0:ciao 1:bel 2:mondo
raw_input
dai il valore. Base= raw_input (“inserisce la base:”) esponente=raw_input (“inserisci l'/ esponente”)
ti chiede il valore di base ed esponente.
Int
forza il fatto che quel valore sia un intero. Es:base=int(base)
result=int(result)
UPPER,LOWER,CAPITALIZE
capitalize è un comando che sulla la stringa su cui viene applicato ,prende la prima lettera dopo gli spazi e ci mette la maiuscola
es:
print “ciao mondo”.capitalize() Ciao mondo
es:
print “ciao mondo”.title() Ciao Mondo
LOWER: prende la striga e emette tutto minuscolo UPPER: il contrario di lower
ESEMPIO DELLA SERATA:
Calcolo di una potenza.
base= raw_input (“inserisce la base:”) esponente=raw_input ('inserisci l\' esponente')
base=int(base) result=int(result)
result=1 for i in xrange(esponente): result = result * base print result
il built-in int() è necessario, dato che tutto quello che proviene dalla tastiera viene acquisito da raw_input() come stringa. Dato che dobbiamo usarli come interi, occorre effettuare un cast, ovvero una trasformazione di tipo, da stringa a intero. E' interessante notare che int() non cerca di fare i miracoli: provate a vedere cosa succede se cercate di convertire "awlerorj" in int!