Sei sulla pagina 1di 39

1.

Introduzione alla programmazione


1. Logiche comuni, linguaggi diversi
Programmare: istruire una macchina su come realizzare un certo compito o risolvere un certo problema
Insieme di istruzioni che un computer, passo per passo, esegue per portare a termine un compito

In sostanza: imparare a parlare una lingua per parlare con la macchina

2. Computer e memorizzazione dei dati


Componenti principali nell’Architettura di Von Neumann:

1) CPU (Centra Processing Unit)


processore che esegue solo semplici operazioni di base specificate nel programma (es. operazione
aritmetica, logica, di controllo)
2) Memoria (RAM e ROM)
memorizzare sia i dati sia le istruzioni
3) Dispositivi input/output
4) Bus
canali di comunicazione che mette in comunicazione le tre macroaree

Linguaggio macchina: codice binario (0/1, ciascuno un bit di informazione)


Negli anni Cinquanta, istruzioni = sequenze di bit

Allora, un linguaggio di programmazione che permette di specificare le istruzioni per risolvere un problema, andare
oltre il codice binario

3. Come funziona un programma


Necessità di un linguaggio formale che permette di specificare delle istruzioni comprensibili a un calcolatore (CPU)
per risolvere un problema

Le istruzioni:

- In blocchi
- Raccolte in funzioni

Programmi memorizzati in ROM, copiati in RAM una volta eseguiti per l’elaborazione della CPU in sequenza

Il calcolatore riceve input e restituisce degli output, attraverso delle operazioni:

- Matematiche
- Condizionali
- Cicli (rifare la verifica)

Suddividere un problema complesso in problemi e attività più semplici fino a quando le sotto attività sono semplici
abbastanza da essere eseguite con le operazioni base

Traduzione del codice sorgente


I linguaggi più avanzati a sua volta devono essere tradotti in linguaggio macchi (0/1), quindi possibile in due modi
Compilazione, traduzione prima dell’esecuzione
una volta sviluppato, il software produce un file eseguibile attraverso un comando, oltre il quale non più necessario
traduzione, ma difficile controllare gli errori

Interpretazione, traduzione immediata di singole istruzioni


software come interprete, più lento ma facile da analizzare e correggere

4. Evoluzione dei linguaggi


Prima Assembly, ma ancora legato al linguaggio macchina

Linguaggi possono essere:

1) Dichiarativi
descrivono la realtà e dichiarano l’obiettivo richiesto, senza precisi algoritmi
2) Procedurali
definiscono algoritmi che passo dopo passo portano all’obiettivo

Python: linguaggio multi-paradigma


sia procedurale che dichiarativo

5. Il ciclo di sviluppo di un programma


Ciclo: diverse fasi necessari per portare a termine una programmazione

1) Da un problema, definizione degli input e output


2) Requisiti
descrizione della funzionalità del programma, indicando gli obiettivi da raggiungere
3) Progettazione
definire le linee essenziali della struttura
4) Modello
rappresentazione di tutte le entità e la loro relazione per ogni requisito
5) Algoritmo
processo che permette di risolvere un problema mediante un numero finito di semplici passi
6) Implementazione
realizzazione del programma, funzionare l’algoritmo, concretizzare la soluzione attraverso la
programmazione
7) Test: debugging (errori semantici e di sintassi)
8) Esecuzione del programma

6. Algoritmi e diagrammi di flusso


Algoritmo:
un processo che permette di risolvere un problema attraverso un numero finito di semplici passi

Implementazione: esecuzione e traduzione dell’algoritmo

Caratteristiche:

- Sequenza finita
- Procedura porta a un risultato
- Istruzioni eseguibili materialmente
- Istruzioni espresse in modo non ambiguo

Diagramma di flusso
descrive in modo intuitivo le azioni di cui l’algoritmo stesso è composto, rappresentati in blocchi:

- Ovali, inizio/fine
- Romboidi, input/output
- Rettangoli, elementi di esecuzione
- Rombi, elementi di decisione o scelta
- Frecce, flusso d’esecuzione
2. Introduzione a Python
Che cos’è Python
Python è un linguaggio di programmazione di alto livello interpretato, interattivo, orientato agli oggetti, semplice,
che usa la tipizzazione dinamica e fortemente tipizzato, ed è portabile:

- Linguaggio di alto livello


- Interpretato
- Interattivo
permette di scrivere istruzioni direttamente nel suo prompt dei comandi (ossia: shell)
- Semplice e chiaro nella sintassi
- Usa la tipizzazione dinamica delle variabili
- Portabile – compatibile con tutti i sistemi operativi

