Differenze tra le versioni di "Python Lezione 4 Giugno 2008"

Da GolemWiki.
Jump to navigation Jump to search
Riga 46: Riga 46:
 
l'interprete valuta l'espressione ''messaggio'' e stampa il suo contenuto
 
l'interprete valuta l'espressione ''messaggio'' e stampa il suo contenuto
  
== ECCEZIONE ==
+
== Errori e Eccezioni ==
:se io commento la definizione di messaggio (es: ''# messaggio = " hello world "'' ) il programma non sa cos'è messaggio e se scrivo:
+
 
     ''print messaggio''
+
Commentando l'assegnamento di messaggio, vediamo che l'interprete genera un errore:
il risultato sarà:name error, che, viene chiamato eccezione.
+
 
 +
 
 +
  jdoe@waste-bin ~ $ python
 +
  Python 2.5.2 (r252:60911, May 24 2008, 15:28:31)
 +
  [GCC 4.2.4 (Gentoo 4.2.4 p1.0)] on linux2
 +
  Type "help", "copyright", "credits" or "license" for more information.
 +
  >>> print messaggio
 +
  Traceback (most recent call last):
 +
    File "<stdin>", line 1, in <module>
 +
  NameError: name 'messaggio' is not defined
 +
 
 +
NameError è una eccezione. Vedremo più avanti come queste situazioni di errore possono essere ''catturate'' e ''gestite'' appositamente, sia
 +
per tentare di risolvere il problema che per migliorare il feedback che il nostro programma da all'utente. Vedremo anche come
 +
la gestione delle eccezioni è parte della programmazione normale di un programma, ovvero non è sempre legata a una situazione di errore.
 +
 
 +
Un altro esempio, tendando di sommare mele e pere:
 +
  >>> print 1 + "a"
 +
  Traceback (most recent call last):
 +
     File "<stdin>", line 1, in <module>
 +
  TypeError: unsupported operand type(s) for +: 'int' and 'str'
 +
 
 +
Vediamo che a questo giro l'eccezione lanciata è ValueError.
  
 
== LE STRINGHE ==
 
== LE STRINGHE ==

Versione delle 11:09, 10 giu 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”

PRINT

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

Errori e Eccezioni

Commentando l'assegnamento di messaggio, vediamo che l'interprete genera un errore:


 jdoe@waste-bin ~ $ python
 Python 2.5.2 (r252:60911, May 24 2008, 15:28:31) 
 [GCC 4.2.4 (Gentoo 4.2.4 p1.0)] on linux2
 Type "help", "copyright", "credits" or "license" for more information.
 >>> print messaggio
 Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
 NameError: name 'messaggio' is not defined

NameError è una eccezione. Vedremo più avanti come queste situazioni di errore possono essere catturate e gestite appositamente, sia per tentare di risolvere il problema che per migliorare il feedback che il nostro programma da all'utente. Vedremo anche come la gestione delle eccezioni è parte della programmazione normale di un programma, ovvero non è sempre legata a una situazione di errore.

Un altro esempio, tendando di sommare mele e pere:

 >>> print 1 + "a"
 Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
 TypeError: unsupported operand type(s) for +: 'int' and 'str'

Vediamo che a questo giro l'eccezione lanciata è ValueError.

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!