And tracing
L'hand-tracing è un metodo che aiuta a capire se un programma funziona correttamente. Consiste nel tracciare a mano su un foglio l'evoluzione delle variabili. Crea una tabella delle variabili più importanti e tiene traccia dei loro valori (con carta e penna). Utilizza il codice (o lo pseudocodice) per tracciare l'esecuzione del programma e utilizza dati di input di esempio che generino un risultato prevedibile e noto e testino tutti i rami del codice.
Variabili e operatori booleani
Nel 1847 George Boole introdusse un nuovo tipo di formalismo logico, basato esclusivamente su enunciati che potevano essere veri o falsi.
Variabili booleane
Una variabile booleana può solo essere Vera o Falsa (1 o 0). Una variabile booleana è spesso utilizzata come flag (indicatore) proprio perché può essere solo vera o falsa. bool è un tipo di dato in Python (può avere i valori True e False). La condizione di un'istruzione if è un valore Booleano.
Operatori booleani
Ci sono tre diversi operatori Booleani principali: and, or, not.
Legge di De Morgan
La legge di De Morgan spiega come negare una combinazione di and e or:
- not(A and B) è la stessa cosa di not(A) or not(B)
- not(A or B) è la stessa cosa di not(A) and not(B)
Cicli
Ciclo while
I cicli sono utilizzati per ripetere diverse volte lo stesso blocco di istruzioni a che una "condizione di ciclo" rimane vera (True). In Python, un ciclo esegue istruzioni fintanto che la condizione è vera. Per esempio:
balance = 10.0
TARGET = 100.0
year = 0
RATE = 5
while balance < TARGET:
year = year + 1
interest = balance * RATE/100
balance = balance + interest
Cicli controllati da un contatore
Un ciclo while controllato da un contatore conta il numero di ripetizioni effettuate e si ferma quando sono state completate un numero predefinito di iterazioni.
Cicli controllati da un evento
Un ciclo while controllato da una condizione che, prima o poi, diventa falsa. Il numero di iterazioni non è noto in anticipo.
Interruzione anticipata di un ciclo
Break
Se all'interno di un ciclo si inserisce l'istruzione break, il ciclo viene interrotto senza completare l'iterazione corrente, anche se non sono state fatte tutte le iterazioni necessarie. L'esecuzione continua con le istruzioni successive al ciclo.
Continue
Se all'interno di un ciclo si inserisce l'istruzione continue, non viene completata l'iterazione corrente. Il ciclo continua normalmente con l'iterazione successiva (senza terminare quella corrente).
Valori sentinella
Quando si legge una sequenza di input, spesso è necessario un metodo per indicare la fine della sequenza. Quando non si sa quanti elementi ci sono in una lista, si può utilizzare un carattere o un valore speciale per identificare l'ultimo della lista. Questo valore si chiama "sentinella", che identifica la fine dei dati ma non fa parte dei dati stessi. Ad esempio: Per input di numeri interi positivi, si può ad esempio usare 0 o -1.
Ciclo for
Il ciclo for...in serve a iterare su tutti i valori di un qualsiasi contenitore. Un contenitore è un oggetto (come una stringa) che può memorizzare un insieme di elementi. Python ha diversi tipi di contenitori:
- Una stringa è un contenitore di caratteri
- Una lista è un contenitore di valori arbitrari (numerici, stringhe, liste, ...)
- Un file è un contenitore di linee di testo
Contenitore range
È un contenitore speciale di una sequenza di numeri consecutivi. Si genera con la funzione range(N) che crea una sequenza di interi da 0 a N-1. Quindi un for con un range() è equivalente a un ciclo while controllato da un contatore.
Ciclare sull'indice e valore
La funzione enumerate trasforma un contenitore in una sequenza di coppie. Esempio:
for (indice, valore) in enumerate(nome):
Generazione numeri casuali
Python mette a disposizione un generatore di numeri casuali che produce numeri che sembrano casuali. I numeri sono in realtà pseudo-casuali. Sono infatti estratti da una sequenza di numeri non consecutivi che non si ripetono (a meno di continuare nella sequenza per molto tempo). Il generatore di numeri casuali si trova nel modulo random.
from random import randomLa funzione random() ritorna un numero compreso tra 0 e 1. Invece la funzione randint(a,b) ritorna un numero intero compreso tra a e b.
Funzioni
Le funzioni sono come "scatole nere": si passa alla funzione ciò che le serve per eseguire il suo compito e si ottiene il risultato. Una funzione è una sequenza di istruzioni a cui viene dato un nome. Si invoca (o chiama) una funzione per eseguire le sue istruzioni. Quando una funzione termina, il risultato ottenuto è restituito dalla funzione e può essere usato in un'espressione.
Argomenti
I valori che passiamo alle funzioni sono detti argomenti dell'invocazione di una funzione. Le funzioni possono ricevere diversi argomenti ed è anche possibile avere funzioni senza argomenti.
Passaggio dei parametri
Le variabili parametro (parametri formali) ricevono gli argomenti (parametri effettivi o parametri attuali) dell'invocazione della funzione. Gli argomenti possono essere il valore corrente di una variabile o un'espressione (funzione o lambda). La variabile parametro è dichiarata nella funzione invocata.
Parametri posizionali o nominali
Nella chiamata a funzione, gli argomenti possono venire associati alle variabili parametro in due modi:
- Positional parameters: associo la posizione del dato all'argomento. Il primo argomento passato andrà ad inizializzare la prima variabile parametro, il secondo la seconda, e così via (comportamento di default).
- Named parameters: uso il nome della variabile parametro per specificare a chi assegnare l'argomento.
Valori di default
Le variabili parametro possono avere dei valori di default, che vengono usati se, durante la chiamata, nessun argomento è assegnato a tale parametro. Ad esempio:
def complex(real = 0.0, imag = 0.0)
Liste di argomenti variabili
Viene utilizzata per permettere di passare un numero variabile di argomenti a una funzione (e non è associata ad un nome). Una lista di parametri di questo genere è sempre posizionale. La sintassi è *args nella definizione di funzione.
Restituzione dei valori
L' "output" che la funzione calcola è detto valore restituito. La funzione restituisce un solo valore. Se volessi restituire più valori, potrei aggirare la limitazione restituendo una lista o una tupla. Alcune funzioni non hanno bisogno di restituire alcun valore. L'istruzione return termina immediatamente la funzione e passa il valore di ritorno direttamente alla funzione che l'ha invocata. Tutte le diramazioni del flusso di esecuzione di una funzione devono restituire un valore, portando la funzione a incontrare un enunciato return.
Importare moduli
Alcune librerie sono disponibili per il download dal repository Python Package Index (PyPI).
pip install module
Realizzazione di una funzione
Per scrivere ("definire") una funzione bisogna:
- Scegliere un nome per la funzione
- Dichiarare una variabile per ogni argomento
- Mettere assieme tutte queste informazioni con la parola riservata def per formare la prima riga della definizione della funzione
L'istruzione def apre un nuovo blocco (compound statement), all'interno del quale scriveremo le istruzioni che compongono il corpo della funzione.
La funzione main
Quando si definiscono e usano funzioni in Python, è bene che tutte le istruzioni del programma si trovino all'interno di funzioni, indicandone una come punto di partenza dell'esecuzione. Qualsiasi nome può essere per il punto di inizio, ma si sceglie per convenzione 'main' siccome è un nome usato in altri linguaggi molto diffusi. Ovviamente, serve un'istruzione nel programma che invochi la funzione main.
In generale, l'invocazione della funzione main:
- Dovrebbe essere eseguita se il programma è in esecuzione in modalità standalone
- Non dovrebbe essere eseguita se il programma è importato, come modulo, in un programma più ampio. Bisogna controllare la variabile speciale __name__, che contiene il nome del modulo (o la stringa '__main__' se in modalità standalone)
if __name__ == '__main__':
# call the main function if we are running in standalone mode
# don’t call it if we are imported as a module
main()
Per evitare confusione, le variabili di sistema hanno nomi che iniziano e finiscono con doppio underscore. Sono detti nomi "dunder" (che sta per double-underscore).
Ambito di visibilità delle variabili
Le variabili possono essere dichiarate:
- Dentro una funzione: conosciute come 'variabili locali' e disponibili solo all'interno della funzione
- Fuori dalla funzione: talvolta detta 'variabile globale' e può essere usata e modificata in qualsiasi funzione.
Variabili globali
Sono variabili che sono definite all'esterno delle funzioni ed è visibile a tutte le funzioni. Qualsiasi funzione che voglia aggiornare una variabile globale deve includere una dichiarazione global.
Liste e tabelle
Liste
Una lista è una struttura dati versatile e dinamica, che contiene un numero variabile di elementi, di qualunque tipo, a cui si può avere accesso tramite la loro posizione (indice).
Creazione di una lista
Assegnare ad una variabile una nuova lista con l'operatore di indicizzazione [].
Accesso alle liste
Una lista è una sequenza di elementi, ognuno dei quali ha una posizione o indice che è un numero intero. Per accedere ad un elemento della lista, specificare quale indice si vuole usare attraverso l'operatore di indicizzazione (allo stesso modo in cui si accede ad un singolo carattere in una stringa). Gli indici partono da 0.
Differenze con le stringhe
Sia le liste che le stringhe sono sequenze e l'operatore [] viene usato per accedere ad un elemento in qualsiasi sequenza. Esistono due differenze fra liste e stringhe:
- Le liste possono contenere valori di ogni tipo, mentre le stringhe sono sequenze di caratteri.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.