Linguaggio open source, migliorato dalla community

Usato per lo sviluppo web, analisi dato e scripting etc.

IDLE
IDLE (Integrated Development and Learning Environment) è l’ambiente di programmazione di Python, che include
due diverse componenti:

- Shell (interprete, console), in modalità interattiva (o “a riga di comando”)


permette di digitare ed eseguire singole istruzioni e vedere subito il risultato
- Editor, in modalità script
creare programmi e salvabili nella memoria del computer

Colori
- Funzioni built-in: viola
- Stringhe: verde
- Output: blu
- Errori: rosso
- Parole chiavi: arancione
- Nomi definiti: blu
- Commenti: rosso
- Commenti fuori righe: verde

Sintassi di Python
Sintassi: insieme di regole che è necessario conoscere e seguire in maniera rigorosa quando si scrive un programma

Parole chiave (parole riservate): parole predefinite di un significato ben preciso e non può essere utilizzata per altri
scopi

Operatori: svolgono operazioni sui dati

Commenti
Possono essere:

- #
- Tra tre apici (‘’’) o tre virgolette (“””): in tal caso possibile scrivere in più righe

Codici di escape
Backslash (\) all’interno di una stringa

Funzioni built-in
Funzione
parte di codice preconfezionata che esegue una determinata operazione
Print
Restituisce un messaggio
parametri:

- Value
il valore che verrà restituito come output
- Sep
separatore da restituire tra i vari testi in output

Help
Usabile nella shell, visualizza le informazioni su una funzione, dato o modulo
3. Calcoli e output dei dati
Operatori matematici e calcoli

Parentesi e precedenza degli operatori


Espressione matematica: sequenza di numeri, operatori matematici e parentesi per eseguire un calcolo

Ordine da sinistra a destra, PEMDAS:

1) Parentesi
2) Elevamento a potenza
3) Moltiplicazione e divisione
4) Addizione e sottrazione

Output dei dati e funzione format


Format, due argomenti:

- Numero da formattare
- Specificatore di formato

Specificatore può essere:

- “f”, numero a virgola mobile


- “.2”, arrotondamento al secondo decimale
- “,” separatore di migliaia
- “%”, in percentuale
- “d”, in luogo della “f” se numero intero
(es. ‘,d’)

Funzioni per i calcoli


Funzioni built-in comuni:

- sum
somma di un elenco di elementi
- pow
elevamento a potenza di un numero
- abs
calcola il valore assoluto
- round
arrotonda un numero in virgola mobile, decimale indicata nel secondo parametro
- max e min
il valore max o min di una serie di parametri (o lista)
4. Variabili e tipi di dati
Variabili e istruzione di assegnazione
Variabile
un nome che rappresenta un valore nella memoria del computer

Istruzione di assegnazione
per creare una variabile mediante l’operatore di assegnazione “=”

Nomenclatura delle variabili


I nomi delle variabili:

- devono essere brevi e significativi


- devono iniziare con una lettera o con il carattere underscore (_), a cui far seguire lettere, numeri o
underscore
- non possono contenere spazi o caratteri speciali, per esempio @, &, $, €, §
- non possono essere costituiti da keyword riservate di Python (per esempio True, not, or, return, while, and,
if o nomi di funzioni)
- preferibile non usare caratteri accentati

È comunque possibile assegnare al variabile il nome di una funzione


tuttavia, in tal caso la funzione perde la sua operatività  da evitare dunque

Riassegnazione
Le variabili possono referenziare diversi valori durante l’esecuzione di un programma

Quando si assegna un valore a una variabile, questa referenzia il valore fino a che non le si assegna un valore diverso

Riassegnazione
operazione di sostituzione di un valore con un altro

Aggiornamento
Il nuovo valore della variabile dipende da quello precedente

Fondamentale ovviamente di inizializzare la variabile

Assegnazione multipla
Inizializzazione o riassegnazione di più variabili con una sola riga di codice

Tipi di dati
Tipizzazione
assunzione della variabile a un certo tipo di dato
Il tipo di dati determina il comportamento di alcune operazioni, mentre altre possono essere svolte solo su valori di
un tipo di dato specifico

La tipizzazione può essere:

- statica
il programmatore deve dichiarare esplicitamente il tipo della variabile nell’assegnazione
- dinamica
l’interprete decide automaticamente il tipo

La funzione type() ci permette di conoscere il tipo del dato

Espressioni con tipi di dati misti


- int + int  int
- float + float  float
- float + in  float

Funzione di conversione tra tipi


Convertire il tipo dei dati:

