Basi Python - variabili e interi
Scarica zip esercizi
REQUISITI:
Installato Python 3 e Jupyter: se non hai già provveduto, guarda Installazione
Letto Strumenti e script
Jupyter
Jupyter è un editor che ti permette di lavorare sui cosiddetti notebook, che sono file che finiscono con l’estensione .ipynb
. Sono documenti divisi in celle dove per ogni cella puoi immettere dei comandi e vederne subito il rispettivo output. Proviamo ad aprire questo.
scompatta lo zip degli esercizi in una cartella, dovresti ottenere qualcosa del genere:
basics
basics1-ints.ipynb
basics1-ints-sol.ipynb
basics2-bools.ipynb
basics2-bools-sol.ipynb
basics3-floats.ipynb
basics3-floats-sol.ipynb
basics4-chal.ipynb
jupman.py
ATTENZIONE: Per essere visualizzato correttamente, il file del notebook DEVE essere nella cartella szippata.
apri il Jupyter Notebook da quella cartella. Due cose dovrebbero aprirsi, prima una console e poi un browser. Il browser dovrebbe mostrare una lista di file: naviga la lista e apri il notebook
basics1-ints.ipynb
ATTENZIONE: apri quello SENZA il -sol
alla fine!
Vedere subito le soluzioni è troppo facile ;-)
Prosegui leggendo il file degli esercizi, ogni tanto al suo interno troverai delle scritte ESERCIZIO, che ti chiederanno di scrivere dei comandi Python nelle celle successive.
ATTENZIONE: In questo libro usiamo SOLO PYTHON 3
Se per caso ottieni comportamenti inattesi, controlla di usare Python 3 e non il 2. Se per caso il tuo sistema operativo scrivendo python
fa partire il 2, prova ad eseguire il tre scrivendo il comando: python3
Scorciatoie da tastiera:
Per eseguire il codice Python dentro una cella di Jupyter, premi
Control+Invio
Per eseguire il codice Python dentro una cella di Jupyter E selezionare la cella seguente, premi
Shift+Invio
Per eseguire il codice Python dentro una cella di Jupyter E creare una nuova cella subito dopo, premi
Alt+Invio
Se per caso il Notebook sembra inchiodato, prova a selezionare
Kernel -> Restart
Oggetti
Per Python qualunque cosa è un oggetto. Gli oggetti hanno proprietà (campi dove salvare valori) e metodi (cose che possono fare). Per esempio, un oggetto auto ha le proprietà modello, marca, colore, numero di porte etc …, e i metodi sterza a destra, sterza a sinistra, accelera, frena, cambia marcia …
Secondo la documentazione ufficiale di Python:
Gli oggetti sono l'astrazione Python per i dati. Tutti i dati in un programma Python sono rappresentati da oggetti o da relazioni tra gli oggetti.
Tutto quello che devi sapere per adesso è che gli oggetti Python hanno un identificatore (per es, il loro nome), un tipo (numeri, testo, collezioni, …) e un valore (il dato attuale rappresentato dagli oggetti). Una volta che un’oggetto è stato creato l’ identificatore e il tipo non cambiano mai, mentre il valore può rimanere costante (oggetti immutabili) o cambiare (oggetti mutabili).
Python fornisce questi tipi predefiniti ( built-in ):
Tipo |
Significato |
Dominio |
Mutabile? |
---|---|---|---|
|
Condizione |
|
no |
|
Intero |
\(\mathbb{Z}\) |
no |
|
Razionale |
\(\mathbb{Q}\) (più o meno) |
no |
|
Testo |
Testo |
no |
|
Sequenza |
Collezione di oggetti |
no |
|
Sequenza |
Collezione di oggetti |
sì |
|
Insieme |
Collezione di oggetti |
sì |
|
Mappatura |
Mappatura tra oggetti |
sì |
Per il momento guarderemo i più semplici, più avanti li approfondiremo tutti.
Variabili
Le variabili sono associazioni tra nomi e oggetti (possiamo anche chiamarli valori)
Le variabili possono essere associate o in termine più tecnico assegnate agli oggetti usando l’operatore di assegnazione =
.
L’istruzione
[2]:
diamanti = 4
può rappresentare quante pietre preziose teniamo in cassaforte. Cosa succede quando l’eseguiamo in Python?
un oggetto è creato
il suo tipo è impostato a
int
(un numero intero)il suo valore è impostato a
4
un nome
diamanti
è creato nell’ambiente e assegnato a quell’oggetto
Rilevare il tipo di una variabile
Quando vedi una variabile o una costante e hai dubbi sul suo tipo, puoi usare la funzione predefinita type
:
[3]:
type(diamanti)
[3]:
int
[4]:
type(4)
[4]:
int
[5]:
type(4.0)
[5]:
float
[6]:
type("Ciao")
[6]:
str
Riassegnare una variabile
Considera adesso il codice seguente:
[7]:
diamanti = 4
print(diamanti)
4
[8]:
diamanti = 5
print(diamanti)
5
Il valore della variabile diamanti
è stato cambiato da 4
a 5
, ma come riportato nella tabella sopra, il tipo int
è immutabile. Fortunatamente, questo non ci ha ostacolato nel cambiare il valore di diamanti
da 4
a 5
. Cosa è successo dietro le scene? Quando abbiamo eseguito le istruzioni diamanti = 5
, un nuovo oggetto di tipo int
è stato creato (5
è un intero) e quindi reso disponibile con lo stesso nome diamanti
, ma dato che è un oggetto differente
(l’intero 5
).
Riusare una variabile
Quando riassegni una variabile ad un’altro valore, per calcolare il nuovo valore puoi tranquillamente riusare il valore vecchio della variabile che vuoi cambiare. Per esempio, supponi di avere la variabile
[9]:
fiori = 4
e vuoi aumentare il numero di fiori
corrente di uno. Puoi scrivere così:
[10]:
fiori = fiori + 1
Cos’è successo? Quando Python incontra un comando con l’=
, PRIMA calcola il valore dell’espressione che trova a destra dell’=
, e POI assegna quel valore alla variabile che trova a sinistra dell’=
.
Dato quest’ordine, nell’espressione a destra viene usato il valore vecchio della variabile (in questo caso 4
) a cui viene sommato 1
per ottenere 5
che viene quindi assegnato a fiori
:
[11]:
fiori
[11]:
5
In modo del tutto equivalente, potremmo riscrivere il codice così, usando una variabile d’appoggio x
. Vediamolo in Python Tutor:
[12]:
# ATTENZIONE: per usare la funzione jupman.pytut() di seguito,
# è necessario eseguire prima questa cella con Shift+Invio
# basta eseguirla una volta sola, la trovi presente anche in tutti i fogli nella prima cella
import jupman
[13]:
fiori = 4
x = fiori + 1
fiori = x
jupman.pytut()
[13]:
Puoi eseguire una somma e fare un assegnamento contemporaneamente con la notazione +=
[14]:
fiori = 4
fiori += 1
print(fiori)
5
Questa notazione vale anche per altri operatori aritmetici:
[15]:
fiori = 5
fiori -= 1 # sottrazione
print(fiori)
4
[16]:
fiori *= 3 # moltiplicazione
print(fiori)
12
[17]:
fiori /= 2 # divisione
print(fiori)
6.0
Assegnazioni - domande
DOMANDA: Guarda le espressioni seguenti, e per ciascuna cerca di indovinare quale risultato produce (o se da errore).
Prova a verificare le tue supposizioni sia in Jupyter che un’altro editor di file
.py
(es. Spyder):
x = 1 x x
x = 1 x = 2 print(x)
x = 1 x = 2 x
x = 1 print(x) x = 2 print(x)
print(zam) print(zam) zam = 1 zam = 2
x = 5 print(x,x)
x = 5 print(x) print(x)
3 + 5 = x print(x)
3 + x = 1 print(x)
x + 3 = 2 print(x)
x = 2 x =+ 1 print(x)
x = 2 x = +1 print(x)
x = 2 x += 1 print(x)
x = 3 x *= 2 print(x)
Esercizio - scambia
✪ Date due variabili a
e b
:
a = 5
b = 3
scrivi del codice che scambia i loro valori, per cui dopo il tuo codice deve risultare
>>> print(a)
3
>>> print(b)
5
Bastano due variabili? Se non sono sufficienti, prova ad introdurne una terza.
[18]:
a = 5
b = 3
# scrivi qui
Esercizio - ciclare
✪ Scrivi un programma che date tre variabili con i numeri a
, b
, c
, cicla i valori, cioè, mette il valore di a
in b
, il valore di b
in c
, e alla fine il valore di c
in a
.
Perciò se hai iniziato così:
a = 4
b = 7
c = 9
Dopo il codice che scriverai tu, eseguendo questo:
print(a)
print(b)
print(c)
Dovresti vedere:
9
4
7
Ci sono vari modi di farlo, prova ad usare solo una variabile temporanea e fai attenzione a non perdere i valori !
SUGGERIMENTO: per aiutarti, scrivi i commenti sullo stato della memoria, e pensa a quale comando usare.
# a b c t di quale comando ho bisogno?
# 4 7 9
# 4 7 9 7 t = b
#
#
#
[19]:
a = 4
b = 7
c = 9
# scrivi del codice qui
print(a)
print(b)
print(c)
4
7
9
[20]:
9
4
7
Cambiare il tipo durante l’esecuzione
Puoi anche cambiare il tipo di una variabile durante l’esecuzione ma quello normalmente è una cattiva idea perchè rende il codice più difficile da comprendere, e aumenta la probabilità di commettere errori. Facciamo un esempio:
[21]:
diamanti = 4 # intero
[22]:
diamanti + 2
[22]:
6
[23]:
diamanti = "quattro" # testo
Adesso che diamanti
è diventato testo, se per sbaglio proviamo a trattarlo come se fosse un numero avremo un errore !!
diamanti + 2
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-9-6124a47997d7> in <module>
----> 1 diamanti + 2
TypeError: can only concatenate str (not "int") to str
Comandi multipli su una stessa linea
E’ possibile mettere più comandi su una stessa linea (non solo assegnazioni) separandoli da un punto e virgola ;
[24]:
a = 10; print('Tanti comandi!'); b = a + 1;
Tanti comandi!
[25]:
print(a,b)
10 11
NOTA: I comandi multipli su stessa linea sono ‘poco pythonici’
Per quanto volte utili e meno verbose che quelle con definizione esplicita, sono uno stile sconsigliato.
Inizializzazioni multiple
Cosa diversa sono le inizializzazioni multiple, separate da virgola ,
come:
[26]:
x,y = 5,7
[27]:
print(x)
5
[28]:
print(y)
7
A differenza dei comandi multipli, le assegnazioni multiple sono uno stile più accettabile.
Esercizio - scambiare come un ninja
Prova a scambiare il valore di due variabili a
e b
in una riga usando una riassegnazione multipla.
a,b = 5,3
Dopo il tuo codice, deve risultare
>>> print(a)
3
>>> print(b)
5
[29]:
a,b = 5,3
# scrivi qui
Nomi di variabile
NOTA IMPORTANTE:
Puoi scegliere il nome che preferisci per le tue variabili (consiglio di scegliere qualcosa che ci ricorda il loro significato), ma devi aderire a semplici regole:
I nome possono solo contenere caratteri in maiuscolo/minuscolo (
A-Z
,a-z
), numeri (0-9
) o underscore_
I nomi non possono iniziare con un numero
i nomi di variabile dovrebbero iniziare con lettera minuscola
I nomi non possono essere uguali a parole riservate
Parole riservate:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Funzioni di sistema: Oltre alle parole riservate (impossibili da ridefinire), Python ha anche diverse funzioni di sistema predefinite:
bool
,int
,float
,tuple
,str
,list
,set
,dict
max
,min
,sum
next
,iter
id
,dir
,vars
,help
Purtroppo, Python consente agli incauti di ridefinirle, ma noi no:
V COMANDAMENTO : Non ridifinerai mai funzioni di sistema
Mai dichiarare variabili con questi nomi!
Nomi di variabile - domande
Per ciascuno dei nomi seguenti, prova a immaginare se è un valido nome di variabile oppure no, e poi prova ad assegnarlo nella cella seguente
my-variable
my_variable
theCount
the count
some@var
MacDonald
7channel
channel7
stand.by
channel45
maybe3maybe
"ciao"
'hello'
as
Confronta bene con i prossimi dueasino
As
lista
Confronta bene con i prossimi duelist
NON provare ad assegnare questo nell’interprete (scrivendo per eslist = 5
), renderesti l’interprete praticamente inutilizzabile!List
black&decker
black & decker
glab()
caffè
(Nota la è accentataè
!)):-]
€zone
(Nota il segno dell’euro)some:pasta
aren'tyouboredyet
<angular>
[30]:
# scrivi i nomi qui
Tipi numerici
Abbiamo già menzionato che i numeri sono oggetti immutabili. Python fornisce diversi tipi numerici: interi (int
), reali (float
), booleani, frazioni e numeri complessi.
E’ possibile compiere operazioni aritmetiche con i seguenti operatori, in ordine di precedenza:
Operatore |
Descrizione |
---|---|
|
Potenza |
|
Più e meno unari |
|
Moltiplicazione, divisione, divisione intera, modulo |
|
Addizione e sottrazione |
Vi sono inoltre diverse funzioni predefinite:
Funzione |
Descrizione |
---|---|
|
il minimo tra i numeri passati |
|
il massimo tra i numeri passati |
|
il valore assoluto |
e altre sono disponibili nel modulo math (ricordati che per usarle devi prima importare il modulo math
scrivendo import math
:
Funzione |
Descrizione |
---|---|
|
arrotonda |
|
arrotonda |
|
la radice quadrata |
|
il logaritmo naturale di |
|
il logaritmo di |
… più molte altre che qui non riportiamo.
Numeri interi
La gamma di valori che gli interi possono avere è limitata solo dalla memoria disponibile. Per lavorare con i numeri, Python fornisce degli operatori:
[31]:
7 + 4
[31]:
11
[32]:
7 - 4
[32]:
3
[33]:
7 // 4
[33]:
1
NOTA: la seguente divisione tra interi produce un risultato float, che come separatore per i decimali usa il punto (vedremo meglio in seguito):
[34]:
7 / 4
[34]:
1.75
[35]:
type(7 / 4)
[35]:
float
[36]:
7 * 4
[36]:
28
NOTA: per quanto in molti linguaggi la potenza si indica con il cappuccio ^
, invece in Python si indica con il doppio asterisco **
:
[37]:
7 ** 4 # potenza
[37]:
2401
Esercizio - scadenza 1
✪ Ci viene data una importante scadenza tra:
[38]:
giorni = 4
ore = 13
minuti = 52
Scrivi del codice che stampa i minuti in totale. Eseguendolo, deve risultare:
In totale mancano 6592 minuti
[39]:
giorni = 4
ore = 13
minuti = 52
# scrivi qui
Operatore modulo
Per trovare il resto della divisione tra due interi, possiamo usare l’operatore modulo che indichiamo con %
:
[40]:
5 % 3 # 5 diviso 3 da resto 2
[40]:
2
[41]:
5 % 4
[41]:
1
[42]:
5 % 5
[42]:
0
[43]:
5 % 6
[43]:
5
[44]:
5 % 7
[44]:
5
Esercizio - scadenza 2
✪ Ad un’altra importantissima scadenza importante mancano:
tot_minuti = 5000
Scrivi del codice che stampa:
Mancano:
3 giorni
11 ore
20 minuti
[45]:
tot_minuti = 5000
# scrivi qui
min e max
Il minimo tra due numeri può essere calcolato con la funzionemin
[46]:
min(7,3)
[46]:
3
e il massimo con la funzione max
:
[47]:
max(2,6)
[47]:
6
A min
e max
possiamo passare un numero arbitrario di parametri, anche negativi:
[48]:
min(2,9,-3,5)
[48]:
-3
[49]:
max(2,9,-3,5)
[49]:
9
V COMANDAMENTO Non ridifinerai mai funzioni di sistema come min
e max
Se usi min
e max
come variabili, le funzioni corrispondenti smetteranno letteralmente di funzionare!
min = 4 # NOOOO !
max = 7 # NON FARLO !
DOMANDA: dati due qualsiasi interi a
e b
, quali delle seguenti espressioni risultano equivalenti?
1. max(a,b)
2. max(min(a,b),b)
3. -min(-a,-b)
4. -max(-a,-b)
Esercizio - trasporti
✪ Una ditta dispone di un camion che usa abitualmente per effettuare consegne presso il suo miglior cliente. Il camion può trasportare 10 tonnellate di materiale, ma sfortunatamente le strade che può percorrere hanno dei tratti su ponti che limitano il tonnellaggio massimo. Questi limiti sono indicati in 5 variabili:
p1,p2,p3,p4,p5 = 7,2,4,3,6
Il camion deve sempre percorrere il ponte p1
, poi per il tragitto vi sono a disposizione tre itinerari possibili:
Nel primo itinerario, il camion percorre anche il ponte
p2
Nel secondo itinerario, il camion percorre anche i ponti
p3
ep4
Nel terzo itinerario, il camion percorre anche il ponte
p5
La ditta vuole sapere qual’è il tonnellaggio massimo che può far arrivare a destinazione con un viaggio. Scrivi del codice che stampa questo numero.
NOTA: non vogliamo sapere qual’è l’itinerario migliore, ci basta trovare il tonnellaggio massimo che possiamo far giungere a destinazione con un viaggio.
Esempio - dati:
p1,p2,p3,p4,p5 = 7,2,4,6,3
deve stampare
In un viaggio possiamo trasportare al massimo 4 tonnellate.
[50]:
p1,p2,p3,p4,p5 = 7,2,4,6,3 # 4
#p1,p2,p3,p4,p5 = 2,6,2,4,5 # 2
#p1,p2,p3,p4,p5 = 8,6,2,9,5 # 6
#p1,p2,p3,p4,p5 = 8,9,9,4,7 # 8
# scrivi qui
In un viaggio possiamo trasportare 4 tonnellate
Esercizio - divani
✪ Il magnate De Industrionis possiede due fabbriche di divani, una a Belluno e una a Rovigo. Per realizzare un divano servono tre componenti principali: un materasso, uno schienale e una copertura di stoffa. Ogni fabbrica produce tutti i componenti necessari, impiegando un certo tempo per costruire ciascun componente:
[51]:
b_mat, b_sch, b_sto, r_mat, r_sch, r_sto = 23,54,12,13,37,24
Belluno impiega 23h a produrre un materasso, 54h lo schienale e 12h la stoffa. Rovigo, rispettivamente, 13, 37 e 24 ore. Quando i 3 componenti sono pronti, assemblarli nel divano finito richiede un’ora.
Ogni tanto arrivano richieste particolari da parte di nobili facoltosi, che pretendono di vedersi consegnati nel giro di poche ore divani con modifiche stravaganti come schienali in platino massiccio e altre fesserie.
Se le due fabbriche iniziano la produzione dei componenti allo stesso tempo, De Industrionis vuole sapere in quanto tempo si produrrà il primo divano. Scrivi del codice che calcola tale numero.
NOTA 1: non ci interessa sapere quale fabbrica produrrà il divano, vogliamo solo sapere il tempo più breve nel quale si otterrà un divano
NOTA 2: supponi che entrambi le fabbriche non abbiano componenti in magazzino
NOTA 3: le due fabbriche non si scambiano componenti
Esempio 1 - dati:
b_mat, b_sch, b_sto, r_mat, r_sch, r_sto = 23,54,12,13,37,24
il tuo codice deve stampare:
il primo divano verrà prodotto in 38 ore.
Esempio 2 - dati:
b_mat, b_sch, b_sto, r_mat, r_sch, r_sto = 81,37,32,54,36,91
il tuo codice deve stampare:
il primo divano verrà prodotto in 82 ore.
[52]:
b_mat, b_sch, b_sto, r_mat, r_sch, r_sto = 23,54,12,13,37,24 # 38
#b_mat, b_sch, b_sto, r_mat, r_sch, r_sto = 81,37,32,54,36,91 # 82
#b_mat, b_sch, b_sto, r_mat, r_sch, r_sto = 21,39,47,54,36,91 # 48
# scrivi qui
il primo divano verrà prodotto in 38 ore.
Prosegui
Continua con Basi 2 - booleani
[ ]: