Corso Base Di Python 3
Corso Base Di Python 3
By MIKE
Corso Base di Python 3
01: Introduzione e Installazione di Python 3.6
Dedico questa serie a tutti coloro che si stanno avvicinando per la prima volta al mondo
di Python, in quanto tratteremo fondamentalmente le basi del linguaggio e le metodologie
necessarie ad imparare a programmare in Python, utilizzando una terminologia semplice e
adatta proprio a tutti.
La prima domanda che mi viene posta quando parlo alla gente di Python e delle sue
mille virtù è: perché scegliere proprio questo linguaggio? Ad ogni conferenza o raduno, il
nome Python esce sempre fuori, accompagnato da acclamazioni calorose. Per
rispondere a questa domanda possiamo quindi dare uno sguardo alla pagina Wikipedia
del suo fondatore, l'olandese Guido Van Rossum
Come possiamo leggere, nel 1999 Van Rossum presentò un progetto chiamato
"Programmazione per tutti" al DARPA, ovvero l'agenzia americana per i progetti di ricerca
avanzata per la difesa, descrivendo Python come:
Col tempo Python è cresciuto, arrivando alla terza versione, diventando addirittura il
linguaggio di programmazione più popolare per svariati anni di fila, e attorno a lui è
cresciuta una gigantesca comunità di entusiasti e professionisti da ogni parte del
mondo! Questo anche perché grazie al suo parco librerie sconfinato, con la
programmazione Python è possibile fare davvero di tutto, ad esempio sistemi di
automazione, analisi del mercato finanziario e altre grosse moli di dati, creazione di
applicazioni, siti web e tanto tanto altro... e sopratutto è possibile fare tutto questo molto
velocemente e in maniera divertente!
Che vi troviate su un Mac, un computer con Windows o Linux poco importa: Python è
infatti pienamente supportato da tutti questi sistemi operativi. Per quanto io utilizzi in realtà
Linux come sistema operativo, almeno nei primi video di questa serie utilizzerò Windows
10, in modo da semplificare la vita a quelli di voi che utilizzano questo sistema.
Cliccate dunque su Download Python 3.7 e una volta scaricato il file, installatelo. Ora
disponete sul vostro computer di tutto il necessario per intraprendere questa fantastica
esplorazione di uno dei linguaggi più potenti di sempre. Cliccate su START e cercate
IDLE, e una volta trovato aprite questo programma. Questo interprete dei comandi si
chiama Shell Interattiva, ed è l'ambiente con cui prenderemo familiarità utilizzandolo passo
dopo passo per imparare costruendo.
Ricapitolando:
Benvenuti alla seconda puntata della serie di tutorial su Python 3.7! In questo episodio
daremo un'occhiata al funzionamento di IDLE e parleremo di Operazioni Numeriche con
Python 3.7.
La prima cosa che è importanti dire al riguardo di IDLE è che è costituita da due parti: una
shell interattiva, che è la prima parte che vi si presenta all'avvio, ed un editor testuale: per
aprire quest'ultimo cliccate su FILE / NEW FILE.
Per quanto all'aspetto possano apparire simili, queste due parti sono pensate per due
scopi differenti tra di loro.
La shell interattiva o interprete dei comandi, esegue le istruzioni una alla volta, riga per
riga, ed è pensata oltre che per effettuare semplici calcolazioni, per sperimentare ed
imparare cosa fanno le varie istruzioni di Python.
Scrivete:
print('Hello World!')
Non appena daremo INVIO, l'istruzione verrà processata e all'istante ci verrà restituito un
risultato:
'Hello World!'
In questo secondo capitolo ci concentreremo interamente sulla shell interattiva, per ora
potete quindi chiudere l'editor testuale.
Essendo pensata per sperimentare e effettuare semplici calcoli, con la shell di Python
possiamo effettuare Operazioni Numeriche. In Python queste sono dette Espressioni, e
sono formate da Valori e Operatori.
>>> 2 + 2
4
>>> 4 - 2
2
L'operatore per la divisione è lo slash avanti, quindi per fare 9 diviso 3 scriviamo:
>>> 9 / 3
3.0
>>> 3 * 3
9
Fate attenzione a non confondere questo l'operatore * con una x a meno che non stiate
andando a caccia di errori! 3 x 3 ci restituisce infatti un errore di sintassi
>>> 3 x 3
SyntaxError: invalid syntax
>>> 2 + 3 * 3
11
>>> (2 + 3) * 3
15
dandoci come risultato 15, perché stavolta la prima operazione ad essere stata svolta è la
somma (2 + 3).
In questi primi esempi abbiamo usato valori appartenenti al primo tipo di dato di Python:
l'Intero, o Integer.
I numeri non interi o in virgola mobile sono invece chiamati Float. Un esempio di Float è il
Pi Greco, che come sapete è approssimato a 3.14. Potete crearli utilizzando un punto al
posto della virgola(3.14 invece di 3,14), così come ottenete un Float effettuando divisioni
tra numeri interi, com'è successo nell'esempio precedente con 9 / 3, che ha restituito 3.0
Supponiamo di avere una variabile x e di assegnarle il valore 47;
>>> x = 47
Mediante la funzione type(), la shell interattiva ci consente di vedere che tipo di dato è
contenuto al suo interno:
>>> type(x)
class 'int'
Chiaramente ci riferisce che si tratta di un intero! Ma proviamo ora a cambiare il valore da
47 a 47.0
>>> x = 47.0
Controlliamo ora ancora una volta il tipo di valore mediante la funzione type():
>>> type(x)
class 'float'
Oltre alle quattro operazioni fondamentali, Python vi semplifica il lavoro coi numeri
permettendovi di effettuare calcoli esponenziali, quozienti e resti, ciascuno con un
operatore specifico. Per effettuare un calcolo esponenziale usiamo come operatore due
asterischi consecutivi: ad esempio 5 elevato 3 diventa:
>>> 5 ** 3
125
>>> 30 // 7
4
E infine possiamo ottenere il resto di una divisione utilizzando un operatore chiamato
Modulo, rappresentato dal simbolo della percentuale, ad esempio il resto di 30 / 7 si
ottiene con:
>>>30 % 7
2
Ricapitolando:
Operatori Numerici:
addizione: +
sottrazione: -
divisione: /
moltiplicazione: *
esponente: **
quoziente: //
resto: %
03: Variabili e Stringhe
Per cominciare, aprite la nostra ormai familiare Shell Interattiva IDLE e iniziamo subito!
Vi siete mai chiesti come facciano i vostri programmi a salvare valori nella memoria del
Computer e ad accedervi poi in un secondo momento? Questo avviene in parte per mezzo
di quelle che chiamiamo Variabili.
Potete pensare a una variabile come ad una scatola che puó contenere un singolo valore,
e l'inserimento del valore in questa "scatola", avviene tramite un processo
chiamato assegnazione.
>>> spam = 21
Con questo comando è come se aveste creato una scatola nella memoria del computer,
chiamandola spam. All'interno di questa scatola chiamata SPAM avete quindi depositato il
numero 21.
Fino a che lascerete la scatola li, senza metterci nient'altro dentro, potrete riaccedere al
valore assegnatole utilizzando il nome della scatola, quindi della variabile, come
collegamento al valore contenuto. Provate a scrivere il nome della variabile sulla Shell
Interattiva, e date invio:
>>> spam
21
Una volta che avete richiamato questa variabile, è possibile fare qualsiasi tipo di calcolo
sul valore ad essa assegnato, ad esempio:
>>> spam * 3
63
L'operazione spam * 3 ci restituisce il numero 63, che è il triplo del valore contenuto in
spam.
In Python ci sono delle regole per quanto riguarda i nomi che è possibile dare alle variabili:
questi infatti possono contenere solo lettere, numeri e underscore, ovvero il trattino
basso, ma non possono iniziare con un numero! Venire meno a queste regole comporta la
comparsa di errori di sintassi.
Proviamo a creare una variabile e ad usare come primo carattere del nome un carattere
numerico:
>>> 1esempio = 2
File "stdin", line 1
1esempio = 2
^
SyntaxError: invalid syntax
>>> esem-pio = 5
File "", line 1
SyntaxError: can't assign to operator
Tenete a mente che di norma è importante dare alle variabili nomi specifici, che ci
permettano di identificarne lo scopo all'interno del programma, facilitandone la lettura e la
semplicità complessiva.
Mentre studiate Python noterete che alle variabili vengono spesso assegnati nomi come
"spam", "eggs" oppure "bacon", per tributo a un famoso scatch di Monty Python, la serie
inglese che ispiró Van Rossum mentre era alla ricerca di un nome da dare al suo
linguaggio di programmazione. Se siete interessati a qualche altra curiosità riguardante il
linguaggio, potete dare uno sguardo a questo video Cinque Fatti e Curiosità su Python
Una delle caratteristiche più potenti delle variabili in Python è che potete riassegnarle
quante volte vi pare. Se fin'ora state immaginando le variabili come scatole a cui viene
dato un nome e su cui è possibile inserire un valore, potete anche immaginare che a
seconda del caso ci sia bisogno di inserirvi degli altri valori, giusto? Il discorso è in realtà
un pó più complesso di così ma ei, un passo alla volta no?
Un'altra caratteristiche molto importante che distingue Python da molti altri linguaggi di
programmazione, è che le variabili non sono di un tipo specifico: potete quindi assegnar
loro qualsiasi classe di valore vogliate.
Facciamo un esempio. Utilizzando la funzione integrata type() andiamo a vedere che tipo
di valore è presente nella variabile spam, che abbiamo assegnato prima:
>>> type(spam)
class 'int'
Proviamo ora ad assegnarle un valore appartenente al secondo tipo di dato di cui abbiamo
parlato fin'ora, ovvero un numero in virgola mobile...
>>> type(spam)
class 'float'
Come esempio, creiamo una variabile chiamata frase e inseriamoci dentro la stringa 'Una
volta imparato, Python si dimostra estremamente versatile' racchiusa tra singoli apici:
se ora andiamo ad effettuare un controllo con la funzione type()... notiamo che la classe di
dato contenuta nella variabile frase è appunto una stringa...
>>> type(frase)
class 'str'
Creiamo ora una seconda variabile chiamata frase2 e inseriamoci dentro la stringa
"Python è in assoluto il miglior linguaggio per chi sta iniziando a programmare", ma
stavolta includiamola tra doppi apici.
>>> frase2
'Python è in assoluto il miglior linguaggio per chi sta iniziando a
programmare'
Ma... come mai anche questa stringa ci viene restituita tra singoli apici quando noi
l'abbiamo scritta usando invece doppi apici? Questo semplicemente perché Python è stato
ideato in questa maniera, le stringhe vengono sempre restituite tra singoli apici.
Prendete nota di ció, e procediamo.
Per rigor di logica, ci sono alcuni caratteri che non possono essere inclusi direttamente
nelle stringhe, come ad esempio doppi apici in una stringa definita usando propri questi. In
questo caso ci troveremo quindi impossibilitati a fare ad esempio delle citazioni:
>>> "e Dante scrisse: "Nel mezzo del cammin di nostra vita...""
File "", line 1
"e Dante scrisse: "Nel mezzo del cammin di nostra vita...""
^
SyntaxError: invalid syntax
Per Python, è come se avessimo interrotto la stringa prima della sua stessa fine, e questo
fa si che ci restituisca un errore.
Per ovviare a questo problema possiamo utilizzare gli apici singoli per definire la stringa,
oppure utilizzare un backslash prima dei caratteri "scomodi". Riscriviamo ora la stessa
stringa di prima, ma impiegando i backslash:
>>> "e Dante scrisse: \"Nel mezzo del cammin di nostra vita...\""
'e Dante scrisse: "Nel mezzo del cammin di nostra vita..."'
Le stringhe possono inoltre essere concatenate tra di loro per ottenere delle "fusioni" di
testo:
Come notate gli spazi non sono inclusi automaticamente, a quello dovrete pensare voi!
Ricapitolando:
Benvenuti a questa quarta lezione della serie di lezioni dedicate alle basi di Python 3.6
In questo episodio parleremo di conversioni tra tipi diversi di dati e di due delle funzioni
integrate in Python più utilizzate, la funzione print() e la funzione input().
Una volta spiegati questi concetti scriveremo finalmente il nostro primo programma in
Python 3.6, utilizzando l'editor testuale integrato in IDLE.
Fin'oro abbiamo introdotto tre tipi di dato: Integer, Float e Stringhe: non abbiamo peró
spiegato come fare ad combinare questi tipi di dato differenti tra di loro. Come fare ad
esempio a combinare un numero intero con una stringa? magari state pensando di
utilizzare un operatore come il +, e in questo caso ci siete andati vicini... ma non è così
immediato!
Facciamo delle prove. Definiamo una variabile età e assegnamole un numero intero:
>>> età = 24
come forse alcuni di voi avranno sospettato, la Shell Interattiva ci restituisce un errore.
Python sa che state cercando di effettuare una somma tra tipi di dato diversi, e vi avverte
che l'operatore + non è compatibile per somme tra interi e stringhe. In sostanza vi avverte
che non può effettuare la conversione necessaria ad effettuare la somma, a meno che non
siate voi a chiederglielo in maniera esplicita.
Come chiedere quindi a Python di effettuare una conversione? Per fare questo esistono
delle funzioni integrate che fanno la conversione per noi. Per convertire un intero in
stringa usiamo la funzione str() Come per tutte le funzioni, le passiamo quello che viene
chiamato parametro tra le parentesi, nel nostro caso il parametro sarà la variabile età:
Come fare ora ad ottenere il numero totale di arance presenti in tre sacchi? Guardate cosa
succede se proviamo a moltiplicare la variabile per 3:
>>> arance_per_sacco * 3
'272727'
>>> int(arance_per_sacco) * 3
81
>>> float(età)
24.0
Bene, è arrivato il momento di introdurre quella che è forse la funzione più famosa nel
regno di Python, la funzione print(). Ciò che print() fa è mostrarci in output qualsiasi cosa
le passiamo...
Per andare a capo si utilizza il carattere newline, ovvero \n, in questo modo:
Print viene usata davvero ovunque, è raro trovare uno script in cui non sia presente
almeno una volta. Faremo degli esempi più complessi man mano che introdurremo nuovi
concetti.
>>> X = input()
23
>>> type(X)
class 'str'
Molto bene gente! entriamo nel cuore della lezione con la scrittura del nostro primo
programma! Per fare questo avremo bisogno dell'editor testuale di cui abbiamo parlato in
uno dei video precedenti, quindi cliccate su file/new file per aprirlo. Nota: per fare in modo
che il codice sull'editor testuale venga eseguito e passato alla Shell, dovete prima salvarlo
come file. Cliccate su file/save as; in questo caso lo salveremo come "esempio". I
programmi scritti in Python sono file di testo salvati con l'estensione py, quindi nel nostro
caso il file salvato sarà esempio.py.
Ora sta venendo processata la funzione input, quindi il programma si aspetta da noi un
valore... inseriamo il nostro nome...
Entra in gioco un'altra funzione print(), che combina stavolta anche il nostro nome...
Quindi ancora un'altra chiamata input, stavolta che ci chiede da se quanti anni abbiamo,
rispondiamo!
Ricapitolando:
Provare a combinare tipi di dato diversi tra loro porta spesso alla comparsa di errori
Per evitare questi errori dobbiamo spesso effettuare delle conversioni
Per effettuare conversioni usiamo le funzioni str(), int(), e float(), a cui passiamo il
valore o la variabile da convertire
La funzione print() ci mostra in output qualsiasi cosa le passiamo, e puó essere
impostata per output multiriga
La funzione input() ci permette di inserire e assegnare valori mentre il programma è
in esecuzione
05: Diagrammi Di Flusso, Logica Booleana e Operatori di Comparazione
Benvenuti alla quinta lezione della serie di Tutorial Python sulle Basi del Linguaggio!
Vengono delineati uno o più algoritmi, che sono, citando la pagina Wikipedia
dedicata "procedimenti per risolvere un determinato problema attraverso un numero finito
di passi elementari."
Un algoritmo tavolta puó essere molto complesso: in questi casi, per rappresentarne il
flusso di esecuzione e controllo da un punto di vista visivo, si utilizzano i Diagrammi di
Flusso. Un programmatore si rivolgerà spesso all'utilizzo dei diagrammi di flusso per poter
delineare e visualizzare in maniera logica ed esaustiva cosa il suo programma fa e quale
strategia adottare nella fase di scrittura vera e propria. In sintesi puoi pensare a questi
diagrammi come a una sorta di mappa che ti guida alla comprensione logica del tuo
problema, e quindi del tuo programma.
Uno degli esempi da manuale che viene spesso insegnato quando si inizia a parlare di
Diagrammi di Flusso è l'esempio del giorno di pioggia, ovvero si va a delineare quali
possibili azioni razionali si possano prendere qualora fuori stia piovendo e si voglia restare
asciutti! Andiamo ad analizzare questo scenario e proviamo a stilare i passi di un possibile
algoritmo:
Sta piovendo?
Se si, sta piovendo, ma disponiamo di un ombrello, possiamo decidere di
uscire di casa e affrontare le intemperie;
Se si, sta piovendo, ma non disponiamo di un ombrello, allora sarebbe
meglio restare in casa e aspettare che la pioggia passi, magari
controllando di tanto in tanto;
Se invece non sta piovendo possiamo uscire tranquillamente.
Per quanto la situazione presa ad esempio sia piuttosto semplice, ci rendiamo conto che
analizzarne logicamente tutti questi aspetti a voce potrebbe risultare confusionale, ed è
proprio qui che entrano quindi in gioco proprio i diagrammi di flusso. Le operazioni da
compiere sono rappresentate mediante figure geometriche(rettangoli, rombi etc...), e
ciascuna di esse ha uno scopo preciso.
Tenetevi
netevi forte perché la faccenda inizia a farsi davvero interessante...
interessante ora che abbiamo
spiegato che metodologia utilizzare per pensare da programmatore, possiamo iniziare a
pensare di rappresentare questi SI e NO all'interno dei nostri programmi in Python.
E per fare ciò parleremo ora di Logica Booleana: l'Algebra di Boole è quel ramo
dell'Algebra in cui non si utilizzano numeri ma solamente due valori detti Valori di
Verità(proprio ai Vero e Falso che usiamo nei nostri Diagrammi) e che mediante i suoi
Operatori permette di effettuare calcoli logici.
Gli altri tipi di dato di cui abbiamo parlato nei video precedenti, Interi, Float e Stringhe,
hanno un numero illimitatotato di possibili valori, purché questi rispettino le caratteristiche del
tipo: Il tipo di dato booleano invece come abbiamo detto, ha solo due valori possibili, e
questi sono True e False, in italiano Vero e Falso, che rappresentano sostanzialmente i
valori binari 0 ed 1.
True
False
Come per gli altri tipi di valore, anche i valori booleani possono essere assegnati
a variabili. Supponiamo di essere alle prese con la scrittura di un algoritmo che gestisca
l'ingresso di automobili all'interno di un garage; per far si che le macchine possano
entrare, il cancello dovrà essere aperto. In questo caso potremmo avere una variabile
chiamata cancello, a cui assegnamo il valore True qualora il cancello sia aperto,
permettendo così alla macchine di entrare, oppure False in caso contrario:
cancello = True
oppure
cancello = False
type(cancello)
class 'bool'
True e False sono il metodo utilizzato in Python per delineare Si e No dei diagrammi di
flusso; date uno sguardo a questo schema:
Operatori di Comparazione
Ovvero operatori che servono a comparare valori tra di loro, e che ci restituiscono sempre
risultati di natura booleana, quindi True o False. Se affermassi che 5 è uguale a 5,
potremo dire che quest'affermazione è Veritiera, quindi True, mentre se affermassi che 5 è
uguale a 6, l'affermazione sarebbe Falsa.
Facciamo alcuni esempi di utilizzo di questi operatori nella Shell Interattiva, in modo da
rendere più vivido il concetto e mettere a fuoco le idee:
>>> 5 == 5
True
>>> 5 == 6
False
>>> 23 < 50
True
>>> "ciao" != "arrivederci"
True
>>> X = 18
>>> X >= 16
True
>>> 33 = "33"
False
Vi consiglio di esercitarvi qualche tempo sugli operatori di comparazione per prenderci
dimestichezza: forniscono un'elasticità logica senza pari.
Operatore AND:
La logica dietro AND è che affinché un'espressione con questo operatore dia come
risultato True, entrambe le comparazioni devono risultare veritiere, in caso contrario
otterremo sempre un False. Tenendo un occhio sulla tabella di verità di and, scriviamo
sulla Shell degli esempi concreti utilizzando anche gli Operatori di Comparazione:
Nel caso di OR,, affinché il risultato sia True almeno una delle due comparazioni deve
restituire True e chiaramente, tutti i casi risultano veritieri eccetto l'ultimo, in cui entrambi i
valori sono falsi.
Parliamo ora dell'ultimo operatore booleano, il NOT, forse il più semplice da capire.
Se una comparazione risulta non Vera sarà chiaramente Falsa, e viceversa.
Ricapitolando:
Ciao a tutti ragazzi e ragazze e benvenuti a questa nuova lezione della serie di tutorial
Python dedicati alle basi!
Continueremo il discorso sulla gestione del flusso, parlando di tre istruzioni di controllo
molto importanti: if, elif ed else
else.
Per ricollegarci bene al discorso direi di ripartire dal diagramma di flusso analizzato
nella lezione precedente:
Come ricorderete si tratta di uno schema che illustra le possibili azione razionali che una
persona può prendere e in caso di pioggia, qualora il suo scopo sia restare asciutto.
Abbiamo imparato che i Si e No del diagramma sono rappresentati dai due unici valori del
tipo di dato booleano, ovvero True e False.
'Sei Maggiorenne'
Analizziamo da vicino i dettagli del funzionamento di questo programma, tramite la lettura
del suo diagramma di flusso:
Se la condizione "età >= 18" risulta veritiera, quindi SE il risultato di questa espressione
restituisce valore booleano True, il programma esegue questa porzione di codice e
restituisce la stringa "Sei Maggiorenne". Se invece la condizione fosse risultata falsa,
quindi se età avesse avuto un valore numerico inferiore a 18, il programma sarebbe
saltato direttamente alla fine del programma, ignorando questa porzione di codice.
età = 16
if età >= 18:
print('Sei maggiorenne')
run/run module:
(...)
età = 16
if età >= 18:
print('Sei maggiorenne')
Provate ad eseguire; come noterete Python si rifiuta di eseguire il codice perché non
correttamente indentato, perché non rispetta cioè i suoi standard di logica.
Apriamo ora una piccola parentesi per quanto riguarda gli errori: evitate assolutamente di
farvi scoraggiare dalla comparsa di errori! Sopratutto nella prima fase di apprendimento
è normalissimo ricevere tonnellate di messaggi di errore da Python, e questo a differenza
di ciò che qualcuno può pensare è un bene. Sbagliare è utile, perché significa infatti che
state imparando qualcosa! Tutti sbagliano, e i migliori fanno tesoro di ciascun errore
la vita gli ponga davanti per imparare. Come tutti i programmatori, se la shell vi
restituisce un messaggio che non riuscite a capire, semplicemente copiatelo e datelo in
pasto a Google, che si dimostrerà anche in questo caso un preziosissimo alleato,
garantito.
Come fare ad eseguire del codice selezionato qualora la condizione di controllo restituisca
invece False?
Per questo scopo ci viene in aiuto l'istruzione Else, traducibile in Italiano con "Altrimenti"
o "Diversamente".
Come vedete ora, se l'espressione restituisce un valore booleano False, viene eseguito un
altro blocco di codice prima che il programma finisca. Il blocco else è sempre l'ultimo ad
essere analizzato e eseguito solo se tutte le condizioni precedenti ad else sono risultate
false. Modifichiamo il nostro codice in maniera appropriata:
età = 16
if età >= 18:
print('Sei maggiorenne')
else:
print('Sei minorenne')
Eseguiamo:
'Sei minorenne')
...e come vedete, ora ci viene restituita la stringa "Sei minorenne" prima che il programma
finisca!
Fino a qui tutto bene, giusto?
Ci saranno dei momenti in cui i vostri programmi dovranno essere pronti a poter
fronteggiare più di due possibili strade... come un incrocio stradale un pó più complesso.
Per fare questo entra in gioco l'ELIF, che significa "Else IF", ovvero "altrimenti se..." che
come per magia vi permette di aggiungere tanti possibili blocchi di controllo quanti ne
avete bisogno. L'istruzione elif viene eseguita solo se la sua espressione di controllo
restituisce True e l'if o eventuali elif precedenti hanno restituito False.
età = 18
patente = False
In accordo con questo esempio, il diagramma di flusso potrebbe essere simile a questo:
Ricapitolando:
IF, ELIF ed ELSE sono forse le 3 istruzioni di controllo del flusso più importanti in
Python
L'Indentazione, ovvero l'aggiunta di spazio bianco all'inizio, è il metodo utilizzato in
Python per separare i vari blocchi di codice
L'Indentazione in Python è obbligatoria e non rispettarne le regole comporta la
comparsa di errori
IF è l'istruzione che ci consente di eseguire un blocco di codice associato SE
l'espressione di controllo analizzata restituisce valore booleano True
ELIF significa "else if" ed è l'istruzione che ci consente di definire tanti blocchi di
controllo quanti ne abbiamo bisogno: il codice associato a ciascun ELIF viene
eseguito se gli IF o ELIF precedenti restituiscono False mentre lui restituisce True
ELSE(altrimenti, diversamente) è l'ultima istruzione ad essere analizzata e viene
eseguita se tutte le espressioni condizionali precedenti sono risultate False
07: Il Ciclo While e le Istruzioni break e continue
Anche questa è una puntata dedicata alla gestione del Flusso: introdurremo infatti uno dei
due cicli di Python, il Ciclo While, e due nuove istruzioni associate ai
cicli, Break e Continue.
Nella puntata precedente abbiamo parlato dell'istruzione if: Affinché la porzione di codice
associata all'if venga eseguita la condizione espressa deve risultare True, e viene ignorata
se risulta invece False. Un ciclo While è simile da questo punto di vista: la grandissima
differenza sta nel fatto che stavolta la porzione di codice viene eseguita più e più
volte, fintanto che la condizione richiesta resta True. Una volta che la condizione
restituisce valore False, il ciclo viene interrotto. La parola "while" puó essere tradotto in
italiano proprio come "finché" o "mentre".
Ho preparato due esempi, uno con if e uno con while: la condizione di innesco necessaria
affinché il codice venga eseguito è la stessa in entrambi i casi:
contatore = 0
if contatore <= 10:
print(contatore)
contatore = contatore + 1
contatore = 0
while contatore <= 10:
print(contatore)
contatore = contatore + 1
>>> 0
IF controlla se all'interno della variabile contatore è presente un valore minore o uguale a
10... e visto che la condizione risulta True ci viene restituito il valore della variabile
contatore. Viene quindi sommato 1 al contenuto di contatore, e in fine il programma
termina, comporta esattamente come abbiamo studiato fino ad ora nelle lezioni
precedenti.
>>> 0
1
2
3
4
5
6
7
8
9
10
Questo si ripete fintanto che la condizione risulta True, cioé fino a che in contatore non è
presente un valore superiore a 10... caso in cui il ciclo while viene appunto interrotto.
while 15 == 15:
print('ciclo infinito!!!')
Eseguiamo...
'ciclo infinito!!!'
'ciclo infinito!!!'
'ciclo infinito!!!'
'ciclo infinito!!!'
'ciclo infinito!!!'
'ciclo infinito!!!'
'ciclo infinito!!!'
'ciclo infinito!!!'
'ciclo infinito!!!'
'ciclo infinito!!!'
(...)
Per quanto questo infinite loop non sia un errore del linguaggio di programmazione ma
anzi, si dimostri estremamente utile, qualora vi troviate ad averne innescato uno per
errore, volendo bloccarlo vi basterà cliccare CTRL-C.
Per proseguire, come abbiamo accennato a inizio lezione, ci sono due istruzioni correlate
al ciclo while di cui andremo ora a parlare, e sono l'istruzione break e l'istruzione continue.
L'istruzione break serve per terminare un ciclo while prematuramente: non appena
quest'espressione viene letta e processata all'interno del ciclo, ció che Python fa è
bloccare il loop istantaneamente.
contatore = 0
while True:
print(contatore)
contatore += 1
if contatore > 10:
print('Sto uscendo dal loop!')
break
L'espressione "contatore += 1" è una versione abbreviata di contatore = contatore +1...
prendetene nota perché come notate vi fa risparmiare parecchi caratteri, e alla lunga,
tempo! Una volta che nel contatore è presente il numero 10, quando al ciclo successivo
viene aggiunto un 1 portandolo ad 11, la condizione espressa dall'IF diventa TRUE e
viene così processato il BREAK, che blocca il loop infinito all'istante.
Facciamo un esempio:
contatore = 0
while contatore < 10:
contatore += 1
if contatore == 3:
print('saltato')
continue
print(contatore)
Le istruzioni presenti nel ciclo While vengono eseguite fino a che la condizione di
controllo resta True
È possibile interrompere un ciclo infinito tramite la combinazione di tasti CTRL-C
L'Istruzione Break viene adoperata per interrompere un ciclo prematuramente
L'Istruzione Continue viene usata per saltare un ciclo e far riiniziare il loop dall'inizio
08: Il Ciclo For e la Funzione range()
Il Ciclo For viene utilizzato praticamente per gli stessi compiti per cui viene utilizzato il
Ciclo While di cui abbiamo parlato nella lezione precedente, con questo voglio dire che
potete spesso ottenere lo stesso risultato adoperando entrambi i Cicli, ma le differenze nei
meccanismi di funzionamento ne rendono preferibile uno rispetto all'altro a seconda del
contesto in cui vi trovate.
A livello logico, la differenza col Ciclo While è che invece di eseguire la porzione di codice
interessata fintanto che la condizione di controllo resta True, il ciclo For esegue questa
fetta di programma un numero specifico di cicli. Qui di seguito è presente uno dei
programmi che abbiamo scritto nella lezione precedente, che come bene ricorderete ci da
in output tutti i numeri tra 0 e 10:
contatore = 0
while contatore <= 10:
print(contatore)
contatore = contatore + 1
0
1
2
3
4
5
6
7
8
9
10
Abbiamo ottenuto lo stesso risultato ottenuto col ciclo while, ma utilizzando stavolta solo 2
righe di codice invece di 4. Bella comodità non trovate? Eppure sono certo che in molti tra
voi si staranno chiedendo: che diavolo è quella funzione range() e come mai le ho passato
11 invece di 10, e sopratutto, allora, com
com'è
'è che funziona questo benedetto Ciclo For?
Quello che la funzione range() fa è impostare un intervallo di numeri tanto ampio quanto il
numero che le passiamo come parametro, senza peró includere il numero passato in se.
Siccome di default range inizia a contare da a partire da 0, per comodità potete pensare
per il momento a questo intervallo come a una sorta di elenco o lista di numeri, in questo
caso 11 elementi, da 0 a 10 inclusi.
Come abbiamo detto, a differenza del ciclo while, il ciclo for esegue la sua porzione di
codice un numero preimpostato di volte, giusto? L'intervallo di range() corrisponde al
numero di iterazioni che verranno eseguite, ovvero al numero di volte che il ciclo for verrà
processato.
Ora che
e abbiamo imparato come funziona un ciclo for e a cosa serve range(), vediamo un
pó come poter ottenere il massimo da questa funzione, in quanto dovete sapere
che possiamo passarle ben 3 parametri
parametri.
Questo ci permette di impostare oltre a un punto di inizio dell'intervallo anche un punto di
fine personalizzato, e un passo di avanzamento.
La differenza più grossa è che stavolta il passo dell'intervallo è due, quindi si passa da 3 a
5, da 5 a 7 e da 7 a 9. Come al solito il numero finale dell'intervallo viene saltato.
Grazie alla possibilità di personalizzazione della funzione range(), possiamo anche fare in
modo di ottenere i numeri al contrario... ad esempio al contrario dal 10 all'1...
Ricapitolando:
A differenza del ciclo while, il ciclo for viene eseguito un numero di volte
preimpostato
La funzione range() ci permette di impostare il numero di volte che il ciclo for viene
eseguito
Alla funzione range() è possibile passare tre parametri, START, STOP e STEP
09: CheckPoint: Costruiamo una Calcolatrice con Python
Benvenuti a questa nona lezione della nostra serie dedicata alle Basi di Python 3!
Questa è una puntata un pó diversa dalle altre, come da titolo si tratta di un episodio "checkpoint",
ovvero un episodio in cui faremo il punto della situazione su ciò che abbiamo appreso fin'ora,
mediante la costruzione di una semplice calcolatrice.
Vi fará piacere sapere che se avete seguito questa serie fino a questo punto, disponete ora di tutti gli
strumenti necessari per poter scrivere questo programma... utilizzeremo infatti:
while True:
print('''
Benvenuto al programma calcolatrice!
Creata da: Mike
Di seguito un elenco delle varie funzioni disponibili:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'''
)
break
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'''
)
continue
else:
print('''Grazie e arrivederci!
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'''
)
break
Ti stai forse chiedendo: "come mai non ha usato una funzione?" tranquillo, ne parleremo nelle
prossime lezioni! ;)
10: I Moduli della Standard Library
Ciao a tutti brava gente e benvenuti a questa decima puntata della nostra serie dedicata
all'apprendimento delle basi di Python 3.6.
Ciascun programma che scrivete in Python puó includere un set di istruzioni integrate,
come ad esempio la funzione print() e la funzione input() che abbiamo utilizzato nei
programmi scritti fin'ora. In aggiunta a queste funzioni Python dispone di un insieme
di Moduli in quella che viene chiamata la Standard Library.
La Standard Library contiene decine e decine di moduli, e ciascun modulo contiene a sua
volta tantissime funzioni... date uno sguardo a questa pagina del sito della Python
Foundation per farvi un'idea di quanto sia sconfinato il suo potenziale...
Prima di potere utilizzare queste funzioni all'interno dei vostri programmi dovrete importare
questi moduli, e il modo più comodo per fare ciò è utilizzare il comando import da
scrivere in cima al programma.
import random
for numero in range(10):
valore = random.randint(1,50)
print(valore)
Ciò che ho appena fatto è stato quindi anzitutto importare il modulo chiamato
random mediante il comando import. Quindi ho utilizzato la funzione randint del modulo
random per associare alla variabile valore un numero casuale ad ogni ciclo di FOR,
compreso tra 1 e 50. Testiamo il programma mandandolo in esecuzione...
7
27
22
9
19
11
31
4
36
32
C'è un'altra tipologia di import che può essere utilizzata per importare solo uno funzione
specifica di un modulo, facciamo un esempio con la funzione sqrt del modulo math, che si
occupa di effettuare radici quadrate.
Quando importate una funzione in questa maniera, come vedete non è necessario ripetere
il nome del modulo di provenienza.
>>> sqrt(25)
5.0
Potremo in questo modo richiamare tutte le funzioni matematiche incluse nel modulo
math... ma sopratutto se state pensando di lavorare ad un progetto importante e vasto, è
decisamente meglio utilizzare la prima o la seconda modalità che vi ho spiegato.
Esiste inoltre un sistema che ci consente di installare moduli che non fanno parte della
standard library, e questo tramite il programma PIP, di cui già disponete perché integrato
nel pacchetto di installazione di Python. Ma di PIP e di come fare per installare Moduli
esterni parleremo più avanti!
Ricapitolando:
Uno dei concetti comuni a tutti i linguaggi di programmazione è il concetto di riutilizzo del
codice.
Fin'ora abbiamo visto alcune delle possibili metodologie applicabili per rendere il codice
scritto riutilizzabile, ovvero i cicli di controllo e l'utilizzo di moduli e funzioni della Standard
LIbrary.
L'idea dietro al concetto di funzione è quella di assegnare una porzione di codice e delle
variabili chiamate parametri ad un nome, e mediante questo nome che funge da
collegamento potete richiamare tutto il codice associato.
In una scala di molto ridotta il concetto è simile a quello di variabile che abbiamo visto
nella lezione numero 3.
Per lo stesso motivo per cui quando scrivete un programma e lo salvate in modo da
eseguirlo in un secondo momento, potete pensare alle funzioni come a dei mini
programmi all'interno dei nostri programmi, che chiamiamo ogni volta dobbiamo
utilizzare le funzionalità associate.
Le funzioni sono fantastiche quindi per fare in modo di ridurre il numero di volte che un
pezzo di codice deve essere scritto in un programma.
Per definire una funzione utilizzate la parola chiave def, che informa istantaneamente
Python di ciò che stiamo facendo, seguita dal nome che volete dare a questa funzione.
Cercate di dare sempre dei nomi che siano rappresentativi dello scopo della funzione.
Il nome viene seguito da una coppia di parentesi, e all'interno delle parentesi metteremo i
parametri, ovvero delle variabili necessarie al funzionamento della funzione. Ma non tutte
le funzioni necessitano di parametri, in questo primo esempio lasceremo le parentesi
vuote.
def print_tre_volte():
print('Ciao!')
print('Ciao una seconda volta!')
print('Ciao una terza volta!')
Seguendo la logica di Python, il codice che viene inserito all'interno della funzione deve
essere Indentato.
All'interno della funzione potete aggiungere tutto il codice che vi pare... le combinazioni
sono infinite.
Se ora andiamo ad eseguire questo codice... F5... ci rendiamo conto che non succede
ancora niente. Come mai?
Per eseguire la funzione dobbiamo richiamarla, e per fare una chiamata alla funzione
possiamo semplicemente utilizzare il suo nome, all'interno della Shell Interattiva, o
direttamente dall'editor testuale.
print_tre_volte()
def print_tre_volte():
print('Ciao!')
print('Ciao una seconda volta!')
print('Ciao una terza volta!')
print_tre_volte()
Definiamo una funzione sommatrice a cui passeremo due numeri e che ci restituirà la
somma tra i due:
def sommatrice(a,b):
print('Questa è la funzione somma.')
print('Fornisce la somma di due numeri passati come parametri.')
risultato = a + b
print('Il risultato della somma è ' + str(risultato))
sommatrice(15, 5)
L'argomento è il nome che viene dato al valore passato per essere depositato nella
variabile parametro. Quindi i parametri in questo caso sono a e b, e gli argomenti dei
parametri 15 e 5.
Non ci sono dei limiti al numero di parametri che è possibile passare, ma badate di
sceglierli sempre con cura e di dargli anche in questo caso dei nomi specifici. Talvolta ci
troveremo in una situazione in cui è necessario avere dei parametri opzionali alle nostre
funzioni, ovvero fare in modo che queste funzionino con o senza l'aggiunta di valori in
questi specifici parametri. Per rendere questo possibile, a questi parametri è associato
sempre un valore di default.
Immaginate che stiate andando a comprare un laptop nuovo. Due caratteristiche da tenere
sott'occhio sono sicuramente RAM e modello della CPU, che quindi sceglieremo. Come vi
sarà capitato, vi viene chiesto se volete acquistare anche un pacchetto antivirus, e voi
potete scegliere se lo volete oppure meno.
>>> laptop_nuovo("16gb","i7")
Il nuovo laptop avrà le seguenti caratteristiche:
ram: 16gb
cpu: i7
Vorrei ora che però prestasse attenzione ad un dettaglio. Nella nostra funzione
sommatrice, per fare in modo di mandare in output il risultato della somma abbiamo
utilizzato una seconda funzione, ovvero la funzione print, a cui abbiamo passato il risultato
dell'operazione. Proviamo a togliere tutti i print e lasciare solo la variabile risultato...
sommatrice(3, 3)
In questo caso la funzione ha passato alla Shell un tipo di dato nullo, il None Type.
Per fare in modo che la nostra funzione restituisca il risultato in maniera autonoma
dobbiamo utilizzare il comando return.
def sommatrice(a,b):
risultato = a + b
return(risultato)
sommatrice(3, 6)
9
Ricapitolando:
Fin'ora abbiamo detto che possiamo immaginare le variabili come delle scatole in cui
depositiamo dei valori.
Possiamo quindi richiamare e modificare questo valore utilizzando il nome della variabile.
x = 3
x += 1
x
4
Abbiamo inoltre parlato di funzioni, e abbiamo visto che anche qui possiamo e siamo
incoraggiati ad utilizzare le variabili: si tratta di uno degli elementi indispensabili di Python
e della programmazione in generale.
Ma fino a dove ci possiamo spingere nell'utilizzo delle variabili? Fino a che punto è
davvero possibile utilizzarle e modificarle nei nostri programmi? Per rispondere a queste
domande andremo ora ad approfondire il tema parlando di Variabili Globali e Variabili
Locali.
x = 15
def funzione_esempio():
return(x)
print(funzione_esempio())
15
Proviamo peró ora a modificare leggermente la nostra funzione... diciamo che vogliamo
aggiungere 2 al 15 presente in "x".
x = 15
def funzione_esempio():
x += 2
return(x)
print(funzione_esempio())
>>>UnboundLocalError: local variable 'x' referenced before assignment
Come mai abbiamo ottenuto questo errore? Python ci informa del fatto che ci stiamo
riferendo a una variabile prima di averla dichiarata e assegnata... eppure nell'esempio
precedente tutto ha funzionato a meraviglia e la variabile x è proprio li!
Potete pensare a questi due ambienti come a dei contenitori distinti in cui vengono definite
e assegnate le variabili, un contenitore Globale e un contenitore Locale. Quando uno di
questi contenitori viene distrutto, quindi quando uno di questi ambiti viene distrutto, lo
stesso accade per i valori delle variabili in esso salvate che vengono quindi dimenticati.
Un Ambito Locale viene creato ogni volta che una funzione viene chiamata, e distrutto
dopo che la funzione restituisce un valore con return. È come se ogni volta che una
funzione viene processata, Python le fornisse un contenitore e le dicesse: bene, metti le
tue variabili e il tuo codice quà dentro. Le variabili dichiarate all'interno di qualsiasi
funzione, quindi dell'Ambito Locale della funzione, sono chiamate Variabili Locali.
Possono esistere quindi tanti Local Scope quante funzioni abbiamo in esecuzione.
Dall'altro lato invece, esiste e può esistere un unico Ambito Globale, che viene creato
automaticamente da Python all'avvio del programma e distrutto alla chiusura del
programma. È l'ambito principale: tutte le variabili che vengono dichiarate all'esterno di
una funzione sono chiamate proprio Variabili Globali, e restano pertanto in vita dall'avvio
alla chiusura del programma principale.
È possibile accedere alle Variabili Globali da qualsiasi parte del programma, mentre è
possibile accedere alle Variabili Locali solamente dall'Ambito Locale della funzione in cui
sono contenute.
Nel nostro esempio, x è proprio una variabile Globale, e otteniamo un errore perché
seppur è vero che un Ambito Locale può accedere alle variabili del Global Scope, il loro
utilizzo all'interno della funzione è limitato.
Ad esempio per poter modificare il valore di una Variabile Globale dall'interno di una
funzione, come abbiamo provato a fare con la nostra x, dobbiamo prima dichiarare alla
funzione le nostre intenzioni mediante l'istruzione global. Andiamo a modificare l'esempio
precedente...
x = 15
def funzione_esempio():
global x
x += 2
return x
print(funzione_esempio())
17
Ed ecco che ora ci è possibile modificare il valore della variabile x, perché Python sa che
ci stiamo riferendo alla x presente nell'Ambito Globale!
Un altro modo per poter utilizzare il valore di una Variabile Globale in maniera più
complicata all'interno di una funzione è creando una Variabile Locale a cui assegnamo il
valore della Variabile Globale. Potremo quindi poi modificare la nostra nuova Variabile
Locale, aggirando così la limitazione.
Tenete a mente che volendo potete dare a questa nuova Variabile Locale anche lo stesso
nome della Globale, perché Python le distinguerà comunque come variabili differenti per
via dell'ambito di provenienza.
x = 15
def funzione_esempio():
y = x
y += 2
return y
print(funzione_esempio())
17
Come accennato inoltre, al contrario delle Globali, è possibile accedere alle Variabili Locali
solamente dall'Ambito Locale della funzione in cui sono contenute, quindi non è possibile
accedervi dal global scope o dal local scope di un'altra funzione... otterremo un errore
qualora provassimo a forzare questa regola. Ad esempio:
def mia_funzione():
spam = 24
print(spam)
eggs = spam + 6
>>> NameError: name 'spam' is not defined
Potete utilizzare le variabili di una funzione solo se queste ci vengono passate dal return
della funzione... ad esempio facciamo una piccola modifica:
def mia_funzione():
spam = 24
return spam
eggs = mia_funzione() + 6
print(eggs)
30
Ed ecco che ora possiamo effettuare una somma con spam dall'ambito principale del
programma.
È bene imparare la distinzione tra Ambito Locale e Ambito Globale perché si tratta di
concetti estremamente importanti.
L'esistenza degli ambiti è utilissima ad esempio per ridurre il numero di bug e aumentare
la robustezza dei programmi!
Pensate a che caos se in un programma complesso tutte le variabili fossero globali, e per
colpa di un errore in una della tante funzioni del programma i valori delle variabili fossero
perennemente sballati, causando un crash sistematico.
Inoltre restando in memoria fino alla fine del programma, in programmi complessi le
Variabili Globali sono sinonimo di pesantezza e spreco di risorse.
Ricapitolando:
Esistono due ambienti distinti in cui vengono salvati codice e variabili, l'Ambito
Locale e l'Ambito Globale
L'Ambito Globale è il principale, creato all'avvio del programma e distrutto solo alla
sua chiusura
Le Variabili definite nell'Ambito Globale sono chiamate Variabili Globali
L'Ambito Locale è quello interno a una funzione, viene creato quando la funzione è
chiamata e distrutto al return
Le Variabili definite nell'Ambito Locale sono chiamate Variabili Locali
È possibile accedere alle Variabili Globali da qualsiasi parte del programma, mentre
è possibile accedere alle Variabili Locali solamente dall'Ambito Locale della
funzione in cui sono contenute
L'utilizzo di Variabili Globali è generalmente sconsigliato per evitare bug e
preservare la robustezza del programma
13: A prova di crash - Come gestire gli Errori
Ciao a tutti e benvenuti a questa tredicesima lezione della serie dedicata alle basi di
Python 3!
Come il titolo vi avrà suggerito, questa è una lezione dedicata alla gestione intelligente e
produttiva degli errori che si possono verificare durante l'esecuzione dei nostri programmi.
Parlando di errori mi riferisco in realtà a quelle eccezioni che quando si manifestano,
comportano il crash del programma e l'interruzione istantanea dell'esecuzione del codice.
Un'eccezione tipica è quella che si manifesta quanto proviamo ad effettuare una divisione
per zero, che restituisce appunto un ZeroDivisionError:
>>> 3/0
ZeroDivisionError: division by zero
>>> z * 5
NameError: name 'z' is not defined
Questi messaggi di errore sono piuttosto comodi per noi sviluppatori, prima di tutto
per risolvere i vari bug che inevitabilmente si presentano. Inoltre il livello di dettaglio che
ci viene fornito da Python è davvero impressionante se paragonato a tanti altri linguaggi di
programmazione, e questo è uno dei tantissimi vantaggi del linguaggio più bello del
mondo. Anche molti moduli vengono ideati e pubblicati con un certo livello di dettaglio nel
caso si manifesti un'eccezione.
È importante gestire questi errori perché oltre a causare il crash del programma sono
esteticamente poco gradevoli e incomprensibili sopratutto a chi sta utilizzando un
programma scritto da qualcun'altro.
Per gestire queste eccezioni utilizziamo due istruzioni utilissime: try ed except, che
significano "prova" e "eccetto" o "a accezione di".
Volendo potete immaginarli un pò come degli if / else ideati per la gestione delle eccezioni.
Il codice inserito nel try verrà eseguito qualora tutto andasse come pianificato, senza
errori,mentre il codice inserito nell'except verrà eseguito solamente qualora si verifichi
l'errore ad esso associato.
Uno dei momenti in cui le istruzioni try ed except risultano quasi indispensabili è proprio
quando si richiede all'utente di introdurre dei valori.
def moltiplicatore():
a = int(input('Inserisci il valore di a: '))
b = int(input('Inserisci il valore di b: '))
risultato = a * b
print(risultato)
>>> moltiplicatore()
Inserisci il valore di a: asd
Abbiamo ottenuto un ValueError, ovvero un errore di valore, perché la funzione int() non è
in grado, ovviamente, di convertire la stringa "asd" in un numero intero.
def moltiplicatore():
try:
a = int(input('Inserisci il valore di a: '))
b = int(input('Inserisci il valore di b: '))
risultato = a * b
print(risultato)
except ValueError:
print('Hey amico! solo caratteri numerici, grazie!')
E rieseguiamo il tutto...
>>> moltiplicatore()
Inserisci il valore di a: asd
Hey amico! solo caratteri numerici, grazie!
Quindi qualora siate in fase di progettazione di un programma, e notate che ci sono delle
eventualità in cui, per quanto il programma sia ben strutturato, si arriva comunque a dei
crash, come appunto in questi casi presentati, semplicemente copiate il nome dell'errore e
usatelo assieme ad except per poter gestire questa eccezione. Così facendo il programma
avrà tutto un altro livello di professionalità!
Un'altra istruzione di cui è bene parlare è l'istruzione finally, traducibile in questo caso
come "alla fine" o "infine".
Come il nome stesso suggerisce, il codice definito nel blocco di finally verrà eseguito alla
fine del programma, qualsiasi cosa succeda, ovvero che si manifesti un errore oppure no.
Andiamo a modificare la nostra funzione moltiplicatore():
def moltiplicatore():
try:
a = int(input('Inserisci il valore di a: '))
b = int(input('Inserisci il valore di b: '))
risultato = a * b
print(risultato)
except ValueError:
print('Hey amico! solo caratteri numerici, grazie!')
finally:
print('Grazie per aver utilizzato questa applicazione!')
E proviamo ad eseguirla facendo apparire sia l'eccezione che no: Come vediamo, la
stringa 'Grazie per aver utilizzato questa applicazione!' viene mandata in output qualsiasi
cosa succeda!
Ricapitolando:
Per quanto utili in fase di sviluppo, gli errori sono scomodi e causano il crash del
programma
Possiamo gestire questi errori mediante l'utilizzo delle istruzioni try ed except
Il codice nel blocco di except viene eseguito solo in caso un errore si manifesti
Mediante l'istruzione finally possiamo delineare del codice che verrà eseguito
qualsiasi cosa succeda
14: Liste e Tuple
Come da titolo, in questa puntata introdurremo due nuovi tipi di dato in Python, le Liste ed
i Tuple,, che sono simili tra loro ma allo stesso tempo molto diversi. Capirete cosa intendo
a breve.
N.B. In questa lezione, e in generale durante tutto il corso, mi riferisco al tipo di dato
"Tuple" utilizzando la versione al maschile "i Tuple". È però necessario precisare che in
Italia ci si riferisce a questo tipo di dato al femminile col nome "Tupla", quindi si dice
spesso "Le Tuple". La versione "i Tuple" da me utilizzata è quindi in verità più di matrice
inglese. Tenete questo bene a mente, e proseguiamo con la lezione!
Le Liste sono un tipo di dato che contiene al suo interno un insieme di dati uguali o diversi
tra di loro, ordinati in base ad un indice proprio della Lista.
Così come una Stringa viene definita utilizzando apici o doppi apici, una Lista viene
definita utilizzando una coppia di parentesi quadre.. Gli elementi della Lista vengono
quindi separati tra loro da delle
e virgole.
Per ottenere in output la lista completa di tutti gli elementi, anche qui, come visto per gli
altri tipi di dato studiati fin'ora, ci basta semplicemente utilizzare il nome della variabile:
>>> elenco
[2, 5, 'bacon', 3.14, 'eggs']
Abbiamo detto che gli elementi sono ordinati in base ad un indice proprio di ciascuna
Lista: ciò significa che a ciascun elemento è associato un numero che ne rappresenta la
posizione nell'elenco. Questo è fondamentale se vogliamo richiamare un elemento
specifico, avremo infatti bisogno del suo indice corrispondente in modo da potervi
accedere in maniera rapida e precisa.
Badate bene che il primo valore della Lista ha sempre come indice 0.
Quindi in questo caso 2 avrà indice 0, 5 avrà indice 1, 'bacon' avrà indice 2 e così via...
elenco[2]
'bacon'
elenco[4]
'eggs'
Se utilizziamo invece un indice negativo possiamo accedere agli elementi della lista dalla
fine all'inizio, utilissimo ad esempio in caso di Liste particolarmente lunghe. L'ultimo
elemento ha indice -1, il penultimo -2 e così via..
elenco[-2]
3.14
Creiamo una nuova Lista... facciamo stavolta una Lista di soli numeri magari:
primi = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
>>> primi[4:10]
[11, 13, 17, 19, 23, 29]
Quella che vedete è di fatto una nuova Lista creata a partire dalla Lista dei Numeri Primi, e
volendo possiamo associare questa nuova Lista a una variabile:
fetta = primi[4:10]
>>> fetta
[11, 13, 17, 19, 23, 29]
Come forse alcuni di voi avranno notato, questo sistema di suddivisione a fette funziona
un pò come la funzione range() vista nella lezione 8: l'ultimo elemento del Range non
viene incluso nella nuova lista creata.
Possiamo impostare questo indice variabile anche in modo da farlo iniziare, o terminare,
con l'inizio oppure la fine della lista, utilizzando due punti:
Per ottenere tutti i numeri dal 5o all'ultimo nella nostra lista possiamo fare:
>>> primi[4:]
[11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
Parallelamente possiamo inoltre ottenere tutti gli elementi a partire dal primo fino ad una
soglia da noi scelta in questo modo:
>>> primi[:5]
[2, 3, 5, 7, 11]
Tornando a fare un'analogia con range(), abbiamo visto che questa funzione è utilissima in
combinazione con i cicli For.
ad esempio:
0
1
2
3
4
Allo stesso modo possiamo utilizzare i For Loop con le stringhe... ad esempio,
considerando la lista di numeri primi utilizzata in precedenza:
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
Possiamo quindi creare Liste a partire dalla funzione range() mediante la funzione di
supporto list(), che converte elementi in Liste, ad esempio:
richiamiamola:
>>> lista_numerica
[99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
127,
128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141,
142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155,
156,
157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170,
171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184,
185,
186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213,
214,
215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228,
229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242,
243,
244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257,
258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271,
272,
273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286,
287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299]
Ed ecco a noi tutti i numeri tra 99 e 299, che possiamo ora utilizzare per effettuare i calcoli
più disparati.
Questo tipo di dato è così flessibile che una Lista puó contenere al suo interno anche una
o più liste:
Chiaramente per ottenere questa sottolista ci basta richiamarla con l'indice corrispondente
all'interno della Lista contenitore:
>>> lista_multipla[-2]
[1, 2, 3, 4, 5]
>>> lista_multipla[-2][-1]
5
Utilizzando gli indici possiamo anche sostituire un elemento della Lista! ad esempio se
volessimo sostituire la parola "bacon" con la parola "pancetta" potremo fare:
E per eliminare un elemento dalla Lista utilizziamo del. Volendo eliminare tutta la sottolista
possiamo fare:
Vi invito a testare i limiti di queste istruzioni esercitandovi, perché si possono fare davvero
tante cose utilissime.
Come le liste si tratta di un gruppo, un insieme di elementi, definiti stavolta utilizzando una
coppia di parentesi tonde, oppure senza alcuna parentesi:
tupla
(2, 4, 9, 15, 23)
>>> tuple2 = 7,8,9
tuple2
(7, 8, 9)
Possiamo accedere agli elementi del Tuple utilizzando l'indice anche stavolta:
>>> tupla[0]
2
Ma la più grande differenza è che una volta creati, i Tuple NON si possono modificare,
come invece accade per le Liste.
Vorrete quindi utilizzare un Tuple invece di una Lista in quelle situazioni in cui è molto
importante che un elenco sia immutabile, e tenete a mente anche che l'iterazione
all'interno di un Tuple avviene molto più velocemente che in una Lista, e questo è un bel
punto a vantaggio dei Tuple.
Ricapitolando:
Le Liste sono un tipo di dato che contiene svariati valori, anche tutti diversi tra di
loro
Per accedere ai valori delle Liste possiamo usare il sistema di indicizzazione della
Lista
L'indice parte da 0, e si possono usare numeri negativi per accedere dalla fine
all'inizio
Si puó inoltre impostare un intervallo utilizzando i due punti per l'inizio o la fine del
range
L'indice si usa inoltre per sostituire un elemento, o eliminarlo con l'istruzione DEL
I Tuple sono anch'essi degli elenchi di valori indicizzati, ma una volta creati sono
immutabili
15: Similarità tra Liste e Stringhe
In questa lezione continueremo a parlare del nuovo tipo di dato introdotto nella lezione
precedente, le Liste, facendo un confronto necessario con un altro tipo di dato studiato
nelle puntate precedenti, le Stringhe.
Come abbiamo già visto è possibile effettuare delle concatenazioni tra queste stringhe
utilizzando un semplice +, e moltiplicarle utilizzando un *
spam + eggs
'La pratica rende perfetti!'
spam * 3
'La pratica La pratica La pratica '
a = [1, 2, 'tre']
b = [4, 5, 'sei']
a + b
[1, 2, 'tre', 4, 5, 'sei']
a * 3
[1, 2, 'tre', 1, 2, 'tre', 1, 2, 'tre']
Una funzione estremamente utile, comune sia a Liste che Stringhe è la funzione len(), che
ci restituisce la lunghezza dell'elemento passato:
len(spam)
11
len(a)
3
a = [1, 2, 3, 4]
b = "qwerty"
1 in a
True
6 in a
False
"q" in b
True
"z" in b
False
Potete utilizzare il sistema di accesso ad indice anche nelle stringhe, come visto nella
puntata precedente con le Liste:
alfa = "abcdefghijklm..."
def reverser(stringa):
indice = (len(stringa) -1)
nuova_stringa = ""
while indice >= 0:
nuova_stringa += stringa[indice]
indice -= 1
print(nuova_stringa)
reverser(alfa)
...mlkjihgfedcb
Possiamo inoltre ottenere una porzione di stringa utilizzando un indice doppio, proviamo
ad esempio ad eliminare i 3 punti di sospensione:
>>> alfa[:-3]
'abcdefghijklm'
Infine, possiamo convertire una Stringa in Lista utilizzando la funzione list(): questa
dividerà una stringa in una lista formata da tutti i caratteri che formano la stringa.
>>> list(alfa)
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', '.',
'.', '.']
Ricapitolando:
Liste e Stringhe possono essere gestite in maniera identica sotto molti aspetti
La funzione len() ci restituisce la lunghezza di una Lista o Stringa passata come
parametro
Per verificare se un elemento o un carattere è presente in una Lista o Stringa
usiamo gli operatori IN e NOT IN
Possiamo utilizzare la funzione list() anche per dividere una stringa in una lista di
caratteri
16: I Metodi delle Liste
In questa puntata andremo a concludere il discorso iniziato nella lezione numero 14 sulle
Liste, introdurremo infatti svariati metodi legati a questo tipo di dato in modo da poter
ottenere il massimo da questo potentissimo strumento.
Questi metodi vanno ad aggiungersi a funzioni quali la funzione len() che abbiamo visto
nella lezione precedente, e alle altre modalità di gestione delle Liste utilizzate fin'ora.
nome_lista.nome_metodo(eventuali parametri)
Metodo append()
inventario.append("frecce")
Se andiamo ora a controllare l'inventario vediamo che abbiamo ora anche le frecce:
>>> inventario
["torcia", "spada", "pane elfico", "arco", "frecce"]
Possiamo combinare append() con la funzione input e riempire così il nostro inventario fin
che ci pare... creiamo una piccola funzione riempi_inventario():
def riempi_inventario():
inventario = []
oggetto = ""
while True:
oggetto = input('Cosa vuoi aggiungere all\'inventario? ')
if oggetto == "terminato":
break
else:
inventario.append(oggetto)
riempi_inventario()
Metodo extend()
Supponiamo di avere due liste, chiamate lista_a e lista_b, e di voler aggiungere gli
elementi di lista_b a quelli presenti in lista_a. Possiamo utilizzare il metodo extend() per
questo scopo:
>>> lista_a
['pippo', 'pluto', 'giacobbe', 'spam', 'eggs', 'bacon']
Metodo remove()
Al contrario della funzione append() possiamo eliminare invece elementi dalla lista
mediante la funzione remove() utilizzando il valore dell'elemento che vogliamo rimuovere.
Al contrario dell'istruzione del, in cui possiamo eliminare degli elemanti da una Lista a
partire dal loro indice:
>>> monty
["eggs", "bacon", "bob", "alice", "pluto"]
>>> monty.remove("pluto")
>>> monty
["eggs", "bacon", "bob", "alice"]
Possiamo inoltre utilizzare pop() per eliminare l'ultimo elemento della lista:
Metodo sort()
Potete anche ordinare gli elementi al contrario tramite il parametro reverse da passare a
sort(), così:
>>> numeri.sort(reverse=True)
>>> numeri
[88, 56, 32, 23, 22, 15, 2, 1]
Badate peró che sort() non è in grado di gestire una lista mista tra numeri e lettere... in
caso provassimo a fare ció otterremo un errore, provare per credere!
Metodo index()
Il metodo index() ci restituisce invece l'indice di un dato passato, contenuto all'interno della
lista; Sempre restando sulla lista numeri:
>>> numeri.index(22)
4
oppure
>>> numeri.index(88)
0
Metodo insert()
Infine parliamo ora del metodo insert(), che ci consente di aggiungere un valore a un dato
indice nella lista; i valori della lista si sposteranno quindi di posizione per fare spazio a
questo nuovo valore. Insert ci fornisce quindi un maggiore controllo rispetto al metodo
append().
>>> feste.insert(1,"carnevale")
>>> feste
['capodanno', 'carnevale', 'pasqua', 'ferragosto', 'natale']
Ricapitolando:
Utilizziamo i Metodi associati alle liste per poterle gestire nel migliore dei modi
Il Metodo append() ci consente di aggiungere un elemento alla fine della lista
Il Metodo extend() ci consente di "estendere" una lista, con l'aggiunta di valori
provenienti da una seconda lista
Il Metodo remove() invece di consente di rimuovere un elemento, a partire dal suo
valore
Il Metodo pop() ci consente di eliminare l'ultimo elemento della lista
Il Metodo sort() ci consente di riordinare gli elementi di una lista
Il Metodo reverse() ci consente di invertire l'ordine degli elementi di una lista
Il Metodo index() ci permette di ottenere l'indice di un elemento passato
Il Metodo insert() ci consente di aggiungere un valore in una posizione prestabilita
17: I Dizionari
I dizionari sono un pò come le Liste che abbiamo visto nei capitoli precedenti, ma a
differenza delle Liste in cui a ciascun valore dell'elenco corrisponde un numero indice
progressivo, quindi da 0 in su, nei Dizionari ad ogni valore è associato un indice
particolare chiamato chiave, e siamo proprio noi a impostare questa chiave che potrà
essere di un qualsiasi tipo di dato eccetto liste e altri dizionari.
Per ogni valore all'interno del Dizionario avremo quindi una coppia chiave-valore: più che
considerarli come un tipo di dato in se, è bene considerare i Dizionari come una struttura
di dati.
Si tratta sicuramente della tipologia più complessa rispetto a tutte quelle analizzate fin'ora!
Andiamo a fare un esempio pratico in modo da rendere l'idea da un punto di vista visivo; i
Dizionari vengono definiti utilizzando parentesi graffe:
Quindi con questa azione abbiamo definito una struttura di dati, contenente quattro di
quelle che abbiamo chiamato coppie chiave-valore, associate al nome "mio_dizionario".
>>> mio_dizionario
{"mia_chiave_uno": "mio_valore", "età": 24, 3.14: "pi_greco", "primi":
[1, 2, 3, 5, 7]}
Come vedete abbiamo utilizzato diversi tipi di valori, stringhe, interi e liste, associati
ciascuno ad una chiave univoca. Le chiavi nei Dizionari sono proprio il corrispettivo degli
indici nelle Liste: usiamo le chiavi per richiamare i valori ad esse associati.
Per ottenere il valore associato alla chiave "mia_chiave_uno" facciamo in questo modo:
>>> mio_dizionario["mia_chiave_uno"]
'mio_valore'
Stesso discorso vale per tutti gli altri valori presenti, richiamabili tramite le loro chiavi.
Proviamo a richiamare il valore associato alla chiave 3.14:
>>> mio_dizionario[3.14]
'pi_greco'
Per aggiungere una nuova coppia chiave-valore al nostro Dizionario facciamo in questa
maniera:
>>> mio_dizionario["nuova_chiave"] = "nuovo_valore"
>>> mio_dizionario
{'mia_chiave_uno': 'mio_valore', 'età': 24, 3.14: 'pi_greco', 'primi':
[1, 2, 3, 5, 7], 'nuova_chiave': 'nuovo_valore'}
Allo stesso modo possiamo sostituire il valore associato ad una chiave già presente nel
dizionario:
>>> mio_dizionario["età"] = 99
>>> mio_dizionario
{'mia_chiave_uno': 'mio_valore', 'età': 99, 3.14: 'pi_greco', 'primi':
[1, 2, 3, 5, 7], 'nuova_chiave': 'nuovo_valore'}
Facciamo ora una precisazione: a differenza delle Liste, in cui l'insieme di valori è un
insieme ordinato, i Dizionari sono elenchi di valori non ordinati.
Python riconoscerà quindi due dizionari come uguali se questi conterranno le stesse
coppie chiave-valore, anche se apparentemente non si trovano stesso ordine.
Definiamo ora un nuovo Dizionario, chiamiamolo ita_eng e inseriamoci proprio valori tipici
di un dizionario, ad esempio di un dizionario Italiano - Inglese:
ita_eng =
{"ciao":"hello","arrivederci":"goodbye","uova":"eggs","gatto":"cat","aran
cia":"orange"}
Esistono tre metodi associati ai Dizionari che ci consentono di ottenere in output una Lista
di tutte le chiavi presenti, o una Lista di tutti i valori presenti, o di entrambi allo stesso
tempo.
Questi metodi sono il metodo keys(), il metodo values() e il metodo items(): vediamo un pó
come utilizzarli:
Metodo keys()
>>> ita_eng.keys()
dict_keys(['ciao', 'arrivederci', 'uova', 'gatto', 'arancia'])
Metodo values()
Values significa proprio valori; utilizziamo quindi questo metodo per ottenere una Lista di
tutti i valori presenti. Per ottenere una Lista di tutti i valori nel nostro Dizionario facciamo
quindi:
>>> ita_eng.values()
dict_values(['hello', 'goodbye', 'eggs', 'cat', 'orange'])
Metodo items()
Infine utilizziamo il metodo items() per ottenere una Lista di tutte le coppie chiavi-valore
presenti.
>>> ita_eng.items()
dict_items([('ciao', 'hello'), ('arrivederci', 'goodbye'), ('uova',
'eggs'), ('gatto', 'cat'), ('arancia', 'orange')])
Utilizzando questi metodi, ció che ci viene restituito è da considerare come un oggetto di
tipo "dict_keys", "dict_values", "dict_items"
Se abbiamo bisogno di una lista vera e propria possiamo utilizzare anche qui la nostra
cara funzione list():
Possiamo inoltre utilizzare questi metodi in combinazione con un ciclo for, ad esempio per
far ciclare il nostro for per tutte le chiavi del dizionario facciamo:
>>> ita_eng["birra"]
Traceback (most recent call last):
File "stdin", line 1, in module
KeyError: 'birra'
Alcuni di voi a questo punto staranno sicuramente pensando: be abbiamo visto sia gli if e
gli else, che i try ed except, perché non utilizzare quelle istruzioni in combo con gli
operatori in e not in, per evitare il crash del programma?
Ad esempio:
Be, il metodo funziona, ma è piuttosto lungo e noioso, sopratutto una volta che sappiamo
che i Dizionari dispongono di un metodo specifico, ideato proprio per situazioni come
queste: il Metodo get().
Richiamiamo il metodo get() sul nostro Dizionario ita_eng e passiamoli proprio la chiave
"birra":
Quindi ció che il metodo get() fa è restituirci un valore di default come una sorta di
"paracadute d'emergenza", qualora la chiave richiesta non esista nel nostro Dizionario.
Parallelamente al metodo get(), ci saranno dei momenti in cui a seconda della complessità
di ciò che stiamo facendo, potremo avere la necessità di creare una coppia chiave valore
qualora una chiave non sia già presente e associata a un valore nel Dizionario.
>>> ita_eng
{'ciao': 'hello', 'arrivederci': 'goodbye', 'uova': 'eggs', 'gatto':
'cat', 'arancia': 'orange'}
Quindi ció che setdefault() ha fatto è stato cercare la chiave "birra" all'interno del nostro
dizionario "ita_eng", e visto che la chiave non esisteva ha creato una coppia chiave-valore
col valore "beer" da noi passato.
>>> ita_eng
{'ciao': 'hello', 'arrivederci': 'goodbye', 'uova': 'eggs', 'gatto':
'cat', 'arancia': 'orange', 'birra': 'beer'}
Avremo anche in questo caso potuto creare un ciclo for, ma sarebbe stato piuttosto
macchinoso e superfluo, una volta che si conosce il metodo setdefault().
Ricapitolando:
In questa nuova lezione approfondiremo la nostra conoscenza del tipo di dato testuale di
Python, le Stringhe.
Vorrei anzitutto iniziare da una nuova tipologia di concatenazione tra testo e variabili che è
appena stata introdotta in Python 3.7, chiamata in Inglese Formatted String Literals, che
va a migliorare il sistema di formattazione già presente in Python 3, rendendolo davvero di
una potenza sconvolgente!
Fin'ora quando abbiamo dovuto concatenare delle variabili con delle stringhe, abbiamo
utilizzato l'operatore + per unire i valori tra di loro, ad esempio:
Per poter unire dei valori numerici inoltre, abbiamo sempre dovuto utilizzare la funzione di
supporto str()
numero = 18
>>> "Ciao " + nome + " questa è la lezione n" + str(numero)
'Ciao Jack questa è la lezione n18'
Piuttosto confusionale non vi pare? Ma tranquilli, con questo metodo che vi spiegheró ora
potrete tirare un sospiro di sollievo e cimentarvi nelle concatenazioni più disparate.
Per utilizzare questo nuovo sistema di formattazione, dovete iniziare la nuova stringa con
una f, che significa appunto formatted, e che informa Python di come deve interpretare le
istruzioni successive. Tutte le variabili che volete passare le passate tra parentesi graffe:
>>> z = 5
>>> f"Il quadrato di {z} è {z * z}"
'Il quadrato di 5 è 25'
Andiamo ora a fare un elenco dei metodi per stringhe che troverete utilissimi e che vi
permetteranno di risparmiare tempo e codice.
Direi anzitutto di iniziare con quelli che sono forse i miei metodi preferiti, mi riferisco
a startswith() e endswith().
Ció che questi due metodi fanno è controllare se la Stringa in analisi inizia oppure finisce,
con una parola o lettera passata come parametro. Questi metodi restituiscono valori
Booleani, quindi ricordiamolo, True o False.
>>> messaggio.startswith("Fate")
True
>>> messaggio.startswith("F")
True
>>> messaggio.starstwith("x")
False
>>> messaggio.endswith("gioco")
True
>>> messaggio.endswith("gioc")
False
Parliamo ora di isupper() e islower(): questi metodi controllano se tutte le lettere nella
stringa analizzata sono maiuscole o minuscole, e anche stavolta restituiscono valore True
o False in base al risultato dell'analisi:
>>> nome.islower()
True
>>> cane.isupper()
False
Parallelamente potete ottenere la versione con le lettere tutte in maiuscolo o tutto in
minuscolo grazie ai metodi upper() e lower():
>>> nome.lower()
'bob'
>>> cane.upper()
LUCKY
Ma tenete a mente che in questo caso vi viene fornita una nuova versione della stringa, e
non una modifica alla stringa stessa:
>>> cane
'Lucky'
Parleremo bene dei dettagli tecnici su questo tipo di dato in un altro video più avanti, per
ora tenete a mente che volendo modificare il contenuto vero e proprio, dovete riassegnare
la variabile:
>>> cane
'LUCKY'
Se avessimo aggiunto anche solo uno spazio nella stringa, isalpha() avrebbe restituito
False:
Per verificare se invece la stringa è composta o da numeri o da lettere allo stesso tempo
usiamo isalnum():
>>> spam = "asd123q"
>>> spam.isalnum()
True
Per verificare se una stringa o un carattere è invece uno spazio bianco, usiamo isspace():
Bene, passiamo ora agli ultimi due metodi che analizzeremo in questo video, split() e
join():
Il metodo join() è utilissimo quando ci troviamo con una Lista di stringhe o parole, e
vogliamo unirle tra di loro per formare una nuova stringa risultante.
Anzitutto il metodo join viene chiamato su una stringa, che vogliamo utilizzare come
collante diciamo tra le varie parole o stringhe vogliamo unire:
>>> da_fare
'oggi devo: portare il cane a passeggio, finire di studiare, fare la
spesa, lavare i panni'
Possiamo anche chiamare join() su un carattere newline per separare i vari elementi con
una nuova riga:
>>> print(da_fare)
portare il cane a passeggio
finire di studiare
fare la spesa
lavare i panni
Al contrario, col metodo split() possiamo dividere una stringa su cui viene richiamato, in
una lista di stringhe, in questo modo:
Quindi stavolta tra le parentesi di split() mettiamo il carattere o parola o stringa insomma,
che segnala a split() dove effettuare questa suddivisione.
Ricapitolando:
Benvenuti a tutti a questa lezione numero 19, in questo episodio parleremo di Files,
ovvero di come sia possibile leggere e scrivere da e su un file di testo salvato nel nostro
Computer.
Utilizzando write, ogni volta che andiamo ad aggiungere del contenuto, tutto ció che era
precedentemente salvato all'interno del file andrà perso, mentre utilizzando append, che
significa proprio aggiungere, il contenuto aggiunto si sommerà a quanto già presente nel
file.
Iniziamo partendo dalla prima modalità. Anzitutto ci serve qualcosa da scrivere, quindi:
Ció che dobbiamo fare ora è specificare il file testuale su cui vogliamo scrivere, e per fare
questo facciamo:
file1 = open("esempio1.txt","w")
open() è chiaramente una funzione, e i parametri che le passiamo sono il nome del file su
cui vogliamo scrivere e la modalità di scrittura, in questo caso "w" da write appunto.
Il nome del file puó essere preceduto dal suo percorso all'interno del sistema, ad
esempio file1 = open("C:\\esempio1.txt","w")
Nella definizione del percorso utilizziamo due slash e non uno, in quanto come ricorderete
dalle lezioni precedenti questo è il carattere escape, e quindi per essere interpretato
correttamente ha bisogno di essere a sua volta giustificato.
Visto che noi abbiamo specificato solamente il nome, Python andrà a cercalo nella sua
cartella di lavoro di default. Se il file non esiste, come in questo caso, open() lo creerà per
noi.
Ora che Python sa a che file ci stiamo riferendo possiamo effettuare la scrittura vera e
propria, usando il nome della variabile associata ad open(), nel nostro caso file1:
file1.write(contenuto)
file1.close() # ricordatevi sempre di chiudere i vostri file
Andando a controllare nel nostro file esempio1.txt, ecco che troviamo la frase appena
scritta, "Oggi è una bellissima giornata!"
Utilizziamo ora la seconda modalità di scrittura, append, per aggiugnere del testo a quello
già presente. Creiamo del nuovo materiale da aggiungere:
La procedura è la stessa rispetto a quella mostrata fin'ora, l'unica cosa che va a cambiare
è il secondo parametro passato a open():
Andando a ricontrollare nel nostro file di testo, ecco che ora troviamo la nostra nuova
aggiunta:
Come vedete Python non va a capo automaticamente, dovrete specificarlo voi mediante
un carattere newline:
file1 = open("esempio1.txt","a")
file1.write("\nNuova_riga")
file1.close()
Questo è tutto ció che vi serve sapere per iniziare a scrivere sui file, passiamo ora alla
terza e ultima parte di questa lezione, la lettura da file; ad open() verrà passato stavolta il
parametro "r", da read:
var_lettura = open("esempio1.txt","r").read()
print(var_lettura)
"Oggi è una bellissima giornata!python è una bomba
Nuova_riga"
Volendo, invece di leggere tutto il contenuto del file come un'unica stringa, potete ottenere
una lettura per righe apportando una piccola modifica a quanto abbiamo scritto in
precedenza:
var_lettura = open("esempio1.txt","r").readlines()
Grazie a readlines(), ora in var_lettura è presente una lista composta
dalle varie righe del file:
var_lettura
["Oggi è una bellissima giornata!python è una bomba","\nNuova_riga"]
Prima di chiudere vi do delle info bonus, iniziamo importando il modulo della Standard
Library dedicato al sistema operativo, il modulo os:
import os
Tra le tante funzionalità presenti in questo modulo potete verificare la cartella su cui
Python sta lavorando mediante:
os.getcwd()
e cambiarla con:
os.chdir(/percorso/file)
Ricapitolando:
Parleremo di come sia possibile Copiare, Spostare, Rinominare o Cancellare qualsiasi tipo
di File nei vostri programmi Python.
Anzitutto utilizzeremo delle funzioni presente nel modulo shutil, abbreviativo di Shell
Utilities:
import shutil
Anzitutto vediamo un pò come possiamo copiare i file, supponiamo di voler copiare un file
chiamato "1492.txt" da una cartella chiamata "lezione20", ad una sottocartella chiamata
"storia".
shutil.copy("C:\\lezione20\\1492.txt", "C:\\lezione20\\storia")
Dobbiamo specificare due parametri, primo, il nome del file che vogliamo copiare con
relativo percorso, e secondo la cartella di destinazione.
Supponiamo ora di voler spostare invece un file chiamato "napoleone.txt", dalla cartella
"lezione20" alla sottocartella "storia". In questo caso usiamo la funzione move di shutil:
shutil.move("C:\\lezione20\\napoleone.txt", "C:\\lezione20\\storia")
Per poter rinominare oppure cancellare un file usiamo invece funzioni presenti nel modulo
os:
import os
os.unlink("C:\\lezione20\\cancellami.txt")
Ed ecco che il file è sparito! Volendo invece di unlink() potete utilizzare remove(), che è la
stessa cosa!
os.rename("C:\\lezione20\\rinominami.txt", "file_rinominato.txt")
Ricapitolando:
Anzitutto è bene sapere in che cartella ci troviamo, per fare questo facciamo:
Una volta che sappiamo in che cartella ci troviamo, è utile conoscerne il contenuto, che
possiamo ottenere grazie a os.listdir(). Questa funzione ci mostra un elenco degli
elementi e delle sottocartelle presenti nella cartella in cui stiamo operando.
os.makedirs("C:\\nuova__cartella")
os.makedirs("C:\\lezione21\\informatica")
os.makedirs("C:\\lezione21\\sistemi")
os.makedirs("C:\\lezione21\\security")
os.rename("nuova__cartella","lezione21")
Per spostare una cartella con relativi file, utilizziamo la funzione shutils.move():
shutils.move("C:\\lezione21\\security", "C:\\lezione21\\informatica\\")
"C:\\lezione21\\informatica\\security"
Mentre volendo invece copiare una cartella con relative sottocartelle facciamo:
shutil.copytree("C:\\lezione20","C:\\lezione21\\lezione20copia")
Alla funzione passiamo stavolta il nome di una nuova cartella in cui vogliamo effettuare la
copia, e copytree() creerà eventuali cartelle intermedie.
Infine la funzione più potente di tutte!
shutil.rmtree("lezione21\\lezione20copia")
22: Come Navigare il File System
Ciao a tutti e benvenuti a questa lezione numero 22, parleremo oggi di una delle modalità
più pratiche per navigare il filesystem del nostro computer con Python, grazie al modulo os
e alla funzione os.walk().
Fin'ora abbiamo visto che volendo controllare il contenuto di una cartella, possiamo
utilizzare la funzione listdir(), che però non fa distinzione tra file e sottocartelle, presenti nel
percorso passato.
E in quelle situazioni in cui dobbiamo scansionare una parte sostanziosa del sistema,
magari alla ricerca di un determinato tipo di file con cui vogliamo operare, potremo
combinare listdir() e altre funzioni, ma il procedimento diventerebbe abbastanza lungo.
Una delle modalità più veloci e pratiche per fare ciò è utilizzare invece la funzione walk()
del modulo os, capirete bene come funziona a breve.
Questa analizza il percorso passato in maniera ricorsiva, cioè dove ogni analisi viene
suggerita da quella precedente, cercando sottocartelle e file.
La funzione os.walk() viene usata in combinazione con i cicli for: ad ogni ciclo, abbiamo 3
elementi: la cartella in cui ci troviamo al momento, una lista delle sottocartelle presenti, e
una lista dei file, al ciclo successivo la funzione entrerà in una delle sottocartelle e ripeterà
il processo, questo prosegue fino a che non si arriva alla fine dell'albero.
import os
Con questi file e sottocartelle potete poi fare tutto quello che volete, ad esempio:
Supponiamo di voler andare alla ricerca di tutti i file .py presenti in questa sezione, e di
ottenere quindi in output solamente un elenco di questi file, tralasciando tutti gli altri che
verranno incontrati:
Arrivati a questo punto della serie vi trovate con tantissimi strumenti a vostra disposizione,
vi invito quindi ad esercitarvi cercando di essere creativi!
23: Installare Moduli di Terze Parti con PIP
Nella pagina principale sono in evidenza gli ultimi moduli che sono stati caricati o
aggiornati, e abbiamo quindi data/nome/descrizione funzionalità.
Per una ricerca più accurata cliccate su Browse Packages, che vi restituirà un elenco in
cui potrete scegliere in base alla categoria di appartenenza.
I moduli del Python Package Index vengono installati da terminale, tramite un programma
chiamato PIP, che già avete nel vostro computer in quanto è presente nel pacchetto di
installazione di Python che abbiamo installato nella prima lezione della serie.
Su Windows, apriamo quindi il prompt dei comandi(CMD) e navighiamo fino alla cartella
Scripts di Python e una volta dentro facciamo:
In questo caso pip starà scaricando e installando Django, uno dei Web Framework più
famosi di Python, con cui sono scritti servizi famosi come Instagram.
import Django
django.VERSION
Passiamo ora su Linux, e questa procedura dovrebbe funzionare senza problemi anche su
Mac OS:
Qui la questione è ancora più semplice che su Windows: ci basta aprire un terminale e
digitare lo stesso comando usato su Windows, solo che ora non abbiamo bisogno di
essere nella cartella degli Scripts:
Attenzione: su sistemi Linux e Mac capita spesso di avere 2 versioni di Python installate
nel proprio sistema (2.X e 3.X) e per questo motivo, a seconda della vostra personale
configurazione di sistema potreste dover usare il comando "pip3" invece di "pip" per
installare moduli utilizzabili con Python 3.
24: Come Inviare eMail con Python
Ciao a tutti ragazzi e ragazze! Oggi impareremo quanto è facile automatizzare l'invio di
eMail all'interno dei nostri programmi in Python.
Ci sono varie situazioni in cui questo torna utile, specie in programmi importanti o che
girano su macchine che stanno sempre connesse, capita che ci sia la necessità di essere
notificati in tempo reale, e pensate a quanto tempo tra copia e incolla vi fa risparimare
quando vi trovate con dei file pieni di indirizzi a cui dovete poi inviare un messaggio.
Tutto questo è reso possibile grazie al modulo smtplib, che quindi importiamo all'istante:
import smtplib
Questo modulo rappresenta l'implementazione in Python del protocollo SMTP, che sta per
Simple Mail Transfer Protocol.
Volendo avreste potuto scrivere oggetto e contenuto nella stessa variabile, ma penso che
così sia più pulito.
Quindi dobbiamo specificare il server SMTP del servizio a cui vogliamo connetterci, e la
relativa porta di servizio associata, in questo Tutorial useremo gMail:
email.ehlo()
email.starttls()
dove tls sta per Transport Layer Security, ovvero il protocollo crittografico che mette in
sicurezza la nostra comunicazione col Server.
A questo punto possiamo effettuare il Login vero e proprio usando i nostri Username e
Password:
email.login("username", "password")
email.sendmail("mittente","destinatario",messaggio)
Una volta che il messaggio è inviato, interrompiamo la connessione col Server:
email.quit()
Chiaramente tutta la potenza di questi comandi viene liberata quando vengono utilizzati
all'interno di uno script, che potrete poi salvare e richiamare ogni volta che vi serve!
25: Come Usare Archivi Zip in Python
Utilizzeremo due moduli della Standard Library, il modulo os per navigare nel sistema, e il
modulo zipfile che si occuperá di comprimere e decomprimere.
Iniziamo partendo dalla creazione di un archivio, ovvero vediamo come si crea un archivio
zip nei nostri programmi in Python. In maniera simile a quanto visto nella lezione sui file di
testo facciamo:
# chiusura
archivio.close()
archivio.write("manage.py", compress_type=zipfile.ZIP_DEFLATED)
archivio.close()
Passiamo ora all'estrazione del contenuto di un archivio zip, facciamo ciò grazie a
extractall();
# chiusura
archivio.close()
archivio.extract("file","/percorso/dove/estrarre/volendo/nuova/cartella")
archivio.close()
Infine possiamo leggere delle preziose informazioni riguardo al contenuto di un file zip,
qualora ci serva visionarlo dall'interno dei nostri programmi per poter effettuare delle azioni
specifiche con ciascun file presente:
urlsinfo = archivio.getinfo("urls.py")
urlsinfo.filesize
urlsinfo.compress_size
# chiusura
archivio.close()
26: Come Leggere File CSV
In questo nuovo tutorial spiegheremo come fare a leggere file CSV tramite Python.
Per chi non conoscesse questa tipologia di file, CSV sta per Comma Separated Values:
si tratta di una delle estensioni più utilizzate sopratutto in ambito scientifico o quando si ha
comunque a che fare con grosse quantità di dati.
Si tratta in sostanza di tabulati stile foglio di calcolo e per questo motivo vi sarà
probabilmente capitato di lavorarci su Excel o Calc.
Nel sito italiano dedicato agli open-data è possibile scaricare i vari database anche e
spesso proprio in questo formato.
Per questa lezione ho appositamente scaricato il database dei monumenti italiani, quindi
lavoreremo proprio con uno di questi file CSV, un database contenente dati sui vari
monumenti della nostra nazione.
Per chiudere questa breve parte introduttiva, aggiungo che per quanto la traduzione
letterale del nome sia: "Valori Separati Da Virgole", si tratta di un formato un pó bizzarro,
in quanto il carattere delimitatore può essere sia una virgola o un punto e virgola o un
altro carattere:
1,mattino,colazione
2,pomeriggio,pranzo
3,sera,cena
E poi lo salvo con estensione CSV, questo potrà essere interpretato anche da CALC
proprio come un tabulato, in cui i valori sono stati separati appunto da virgole. Volendo
avrei potuto utilizzare ad esempio dei punti e virgola o dei trattini, o dei TAB.
Non tutti i file CSV saranno quindi necessariamente uguali, ma fintanto che hanno
quest'estensione, potete lavorarci su Python: facciamo questo tramite un modulo apposito
che ci viene fornito dalla Standard Library, il modulo CSV:
import csv
Anzitutto dobbiamo aprire il nostro file, e facciamo questo con la funzione open():
import csv
with open("./mappa_monumenti_italia.csv", newline="", encoding="ISO-8859-
1") as filecsv:
Abbiamo quindi il percorso del nostro file, specifichiamo il carattere newline come una
stringa vuota, e poi ho aggiunto anche la codifica dei caratteri con encoding="ISO-8859-1":
quest'ultimo parametro potrebbe non essere necessario a seconda del file e del sistema
con cui state lavorando, io l'ho aggiunto per aggirare un errore che mi veniva restituito
dalla console.
Ora che abbiamo il nostro bel file sotto tiro, possiamo finalmente iniziare ad utilizzare il
modulo CSV.
Per leggerlo utilizziamo la funzione reader() che restituisce un oggetto di tipo reader,
ovvero lettore, che cicla per tutte le righe del nostro file CSV.
Alla funzione reader() passiamo due parametri: il file da leggere e il delimitatore delle
colonne del file:
import csv
with open("./mappa_monumenti_italia.csv", newline="", encoding="ISO-8859-
1") as filecsv:
lettore = csv.reader(filecsv,delimiter=";")
print(lettore)
Ora possiamo iniziare a fare tutto ció che vogliamo col nostro file. Vediamo un pó da cosa
è composto l'header, ovvero la prima riga del nostro file:
import csv
with open("./mappa_monumenti_italia.csv", newline="", encoding="ISO-8859-
1") as filecsv:
lettore = csv.reader(filecsv,delimiter=";")
header = next(lettore)
print(header)
Supponiamo di voler ottenere l'elenco di tutti i monumenti presenti nella regione Toscana,
e le corrispondenti coordinate, così da poter poi controllare istantaneamente la posizione
su Google Maps.
Possiamo isolare le varie colonne che ci servono tramite il sistema di indicizzazione delle
liste: possiamo creare quindi una sottolista d'interesse a partire da questi colonne, molto
semplicemente:
import csv
with open("./mappa_monumenti_italia.csv", newline="", encoding="ISO-8859-
1") as filecsv:
lettore = csv.reader(filecsv,delimiter=";")
# header = next(lettore)
# print(header)
dati = [(linea[10],linea[6],linea[7],linea[0]) for linea in lettore
if linea[10]=="Toscana" and linea[6] != ""]
import csv
with open("./mappa_monumenti_italia.csv", newline="", encoding="ISO-8859-
1") as filecsv:
lettore = csv.reader(filecsv,delimiter=";")
# header = next(lettore)
# print(header)
dati = [(linea[10],linea[6],linea[7],linea[0]) for linea in lettore
if linea[10]=="Toscana" and linea[6] != ""]
for monumento in dati:
print (f"{monumento[:2]} -- Coordinate:
{monumento[2]},{monumento[3]}")
Ora possiamo aprire google maps e semplicemente copiare le coordinate del monumento
che ci interessa, oppure effettuare ulteriori analisi!
Come vedete potete fare proprio tutto quello che volete con questi database una volta che
ne avete ottenuto accesso. Inoltre, una volta appreso questo semplice sistema per la
lettura dei CSV, anche il lavoro d'ufficio sarà estremamente semplificato, garantito!
Vi invito quindi a farvi un giro per il sito italiano dedicato agli open-data e cercare i dataset
che più ritenete interessanti e provate ad esercitarvi.
27: Passare parametri da riga di comando con SYS.ARGV
In questa lezione spiegheremo come passare parametri al nostro script tramite riga di
comando, usando la funzione argv del modulo sys.
argv sta per "argument variable": si tratta semplicemente di una lista di stringhe
contenente i parametri che vengono passati allo script quando lo state richiamando. Se
avete utilizzato degli script in Python in passato, con buona probabilità sapete chiaramente
a cosa mi sto riferendo!
Avete presente quando, all'avvio di uno script da riga di comando, date qualche opzione
tipo:
Be, con buona probabilità, quello script sta utilizzando il modulo sys.
Il primo parametro della lista argv, quindi il valore ad indice 0, è sempre il nome dello
script.
Il resto dei valori è ordinato secondo l'ordine in cui sono stati passati.
import sys
print(sys.argv)
import sys
nome_script, primo, secondo = sys.argv
print(f"""
Il nome dello script è: {nome_script}
Il primo parametro passato è: {primo}
Il secondo parametro passato è: {secondo}""")
E ottenere quindi:
>>> python lezione_26.py alfa bravo
Di norma è bene controllare che allo script siano stati passati abbastanza parametri prima
di assegnarli ad eventuali variabili, quindi tenendo a mente che il primo parametro è
sempre il nome dello script possiamo fare:
if len(sys.argv) < 3:
print("Devi passare due parametri allo script!")
print("Sto uscendo...")
sys.exit()
Una volta che avete i parametri potete chiaramente farci tutto quello che vi pare. Ad
esempio:
if primo == "info":
print("Questa è la lezione 26, dedicata a SYS.ARGV")
oppure:
def sommatoria(a,b):
somma = int(a) + int(b)
print(f"La somma dei due valori è: {somma}")
sommatoria(primo,secondo)
# richiamiamo il file lezione_26.py