- int
- float
- str

Nota bene:

- se la conversione è impossibile, errore


- funzione int non arrotonda, ma semplicemente tronca la parte decimale

Funzione input
Chiede all’utente l’inserimento di un dato

Il dato restituito è una stringa (possibile comunque la conversione)


5. Strutture decisionali e logica booleana
Struttura
schema logico definito del programma

- Struttura sequenziale
flusso lineare delle scelte, la cui esecuzione avviene nell’ordine delle istruzioni
- Struttura decisionale
eseguire un’azione solo a verificarsi di condizioni specifiche

Struttura decisionale
Possono essere:

- Semplice (o ad alternativa singola)


- Esecuzione alternativa (o ad alternativa doppia)
- Condizioni in serie

L’istruzione if
Istruzione decisionale, per una struttura decisionale semplice

Il codice si sposta di un tab – indentazione, serve per far capire cosa è dipendente dalla condizione

se non si allineano di un tab = errore

Espressioni booleane e operatori di confronto


Espressioni che generano un valore booleano: True e False

Operatori di confronto

Possibile solo tra valori dello stesso tipo

L’istruzione if-else
Per una struttura decisionale ad alternativa doppia, rendendo possibile la ramificazione di due possibili percorsi di
esecuzione

È possibile nidificare con più clausole if-else

L’istruzione if-elif
Per una struttura decisionale di condizioni in serie, come alternativa di if-else nidificate

Elif
consente di specificare un’istruzione per ciascuno dei possibili casi
Gli operatori logici
Operatori booleani
consentono di creare espressioni booleane, esprimere condizioni molteplici, cumulative o alternative

L’istruzione if con in
Permette di allargare la condizione, confronto con un elenco di valori o con un intervallo

in + lista di valori (racchiusi tra parentesi quadre)

L’istruzione pass
Per scrivere temporaneamente un costrutto if, while o for vuoto senza istruzione

Segnaposto per il codice che andrà poi completato, evitando errore


6. Costrutti iterativi
Iterazione
capacità di eseguire ripetutamente uno stesso blocco di istruzioni, implementato da costrutti – cicli

Possono essere:

- Cicli controllati da una condizione


una condizione vero/falso per controllare il numero di ripetizioni
- Cicli controllati da un contatore
ripetizione per un numero di volte specificato

Il ciclo while
Creare un ciclo controllato da una condizione

Si esce dal ciclo se la condizione non è più vera

Corpo della struttura:

- Condizione
- Istruzione, ripetuto finché è vera

Ciclo while infinito


Istruzione while True:
Ripetere infinite volte, affinché non si verifica una condizione

Necessita delle istruzioni if e break ma non richiede la preventiva inizializzazione della variabile

Il ciclo for
Creare un ciclo controllato da un contatore
La porzione di programma interna al ciclo viene rieseguita un certo numero di volte stabilito
controllato infatti da un contatore

Il corpo del ciclo:

- Variabile contatore (in)


- Istruzioni eseguiti a ogni iterazione del ciclo

In pratica, alla variabile contatore viene assegnato il primo valore della lista, vengono eseguite le istruzioni, e in
seguito viene assegnato alla variabile il valore seguente del lista – fino all’ultimo valore

La funzione range
range (start, stop [, step])

Restituisce un oggetto che produce una sequenza di numeri interi, compresi tra il valore minimo start (incluso) e il
valore massimo stop (escluso), con incrementi corrispondenti a step

- start
se omesso: 0
- stop
- step
se omesso: 1

La funzione gestisce solo valori interi

Se nel parametro un valore decimale  errore

Le istruzioni break e continue


Quando vi è la necessità di terminare bruscamente il ciclo al verificarsi di determinate condizioni
Oppure, per certi condizioni, passare all’iterazione successiva

- break , forzare l’uscita dal ciclo per una condizione


- continue , ignorare le restanti istruzioni nell’iterazione e riporta il controllo all’inizio del ciclo
7. Funzioni
Introduzione alle funzioni
Funzione è un gruppo di istruzioni a cui viene assegnato un nome che, all’interno di un programma, svolge un
compito specifico

Funzioni personalizzate
blocchi di codice a cui viene assegnato un nome
Eseguiti quando chiamati in maniera esplicita

Programma modulare
programma in cui ogni compito svolto da un’apposita funzione

Vantaggi principali:

- Possibilità di riutilizzare il codice


- Maggiore semplicità del codice
- Miglioramento della fase di test

Definire e chiamare una funzione


Per creare una funzione si deve prima definirla:

