Basi Python - variabili e interi

Scarica zip esercizi

Naviga file online

REQUISITI:

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.

  1. 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.

  1. 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 ;-)

  1. 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?

bool

Condizione

True, False

no

int

Intero

\(\mathbb{Z}\)

no

float

Razionale

\(\mathbb{Q}\) (più o meno)

no

str

Testo

Testo

no

tuple

Sequenza

Collezione di oggetti

no

list

Sequenza

Collezione di oggetti

set

Insieme

Collezione di oggetti

dict

Mappatura

Mappatura tra oggetti

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]:
Python Tutor visualization

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):

  1. x = 1
    x
    x
    
  2. x = 1
    x = 2
    print(x)
    
  3. x = 1
    x = 2
    x
    
  4. x = 1
    print(x)
    x = 2
    print(x)
    
  5. print(zam)
    print(zam)
    zam = 1
    zam = 2
    
  6. x = 5
    print(x,x)
    
  7. x = 5
    print(x)
    print(x)
    
  8. 3 + 5 = x
    print(x)
    
  9. 3 + x = 1
    print(x)
    
  10. x + 3 = 2
    print(x)
    
  11. x = 2
    x =+ 1
    print(x)
    
  12. x = 2
    x = +1
    print(x)
    
  13. x = 2
    x += 1
    print(x)
    
  14. 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.

Mostra soluzione
[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
Mostra soluzione
[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
Mostra soluzione
[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:

  1. I nome possono solo contenere caratteri in maiuscolo/minuscolo (A-Z, a-z), numeri (0-9) o underscore _

  2. I nomi non possono iniziare con un numero

  3. i nomi di variabile dovrebbero iniziare con lettera minuscola

  4. I nomi non possono essere uguali a parole riservate

Parole riservate:

and

as

assert

break

class

continue

def

del

elif

else

except

exec

finally

for

from

global

if

import

in

is

lambda

nonlocal

not

or

pass

raise

return

try

while

with

yield

True

False

None

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

  1. my-variable

  2. my_variable

  3. theCount

  4. the count

  5. some@var

  6. MacDonald

  7. 7channel

  8. channel7

  9. stand.by

  10. channel45

  11. maybe3maybe

  12. "ciao"

  13. 'hello'

  14. as Confronta bene con i prossimi due

  15. asino

  16. As

  17. lista Confronta bene con i prossimi due

  18. list NON provare ad assegnare questo nell’interprete (scrivendo per es list = 5), renderesti l’interprete praticamente inutilizzabile!

  19. List

  20. black&decker

  21. black & decker

  22. glab()

  23. caffè (Nota la è accentata è !)

  24. ):-]

  25. €zone (Nota il segno dell’euro)

  26. some:pasta

  27. aren'tyouboredyet

  28. <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

min(x,y, ...)

il minimo tra i numeri passati

max(x,y, ...)

il massimo tra i numeri passati

abs(x)

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

math.floor(x)

arrotonda x all’intero inferiore

math.ceil(x)

arrotonda x all’intero superiore

math.sqrt(x)

la radice quadrata

math.log(x)

il logaritmo naturale di x

math.log(x,b)

il logaritmo di x in base b

… 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
Mostra soluzione
[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
Mostra soluzione
[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)
Mostra risposta

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 e p4

  • 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.
Mostra soluzione
[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.
Mostra soluzione
[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

[ ]: