Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Introduzione alla programmazione in Python: Identità, Tipi e Metodi, Dispense di Fondamenti di informatica

Introduzione al linguaggio python

Tipologia: Dispense

2020/2021

Caricato il 20/05/2021

-Frank
-Frank 🇮🇹

2 documenti

1 / 9

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
OGGETTI E METODI
OGGETTI
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 dall a locazione in memoria dell'oggetto 'stringa'. Ovviamente due
oggetti differenti non possono o ccupare la stessa locazione in memoria, quindi due oggetti con la stessa
identità sono esattamente lo stesso oggett o. Però oggetti differenti (cioè con differenti identità) possono
avere lo stesso tipo e val ore. La funzione built-in id(obj) r itorna 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'operato re == 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 ragio ni di efficienza Python può usare lo stesso oggett o 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:
pf3
pf4
pf5
pf8
pf9

Anteprima parziale del testo

Scarica Introduzione alla programmazione in Python: Identità, Tipi e Metodi e più Dispense in PDF di Fondamenti di informatica solo su Docsity!

OGGETTI E METODI

OGGETTI

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

  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' 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

ESERCIZI

Scrivere le funzioni seguenti.

  1. occ(lst, v) ritorna una lista contenente gli indici delle occorrenze di v nella lista lst. Esempi, sia lst = ['red','blue','red','gray','yellow','red']