- Come si chiama
- Quali operazioni deve compiere
Chiamare una funzione
La definizione di una funzione permette a Python di capire quale operazione deve svolgere, ma non la esegue

Una volta che il programma viene caricato, Python tiene in memoria tutte le funzioni con i suoi blocchi di istruzioni
Richiamare la funzione per attivarla

Se sono stati specificati dei parametri nella definizione, è necessario scrivere il loro valore tra le parentesi tonde

Argomenti delle funzioni


Argomenti
inputi necessari per svolgere il proprio compito

Parametri:

- spiegano a Python che alla funzione, quando sarà chiamata, dovranno essere passati dei dati
- consentono di specificare come devono essere utilizzati i dati per eseguire le operazioni previste dalla
funzione

Quindi argomenti sono dei dati passati alla funzione


e parametri come variabili create per definire la funzione

Parametri obbligatori e opzionali


Necessario prima specificare i parametri obbligatori, poi opzionali

Al parametro opzionale va indicato il valore predefinito, che dovrà assumere se non specificato

Chiamare una funzione con parametri


Ai parametri obbligatori devono essere chiamati altrettanti argomenti

Nella chiamata della funzione:

- argomenti passati per posizione


nell’ordine in cui i parametri vengono definiti
- argomenti denominati
specificare il nome dei parametri

È possibile usare entrambi, tuttavia prima gli argomenti per posizione, poi quelli dominati
Funzioni produttive e funzioni void

Funzione produttiva
Gruppo di istruzioni che esegue un compito specifico e, quando termina, restituisce un valore all’istruzione che l’ha
chiamata

Chiude con l’istruzione return

Tutte le istruzioni dopo return non vengono prese in considerazione

Consente di memorizzare il risultato della funzione tale da utilizzarlo successivamente


altrimenti il dato verrà perso

Funzione void
Gruppo di istruzioni che esegue un compito specifico, ma quando terminano non restituiscono alcun valore
all’istruzione che le ha chiamate

Non è presente l’istruzione return alla fine

Variabili locali e variabili globali


- Globale
può essere raggiunta da qualsiasi istruzione di un programma (fuori dalla funzione)
- Locale
può essere raggiunto solo nel suo ambito – nella parte del programma in cui viene definita (all’interno del
corpo funzione)
Una volta terminato il compito, le variabili non sono più utilizzabili: Python ne perde la memoria

Ambito
spazio in cui una certa variabile può essere utilizzata

Stringa di documentazione (docstring)


Riga di spiegazione o commento della funzione

È una stringa di testo racchiusa tra triple virgolette (“””), come prima istruzione subito dopo l’intestazione nella
definizione di una funzione

Visibile nella lettura del codice, ma anche con la funzione help o nel call tip
8. Stringhe e liste
Sequenze
Sequenze
oggetto che contiene diversi dati, memorizzati uno dopo l’altro

Caratteristiche:

- sono iterabili, trattabile come una sequenza e restituisce un elemento per volta
- sono mutabili o immutabili
- la posizione di ciascun valore è identificata da un numero (indice)
- numerose funzioni, metodi e operazioni

Stringhe
Sequenza di caratteri che può contenere caratteri alfanumerici e simboli

Immutabili, non è modificabile la stringa esistenza – solamente tramite la riassegnazione

Operazioni sulle stringhe


L’operatore +
Concatenare due stringhe
Errore se tipi di dato diversi

L’operatore *
Crea più copie di stringhe, concatenandoli

L’operatore in
- True se una stringa di testo è inclusa nella seconda stringa
- False se no

L’operatore not in
Opposto di in

Gli operatori is e is not


True quando le due stringhe sono identiche

Liste
Raccolta di diversi dati (detti elementi) di qualsiasi tipo, racchiusi tra parentesi quadre [] e separati da virgole

Creabile mediante la funzione list

Assegnate a variabili

Lista priva di elementi  lista vuota


Operazioni sulle liste
L’operatore +
Unisce due liste
in particolare, anche se di tipi diversi

L’operatore *
Copia e concatena

Gli operatori in e not in


True se un elemento fa parte di una lista – e il contrario

Verifica l’elemento, quindi non parte di esso

Indicizzazione (indexing)
Modo per poter accedere ai singoli elementi di una sequenza

Indice
il numero intero che identifica la posizione di ogni elemento all’interno della sequenza

Sintassi: sequenza[indice]

Se la sequenza è mutabile, con la stessa sintassi è possibile modificare gli elementi di una sequenza
Altrimenti, errore

Slicing
Selezionare più elementi di una sequenza contemporaneamente, tramite gli indici degli elementi della sequenza

