





Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Introduzione al linguaggio python
Tipologia: Dispense
1 / 9
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!






In Python ogni valore, di qualsiasi tipo int , float , str , list , ecc., è un oggetto ( object ). Un oggetto ha un valore , un tipo e una identità. Il valore dell'oggetto 'stringa' è la sequenza di caratteri stringa , il tipo è str e l'identità è determinata dalla locazione in memoria dell'oggetto 'stringa'. Ovviamente due oggetti differenti non possono occupare la stessa locazione in memoria, quindi due oggetti con la stessa identità sono esattamente lo stesso oggetto. Però oggetti differenti (cioè con differenti identità) possono avere lo stesso tipo e valore. La funzione built-in id(obj) ritorna l'identità dell'oggetto obj , espressa da un intero che generalmente è l'indirizzo in memoria di obj.
x = 'un oggetto stringa' y = 'un oggetto stringa' x == y True # gli oggetti x e y hanno lo stesso valore id(x) 4333120008 id(y) 4333120288 # ma hanno identità differenti Si osservi che l'operatore == controlla l'uguaglianza di valore non l'uguaglianza d'identità. Può capitare che oggetti immutabili con lo stesso valore che sembrano differenti sono in realtà lo stesso oggetto: x = 'stringa' y = 'stringa' id(x) 4333150304 id(y) 4333150304 # x e y sono lo stesso oggetto Per ragioni di efficienza Python può usare lo stesso oggetto immutabile invece che crearne uno nuovo. Questo non produrrà nessun problema proprio perché sono oggetti il cui valore non può cambiare mai. Invece gli oggetti mutabili , come ad esempio le liste, avranno sempre identità differenti:
x = [] y = [] id(x) 4332990904 id(y) 4297519832 La funzione built-in type(obj) ritorna il tipo di un oggetto obj : type('stringa') <type 'str'> type( 13 ) <type 'int'> type( 13. 0 ) <type 'float'> type([ 1 , 2 , 3 ]) <type 'list'> def square(x): return x** 2 type(square) <type 'function'> # anche una funzione è un oggetto Un tipo, ciò che è ritornato dalla funzione type() , è anch'esso un oggetto ma non approfondiremo oltre questo aspetto. I nomi dei tipi built-in, come int , float , str , list , ecc., possono essere usati come costruttori per creare oggetti di quel tipo (questo non si può fare per il tipo delle funzioni che è un tipo del
linguaggio):
int(' 00123 ') 123 int( 12. 3 ) 12 int(' 1100 ', 2 ) # il secondo parametro (opzionale) è la base 12 str( 12. 3 ) ' 12. 3 ' str('stringa') 'stringa' list('stringa') ['s', 't', 'r', 'i', 'n', 'g', 'a'] list() [] int() 0 str() '' id(x) 4333150304 >>> id(y) 4333150304 # x e y sono lo stesso oggetto Per ragioni di efficienza Python può usare lo stesso oggetto immutabile invece che crearne uno nuovo. Questo non produrrà nessun problema proprio perché sono oggetti il cui valore non può cambiare mai. Invece gli oggetti mutabili , come ad esempio le liste, avranno sempre identità differenti: >>> x = [] >>> y = [] >>> id(x) 4332990904 >>> id(y) 4297519832 La funzione built-in type(obj) ritorna il tipo di un oggetto obj : >>> type('stringa') <type 'str'> >>> type( 13 ) <type 'int'> >>> type( 13. 0 ) <type 'float'> >>> type([ 1 , 2 , 3 ]) <type 'list'> >>> def square(x): return x** 2 >>> type(square) <type 'function'> # anche una funzione è un oggetto Un tipo, ciò che è ritornato dalla funzione type() , è anch'esso un oggetto ma non approfondiremo oltre questo aspetto. I nomi dei tipi built-in, come int , float , str , list , ecc., possono essere usati come costruttori per creare oggetti di quel tipo (questo non si può fare per il tipo delle funzioni che è un tipo del linguaggio): >>> int(' 00123 ') 123 >>> int( 12. 3 ) 12 >>> int(' 1100 ', 2 ) # il secondo parametro (opzionale) è la base 12 >>> str( 12. 3 ) ' 12. 3 ' >>> str('stringa') 'stringa' >>> list('stringa') ['s', 't', 'r', 'i', 'n', 'g', 'a'] >>> list() [] >>> int() 0 >>> str() '' Inoltre, possono essere usati per testare il tipo di un oggetto:
| x.abs() <==> abs(x) | | add(...) | x.add(y) <==> x+y . . . | hex(...) | float.hex() - > string | | Return a hexadecimal representation of a floating-point number. | >>> (- 0. 1 ).hex() | '- 0 x 1. 999999999999 ap- 4 ' | >>> 3. 14159 .hex() | ' 0 x 1. 921 f 9 f 01 b 866 ep+ 1 ' | | is_integer(...) | Returns True if the float is an integer. . . . I metodi il cui nome inizia e finisce con due underscore __ hanno un significato speciale. Molti di questi implementano operatori, come add() che implementa l'operatore + , e saranno spiegati più avanti quando tratteremo le classi. Uno dei metodi del tipo float è is_integer() :
x = 1. 5 x.is_integer() False x = 1. 0 x.is_integer() True
- 55 .is_integer() False 13 .is_integer() SyntaxError: invalid syntax # il tipo int non ha il metodo is_integer() Ogni tipo ha i suoi metodi e, in generale, tipi diversi hanno metodi differenti.
Il metodo count() ritorna il numero di occorrenze di un valore nella lista:
lst = ['uno', 1 , 'uno', 'due', 2 , 1 ] lst.count( 1 )
2
lst.count('uno') 2 Per cercare un valore in una lista c'è il metodo index() : lst.index('due') # ritorna l'indice della prima occorrenza di 'due' int() 0 >>> str() '' Inoltre, possono essere usati per testare il tipo di un oggetto: | x.abs() <==> abs(x) | | add(...) | x.add(y) <==> x+y . . . | hex(...) | float.hex() - > string | | Return a hexadecimal representation of a floating-point number. | >>> (- 0. 1 ).hex() | '- 0 x 1. 999999999999 ap- 4 ' | >>> 3. 14159 .hex() | ' 0 x 1. 921 f 9 f 01 b 866 ep+ 1 ' | | is_integer(...) | Returns True if the float is an integer. . . . I metodi il cui nome inizia e finisce con due underscore __ hanno un significato speciale. Molti di questi implementano operatori, come add() che implementa l'operatore + , e saranno spiegati più avanti quando tratteremo le classi. Uno dei metodi del tipo float è is_integer() : >>> x = 1. 5 >>> x.is_integer() False >>> x = 1. 0 >>> x.is_integer() True >>> 1. 55 .is_integer() False >>> 13 .is_integer() SyntaxError: invalid syntax # il tipo int non ha il metodo is_integer() Ogni tipo ha i suoi metodi e, in generale, tipi diversi hanno metodi differenti. ## METODI DELLE LISTE Il metodo count() ritorna il numero di occorrenze di un valore nella lista: >>> lst = ['uno', 1 , 'uno', 'due', 2 , 1 ] >>> lst.count( 1 ) 2 >>> lst.count('uno') 2 Per cercare un valore in una lista c'è il metodo index() : >>> lst.index('due') # ritorna l'indice della prima occorrenza di 'due' 3 las.index( 1 , 2 ) # inizia la ricerca dalla posizione 2 5 lst.index( 3 ) Traceback (most recent call last): File "<pyshell# 61 >", line 1 , in
lst.index( 3 ) ValueError: 3 is not in list Quando il valore non è presente lancia un'eccezione. Altri metodi molto importanti sono quelli che permettono di modificare una lista aggiungendo, inserendo o rimuovendo valori nella lista stessa, senza cioè crearne un'altra. Il metodo append aggiunge un valore in coda alla lista stessa: lst.append('tre') lst ['uno', 1 , 'uno', 'due', 2 , 1 , 'tre'] lst + ['quattro'] ['uno', 1 , 'uno', 'due', 2 , 1 , 'tre', 'quattro'] lst ['uno', 1 , 'uno', 'due', 2 , 1 , 'tre'] Il metodo insert() inserisce un valore in una certa posizione all'interno della lista: lst.insert( 2 , 'sei') # inserisce 'sei' in posizione 2 , spostando gli lst # elementi successivi ['uno', 1 , 'sei', 'uno', 'due', 2 , 1 , 'tre'] lst.insert( 0 , 'primo') lst ['primo', 'uno', 1 , 'sei', 'uno', 'due', 2 , 1 , 'tre'] Per rimuovere elementi dalla lista ci sono due metodi. Il metodo remove() rimuove la prima occorrenza di un valore dato e se non c'è lancia un'eccezione: lst.remove('uno') lst ['primo', 1 , 'sei', 'uno', 'due', 2 , 1 , 'tre']
Alcune operazioni che si possono effettuare sugli oggetti di un certo tipo possono essere espresse in modo più naturale dell'invocazione esplicita di un metodo. Ad esempio le operazioni aritmetiche sugli int e i float o le operazioni di concatenazione sui tipi sequenza sono effettuate in modo più naturale tramite opportuni operatori + , * , ecc. Anche la sintassi delle parentesi quadre usata per accedere agli elementi di un oggetto di un tipo sequenza è un'operazione su quell'oggetto. In Python la sintassi delle parentesi quadre per i tipi sequenza (liste, stringhe, ecc.) è molto più versatile di quanto abbiamo visto finora. Infatti, permette di ottenere una qualsiasi sottosequenza di elementi consecutivi specificando l'indice d'inizio e quello di fine:
lst = ['a','b','c','d','e','f','g','h'] lst[ 1 : 6 ] # Una copia della sottolista dalla ['b', 'c', 'd', 'e', 'f'] # posizione 1 alla 5 lst[ 3 :] # Una copia della sottolista dalla ['d', 'e', 'f', 'g', 'h'] # posizione 3 in poi lst[: 5 ] # Una copia della sottolista dall'inizio ['a', 'b', 'c', 'd', 'e'] # fino alla posizione 4 lst[:] # Una copia dell'intera lista ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] s = 'Apelle figlio di Apollo.' s[ 1 : 6 ] # La sottostringa dalla posizione 1 alla 5 'pelle' s[ 7 :] # La sottostringa dalla posizione 7 in poi 'figlio di Apollo.' s[: 13 ] # La sottostringa dall'inizio fino alla posizione 12 'Apelle figlio' Queste sottosequenze [a:b] , nel gergo di Python, si chiamano slices. Le parentesi quadre accettano anche indici negativi, in questo caso sono contati dalla fine verso l'inizio della sequenza, con - 1 che rappresenta l'ultima posizione: s[- 1 ] # L'elemento in ultima posizione '.' s[- 2 ] # Quello in penultima posizione 'o' s[- 3 ] # Quello terzultima posizione 'l' s[- 4 ] # Quello in quartultima posizione 'l' s[- 0 ] # Equivalente a s[ 0 ] 'A' s[- 1 : 0 ] # La slice dall'ultimo al primo è vuota '' s[- 4 :- 1 ] # Dal quartultimo al penultimo 'llo' s[- 4 :] # Dal quartultimo alla fine 'llo.'
s[:- 4 ] # Dall'inizio fino al quintultimo 'Apelle figlio di Apo' Per i tipi sequenza che sono mutabili come le liste le slice possono essere usate anche per l'assegnamento: lst ['a', 'b', 'C', 'D', 'e', 'f', 'g', 'h'] lst[- 3 :] = ['F','G','H'] lst ['a', 'b', 'C', 'D', 'e', 'F', 'G', 'H'] lst[ 1 : 4 ] = ['x'] lst ['a', 'x', 'e', 'F', 'G', 'H'] lst[ 3 :- 1 ] = ['X','X','X','X'] lst ['a', 'x', 'e', 'X', 'X', 'X', 'X', 'H'] lst[: 2 ] = [] lst ['e', 'X', 'X', 'X', 'X', 'H'] Quindi la sottolista specificata dalla slice è sostituita con la lista dopo il segno =. Ora un semplice esempio d'uso delle slice per suddividere un codice fiscale nelle sue componenti: def print_cf(cf): print 'Cognome (tre lettere):', cf[ 0 : 3 ] print 'Nome (tre lettere):', cf[ 3 : 6 ] print 'Data di nascita e sesso:', cf[ 6 : 11 ] print 'Comune di nascita:', cf[ 11 : 15 ] print 'Carattere di controllo:', cf[- 1 ] print_cf('BRLSLV 33 A 62 F 205 F') Cognome (tre lettere): BRL Nome (tre lettere): SLV Data di nascita e sesso: 33 A 62 Comune di nascita: F 205 Carattere di controllo: F
Scrivere le funzioni seguenti.