Slice: un segmento di sequenza

Sintassi: sequenza[indice_iniziale:indice_finale:step]

L'operazione restituisce tutti gli elementi della sequenza tra quello con indice_iniziale (compreso) e quello con
indice_finale (escluso). Step è opzionale e indica quali indici successivi selezionare dopo il primo

Se step negativo:

- Parametri iniziale e finale negativo


- Parametri iniziale e finale positivo ma invertiti

Slicing utilizzabile per la sostituzione contemporanea di più elementi per le liste

Funzioni e metodi delle stringhe


- Funzioni
prevede che la stringa o la variabile passati come argomento della funzione
- Metodo
funzioni legate ad un particolare oggetto, sempre specificare il nome della sequenza
Sintassi: oggetto.metodo(argomenti)

Funzioni
Metodi

Il metodo split
Divide la stringa in parole, generando una lista nelle quale gli elementi sono le parole provenienti dalla stringa

Con argomento facoltativo “separator”:


per default lo spazio è il separatore, altrimenti da specificare nelle parentesi

Il metodo join
Crea una stringa di testo concatenando le stringhe o gli elementi di una lista

Necessario specificare una stringa che sarà utilizzata come separatore

In particolare, il metodo si applica alla stringa con il separatore, e non alla lista!
La lista dunque da inserire tra parentesi

Funzioni delle liste

In particolare, nel max e min, se lista di elementi di tipi diversi: errore


Metodi delle liste

Il metodo append
Aggiunge nuovi elementi alla lista, come l’ultimo elemento

Il metodo insert
Inserisce un elemento in una determinata posizione di una lista

Parametri:

- index, l’indice dell’elemento


- element, il nuovo elemento da aggiungere

I metodi remove e pop


Eliminare elementi di una lista

- remove
specificare l’elemento da eliminare
- pop
specificare l’indice dell’elemento
Inoltre non si limita ad eliminare, ma anche restituire lo stesso elemento (quindi memorizzabile)

I metodi sort e reverse


Modificano l’ordine degli elementi di una lista

- sort, ordine crescente


parametro opzionale “reverse”: ordine decrescente
- reverse, ordine inverso

Inoltre, questi non restituiscono un valore, ma l’effetto sulla stessa lista cui sono applicati

Il metodo count
Restituisce il numero di volte che un determinato elemento compare nella lista

Attraversamento di stringhe e liste


Attraversamento:
l’accesso in sequenza a tutti gli elementi di una stringa, di una lista o di un qualsiasi oggetto iterabile

Si utilizzano:

- l’indicizzazione o lo slicing
- i cicli
- metodi e funzioni
9. Tuple e dizionari
Tuple
Sequenza contenente dati di qualsiasi tipo, chiusi tra parentesi tonde e separati dalle virgole

Le parentesi non necessarie, ma meglio farle (soprattutto se nidificare)

Immodificabili, dunque elementi non modificabili e non sostituibili


vantaggi:

- Più sicure per memorizzare i dati


- Prestazione migliore, peso leggero e veloce nell’esecuzione

Funzione tuple(): converte una lista in tupla

Possibile l’uso di indicizzazione e dello slicing, ma non per assegnare nuovi elementi

Operatori, funzioni e metodi delle tuple


Simili a quelli precedenti

Inoltre, pochi metodi

Dizionari
Oggetto che contiene una collezione di dati

Non-sequenze, quindi impossibile ordinare o usare l’indicizzazione


nemmeno lo slicing, quindi solo mediante un ciclo per attraversare un dizionario

Composti da due parti:

- Chiave, dato univoco di qualsiasi tipo, immutabile, utilizzate per trovare i valori
- Valore, associato alla chiave, qualsiasi tipo di dato mutabile o immutabile

Per creare un dizionario:

- Necessario racchiudere gli elementi tra parentesi graffe {}


- Elementi separati da virgole
- Ogni elemento costituito da una chiave seguita da due punti e da un valore

Sono mutabili, quindi sempre possibile aggiungere una nuova coppia chiave-valore a un dizionario già esistente o
vuoto

nome_dizionario[chiave] = valore
Per accedere ai valori memorizzati nel dizionario, si utilizza la chiave corrispondente

nome_dizionario[chiave]

Per modificare il valore, semplicemente assegnare alla chiave il nuovo valore

Operatori
Non utilizzabili + e * poiché struttura chiave-valore del dizionario, altrimenti errore

del
eliminare una coppia chiave-valore, o l’intero dizionario

in/ not in
True se trovata una chiave / non trovata nel dizionario

is e is not
non solo se I due dizionari sono identici, ma anche se sono l’uno la copia dell’altro

Se True, ogni modifica in un dizionario viene applicato anche all’altro

Se solamente uguali: operatore di confronto ==

Funzioni
Funzione len
Restituisce il numero di coppie chiave-valore di un dizionario

Funzione dict
Crea un dizionario vuoto

Ma, se come argomento un oggetto iterabile: crea anche dizionario non vuoto
Tuttavia solo se oggetto iterabile composto da coppie di elementi
Se una semplice lista – errore

Funzione min e max


Restituiscono la chiave più piccola/grande di un dizionario

Funzione sorted
Non modifica il dizionario, restituisce una lista con le sue chiavi in maniere crescente

Metodi
Metodo clear
Elimina tutte le coppie chiave-valore lasciando il dizionario vuoto

Metodo get
Restituisce il valore associato ad una determinata chiave specificata come argomento

- chiave
obbligatorio, la chiave da cercare
- default
opzionale, specifica il valore restituito se la chiave non viene trovata

Alternativa all’indicizzazione

Metodo pop
Rimuove la coppia chiave-valore specificato

- chiave
obbligatorio, la chiave da cercare
- default
opzionale, specifica il valore restituito se la chiave non viene trovata

Non solo elimina, ma restituisce anche il valore ad essa associato

Metodo popitem
Rimuove l’ultima coppia chiave-valore aggiunta, restituendo una tupla con due elementi

Metodo items, key e values


Restituiscono oggetti iterabili detti view object, fornendo una visualizzazione dinamica degli elementi di un dizionario

Cambiarsi del dizionario di origine, cambia anche la loro visualizzazione

Rendono possibile attraversare le chiavi di un dizionario con un ciclo

Possibile allora convertire i view object in liste mediante la funzione list (in questo modo si interrompe il
collegamento con il dizionario di origine)
10. Accesso ai file e gestione degli errori
Accedere ai file
Il processo di accesso ai dati consiste in:

1) Apertura del file, creazione di un collegamento tra il programma e il file


2) Utilizzo del contenuto del file
3) Chiusura del file e rimozione del collegamento

L’accesso può essere:

- Accesso di tipo sequenziale


accedersi al file e leggere dall’inizio alla fine, senza la possibilità di saltare da un punto all’altro
- Accesso di tipo diretto
possibile andare direttamente al dato desiderato

Funzione open
Funzione per accedere un file

Crea un oggetto file a cui viene associato lo specifico file che vogliamo aprire
necessario essere referenziato da una variabile

- File (obbligatorio), stringa di testo che specifica il nome del file e il suo percorso
- Mode (opzionale), stringa di testo sulla modalità di apertura del file

Poiché “\” codice di escape  “\\”!

Se il file non esiste, viene creato da Python nella posizione specificato nell’argomento

Metodo close
Per il salvataggio nel file
altrimenti rischio che il programma che non salvi automaticamente il file

Attributi al file
Possono essere:

- name, restituisce il percorso completo e il nome del file


- mode, la modalità di accesso al file
- closed, True se il file è chiuso

Poiché attributi, non argomenti quindi non parentesi


Leggere dati da un file
Puntatore
segna la posizione corrente in cui ci troviamo nel file aperto – dipende dalla modalità di apertura

Metodo read
Legge il contenuto dell’intero file

Metodo readline
Legge e restituisce il contenuto di una riga del file
Puntatore si sposta nell’inizio della riga successiva

Metodo readlines
Legge righe per righe fino al termine del file
Restituisce una lista di tutte le righe quali elementi

Metodo tell
Restituisce la posizione esatta del puntatore, espressa in byte di distanza dall’inizio

Metodo seek
Muovere il puntatore in una nuova posizione

Argomenti:

- offset, distanza in byte


- whence:
o 0, dall’inizio
o 1 dalla posizione corrente
o 2 dalla fine del file

Scrivere dati in un file


Metodi sono:

- writable()
True se è possibile scrivere dati nel file
- write(string)
scrivere i dati dell’argomento (in stringa) nel file – puntatore al fine del testo (quindi \n per inserire la riga)
- writelines(lines)
scrive nel file la sequenza di righe specificate nell’argomento

Gestione degli errori


Eccezione
errore che si verifica durante l’esecuzione di un programma

Spesso si porta al blocco dell’intero programma

Errori di sintassi
Errore nella scrittura del codice

Nel salvataggio, Python segnala l’errore evidenziando in rosso la parte del codice mostrando il messaggio Invalid
syntax

Nella shell, un messaggio di traceback restituendo l’errore, mostrando SyntaxError

Python ci comunica:

- Il punto in cui si è verificato l’errore


- L’istruzione che ha generato l’errore
- Il tipo dell’errore

Tuttavia non sempre molto chiara, e lo può rivelare anche righe prima
Errori di runtime
Errore nel codice per operazioni che Python non può eseguire o che non comprende

L’errore si verifica quando il programma è in esecuzione

Messaggio nella shell, indicando il genere dell’errore specificandone la causa

Errori semantici
Programma eseguito senza errore, ma con risultati non corretti, imprevisti e non desiderati

Dovuta ad un’errata progettazione del codice

Difficile da individuare, richiede una rilettura passo a passo, o l’uso di strumenti di debugging più sofisticati (es.
Debugger)

Le istruzioni try… except


L’istruzione per la gestione delle eccezioni (exception handling), altrimenti in errore

Durante l’esecuzione del codice, al verificarsi dell’errore, Python salta al blocco di codice dell’istruzione except senza
terminare quella di try
Altrimenti, il blocco except verrà saltato

È possibile anche gestire i singoli errori

Debugging
Attività di ricerca e di rimozione degli errori, ma anche nello studio del codice per renderlo più efficiente

Processo sperimentale
si cerca di risalire alla causa del problema, rileggendo il codice, individuando la parte problematica, correggendo il
codice e infine eseguendolo di nuovo
Ripetuto finché si risolve il problema
11. Le librerie di Python
Definizione di modulo
File script che contengono blocchi di codice che svolgono azioni o calcoli specifici
Ogni blocco identificato con un suo nome

Moduli sono organizzati per finalità di utilizzo e contenuti omogenei, rendendo possibile la riusabilità del codice

Possono essere:

- Librerie standard, già installati sul computer


- Moduli creati dall’utente
- Moduli sviluppati di terzi parti

Differenza tra moduli e librerie e uso della dot notation


- Modulo, file script il cui nome coincide con il nome dato al modulo
- Libreria, contiene i moduli che la compongono
- Dot notation
con il singolo punto “.”, permette di partire dalla voce più generale a quella più specifica separandole

L’istruzione import
L’istruzione con cui si caricano nella memoria RAM i contenuti di un modulo o di una libreria

Possibile importare sulla stessa riga più moduli separati dalla virgola

As
Possibile accorciare il nome con la parola riservata as
in quel modo, non più possibile usare il nome per esteso

From
Per importare una funzione specifica

Funzione help(‘modules’)
Riporta i moduli installati nel programma

Funzione dir()
Riporta i moduli attualmente attivi nella sessione

Se con modulo come argomento, permette di esaminare il contenuto dei singoli moduli
se oggetto come argomento, lista di tutte le caratteristiche/attributi
La libreria standard di Python
Il modulo os e os.path
Modulo che permette a Python di interagire con il Sistema Operativo – ispezionare e manipolare file e cartelle

Tutti i dati inseriti dentro devono essere dati di tipo stringa

Il modulo random

Il modulo webbrowser
Consente la visualizzazione di documenti web comandando da Python il browser impostato come default sul
computer
Aprire la pagina web relativa all’indirizzo URL passata alla funzione open come stringa
Librerie di terze parti
Come installare
L’installazione può avvenire in due modi:

- Scaricarlo nel sito


- Nel prompt dei comandi, l’istruzione “pip install modulename”

La libreria openpyxl
Modulo non standard per leggere e scrivere file Excel con Python
12. Classi, attributi, metodi
Programmazione a oggetti
Oggetti
elementi che possono rappresentare un valore o eseguono azioni

In Python di fatto ogni “cosa” è un oggetto

L’approccio di Python: programmazione orientata agli oggetti (OOP)

Nel paradigma a oggetti, la programmazione non è più una gerarchia piramidale di processi e sottoprocessi, ma un
insieme di oggetti collegati e comunicanti fra loro – tra cui si interagiscono

I principi di OOP:

- Incapsulamento
non rendere visibili agli altri oggetti le caratteristiche strutturali e di funzionamento di una classe, e
l’interazione solo tramite i metodi
(in tal modo più facilmente condivisibile, semplice da testare, più sicuro e più produttivo)
- Ereditarietà
meccanismo di costruzione che permette di costruirne di nuove a partire da altre esistenti
permettendo di ereditare attributi e metodi a quelle a valle
- Polimorfismo
possibile dare il medesimo nome a metodi che compiono lo stesso tipo di azione su oggetti differenti

Gli oggetti: classi e istanze


- Classe
Descrizione astratta di un oggetto, l’insieme delle caratteristiche che può assumere un determinato tipo di
variabile
- Istanza
uno specifico oggetto di una classe (oggetto in senso stretto)
(es. nome = 125, nome è un’istanza della classe int)

Una classe è definita da un insieme di attributi e metodi:

- Attributo
le caratteristiche della classe che permettono di istanziare (creare) o identificare le differenti istanze della
classe
(es. il valore di una stringa è l’attributo di str)
- Metodi
funzioni/azioni che gli oggetti di una classe possono compiere
(es. upper, metodo della classe string)
I literals in Python
I tipi di dato elementare e le strutture dati complesse

Differenza: per creare le istanze dei literals non è necessario invocare il metodo costruttore, ma una sintassi dedicata
(es. parentesi graffe  tuple)

In Python, il tipo è legato all’oggetto stesso che, per le logiche di incapsulamento, non può essere cambiato
Quindi, non è possibile convertire una variabile o un oggetto da un tipo a un altro

Di conseguenza, la conversione non modifica l’oggetto originale, ma ne crea uno nuovo, riassegnando il nome al
nuovo oggetto che occupa in un differente spazio nella memoria

Lavorare con le classi personalizzate


Per creare una classe è necessario assegnarle un nome e definirne i suoi attributi e/o metodi

Tutte le istanze di una classe ereditano attributi e metodi della classe a cui appartengono

Gli attributi ereditati dalle singole istanze possono essere assegnati in fase di creazione dell’istanza e/o modificati in
un secondo momento

La classe capostipite object


Classe object: il caso più generale possibile di classe, base su cui ogni altra classe viene costruita

Creare una classe

Parentesi tonde non necessarie, ma meglio mantenerle

Classe che discende da objetc ( = class Persona(object))

Attributi
Possono essere basati su qualunque tipo di dato, servono per customizzare la classe in singole istanze

I variabili possono essere variabili o costanti

Metodo costruttore _init_


Metodo per inizializzare lo stato di un oggetto, a tutti gli effetti una funzione
Come minimo un argomento tra parentesi tonde: self, nome convenzionale
Riferimento al nome dell’istanza che verrà creata
un nome provvisorio che si utilizza per assegnare valori alle variabili dell’oggetto

Il metodo costruttore non fa calcoli in quanto non è una funzione produttiva, solo per definire e valorizzare gli
attributi della futura istanza (per cui niente return)

Anche se non viene specificamente indicato, la classe eredita in ogni caso il costruttore della classe object

Interagire con gli attributi degli oggetti


Per accedere ad uno specifico oggetto, bisogna utilizzare il nome della relativa istanza

Gli attributi possono essere:

- Di istanza, dati univoci per ogni istanza


- Di classe, attributi uguali per tutte le istanze

Metodi
Procedure che eseguono istruzioni
Possono restituire un valore attraverso l’istruzione return

Come il minimo parametro: self

Se produttivo, possibile assegnare il risultato a un nuovo oggetto

Docstring
Possibile le stringhe di documentazione immediatamente dopo la prima riga con i due punti

Creare copie di una stessa istanza


Per duplicare un oggetto, impossibile assegnare l’oggetto preesistente ad un nuovo nome
infatti, in tal caso, i due nomi puntano al medesimo spazio di memoria: al modificare del valore dell’attributo di uno
cambia anche quello dell’altro

Modulo copy
Funzione copy.copy  crea il duplicato di un oggetto, lasciando intoccato l’originale
Il metodo speciale __str__
Permette di costruire la rappresentazione informale di un oggetto in formato stringa
inserire qualunque informazione utile per l’utilizzatore

Se il metodo non è stato definito, Python recupera l’analogo metodo definito nell’oggetto predefinito object –
visualizza cioè l’indirizzo di memoria in cui l’istanza è archiviata

In tal modo, ciò che viene visualizzato è il risultato del metodo speciale __str__

Non ha argomenti (oltre a self) e deve terminare con l’istruzione return

Best practice nella creazione delle classi


Per il principio di incapsulamento (proprietà di coesione e accoppiamento), fare in modo che sono minori le
possibilità di modifica arbitraria di un oggetto, renderlo più semplice nell’uso

Metodi appositi:

- Metodo di accesso get


osservare e leggere lo stato di un oggetto (senza modificarlo)
- Metodo modificatore set
modificare lo stato di un oggetto

Ereditarietà
Esercizi memorabili
10.6

12.9

12.13

13.3
13.8

13.10

14.5

14.6

14.7

14.8

14.9

14.12

Potrebbero piacerti anche