Vai al contenuto

Variabili e Operatori

In questo capitolo introdurremo due fra i concetti più importanti della programmazione di base in Python. Attenzione alle definizioni e agli esempi!!!

Per rendere semplice e veloce provare i concetti appresi con un pò di codice, faremo largo uso dell'interprete. Obbligatorio provare il codice che vedete sul vostro computer.

Variabili

Una variabile è una porzione di memoria identificata tramite un identificativo univoco (nome, nell'esempio), che permette di memorizzare un valore di un qualche tipo. Vediamo alcuni semplici esempi:

>>> nome = "Pippo"
>>> print(nome)
Pippo

>>> # A me non piaccono i nomi di variabile con gli accenti o gli apostrofi...
>>> eta = 8
>>> print(eta)
8

Come si vede per definire una variabile, bisogna fare 3 cose:

  1. scegliere un nome per la variabile (ad esempio: altezza)
  2. decidere un valore da assegnargli (ad esempio: 143)
  3. assegnare alla variabile il valore tramite l'operatore =

Scriviamo un esempio:

>>> altezza = 143

I nomi delle variabili sono identificatori univoci e per esserlo devono rispettare le seguenti regole:

  • essere composto solo da numeri, lettere e underscore ( il carattere _ , ad esempio per altezza_rettangolo )
  • non contenere spazi o segni di punteggiatura (ad esempio altezza rettangolo non va bene!)
  • non essere uguale a nessuna delle parole chiave del linguaggio (ad esempio, non puoi chiamare una variabile print)

Fin qui è facile. Occhio adesso però: Python è un linguaggio Strongly Typed, il che significa che in ogni istante è sempre possibile sapere che tipo di dato c'è in una variabile.

Faccio un esempio banale, che può aiutare a capire:

>>> # "7" è una stringa, una parola
>>> prova = "7"
>>> # Python sa che prova contiene una stringa. Per noi è "7"
>>> print(prova)
7

>>> # 7 senza apici è un valore numerico, un numero
>>> prova = 7
>>> # Python adesso sa che la variabile prova contiene un numero. Per noi è 7
>>> print(prova)
7

Praticamente Python gestisce i dati creando un oggetto diverso per ogni valore: ad esempio 7 è un oggetto numerico (li studieremo tra poco, tranquilli), mentre "7" è un oggetto di tipo stringa. Sono diversi, anche se forse per noi non tanto...

Il nome della variabile non è altro che un etichetta che si appende all'oggetto (numerico, stringa o altro) che hai creato per ricordarti dove sta. E come un post-it magari sposti quest'etichetta da un oggetto ad un altro. Ecco perché la variabile prova prima si riferiva ad un oggetto stringa e poi ad un oggetto numerico. Capito?

Provo con un altro esempio, per aumentare l'entropia. Immaginate di avere un cane (nell'esempio è il valore, l'oggetto) e di chiamarlo Salsiccia. Bel nome no? "Salsiccia, vieni qui!!! Se ti prendo...".

Il concetto è: il cane è sempre un cane, se lo chiami Salsiccia non diventa un insaccato! Così gli oggetti rimangono sempre il tipo che sono (numeri, stringhe o altro) e i nomi che gli diamo (i nomi delle variabili) non cambiano quello che sono!

Se siete curiosi di sapere il tipo di dato contenuto in una variabile, potete verificarlo utilizzando la funzione predefinita type().

>>> var = 5
>>> type(var)
<class 'int'>

>>> var = 5.0
>>> type(var)
<class 'float'>

>>> var = "5"
>>> type(var)
<class 'str'>

In ognuno degli esempi proposti gli oggetti sono stati abbinati alla variabile var. Ogni volta Python è stato in grado di capire che tipo di oggetto fosse contenuto nella variabile.

Prima di procedere oltre... qualche esercizio di prova.

Esercizi semplici

Esercizio 101

Istanziare una serie di variabili per contenere il proprio nome, cognome, sesso ('M' oppure 'F'), data di nascita (giorno, mese, anno), comune di nascita, provincia (due lettere maiuscole. Ad esempio 'AN'); poi visualizzare tutti i valori contenuti nelle variabili tramite una serie di print().


Esercizio 102

Con le stesse informazioni dell'esercizio precedente, permettere all'utente di inserire i valori tramite la funzione input(). Alla fine dell'inserimento, visualizzare tutti i valori inseriti.


Esercizio 103

Ancora, con le stesse informazioni dell'esercizio 101, visualizzare tutti i tipi di dato memorizzati nelle variabili tramite l'utilizzo della funzione type().

Numeri

Python considera i seguenti tipi numerici:

Tipo Oggetto Descrizione
Numeri Interi int Rappresenta i numeri interi.
Il più grande (o più piccolo) intero rappresentabile dipende dalla quantità di memoria presente nella macchina.
Numeri Reali float Rappresenta i numeri reali, tipicamente definiti "a virgola mobile" (floating point numbers)
Sono rappresentabili numeri da -1.797693134862316 e308 a 1.797693134862316 e308
Valori Booleani bool Rappresentano i valori di verità (True oppure False) dell'algebra booleana
Sono definiti come sottotipo degli interi, dove lo zero rappresenta il valore False e gli altri valori il valore True.

Mi sembra facile da capire: un numero intero è un qualsiasi numero, positivo o negativo, senza virgola. Un numero reale è un qualsiasi numero con la virgola, solo che in Python il separatore decimale è il punto!!!.

Quindi:

a = 5     # intero
b = 5.0   # reale
# ... e così via...

I valori booleani sono solo True o False:

c = True
d = False

Gli operatori abbinati a questi tipi di dati sono elencati, con esempi e spiegazione, sotto.

Operatori Aritmetici

Non credo ci sarà molto da spiegare sul funzionamento intrinseco degli operatori seguenti, ma va fatta una importante precisazione! Il risultato di una operazione aritmetica in Python è un valore, dunque... una variabile! E Python vuole sempre sapere il tipo (oltreché il valore) delle sue variabili!!! Quindi, banalmente... quando c'è un float da qualche parte, il risultato sarà comunque float. Occhio agli esempi...


Addizione (Operatore +)

Non credo ci sia molto da spiegare su questo operatore...

>>> 2 + 2
4

>>> a = 3.0
>>> a + 4
7.0


Sottrazione (Operatore -)

Anche qui.. mi sembra facile...

>>> 4 - 5
-1

>>> b = 7.2
>>> b - 1
6.2


Moltiplicazione (Operatore *)

Tutto sommato, anche questo (operatore) dovrebbe essere semplice...

>>> 6 * 3
18

>>> c = -4.5
>>> c * 2
-9.0


Divisione (Operatore /)

E come alle elementari... qui le cose si complicano (un pò)... Fate attenzione all'operatore divisione, perché in Python il risultato di una divisione è sempre un numero reale, un float.

>>> 7 / 2
3.5

>>> 6 / 2
3.0


Divisione Intera (Operatore //)

Avendo un operatore con risultato reale, ne esiste anche uno con risultato intero. Di regola questo dovrebbe essere utilizzato con due numeri interi. Il risultato di una divisione intera è sempre un intero.

Attenzione!

I risultati di una divisione intera sono sempre interi e vengono sempre calcolati per troncamento, mai per arrotondamento!!!

>>> 7 // 2
3

>>> 6 // 2
3

>>> 39 // 10
3


Modulo (Resto divisione intera, Operatore %)

L'operatore modulo, comune a tutti i linguaggi di programmazione, serve per calcolare il resto della divisione intera fra due numeri (interi, ovviamente).

# 7 diviso 2 fa 3 col resto di 1, quindi...
>>> 7 % 2
1

# 6 diviso 2 fa 3 col resto di 0, quindi...
>>> 6 % 2
0

# 39 diviso 10 fa 3 col resto di 9, quindi...
>>> 39 % 10
9


Elevamento a potenza (Operatore )**

Questo operatore, introdotto in Python per mera comodità, esegue l'elevamento a potenza di due numeri.

>>> 7 ** 2
49

>>> 6 ** 0
1

>>> 2 ** 3
8


La priorità degli operatori aritmetici rispecchia la logica della matematica con moltiplicazione e divisione prima di addizione e sottrazione. Per i raggruppamenti si usano le parentesi tonde (()):

7 + 2 * 3           # fa 13

( 7 + 2 ) * 3       # fa 27

( 1 + 8 ) ** 1/2    # fa 4.5!!!! 1 + 8 fa 9, 9 alla 1 fa 1, 9 diviso 2 fa 4.5!!!!!

( 1 + 8 ) ** (1/2)  # fa 3.0!!!!! Okkio...

Gli esempi, scritti sopra e sotto per semplicità con i numeri interi, funzionano ovviamente con tutti i tipi numerici supportati da Python.

Operatori di confronto

Gli operatori di confronto in Python sono operatori binari il cui risultato è sempre un valore booleano!

Operatore Descrizione Esempio Risultato
== È uguale a 5 == 8 False
!= È diverso da 5 != 8 True
> È maggiore di 5 > 8 False
< È minore di 5 < 8 True
>= È maggiore o uguale a 5 >= 8 False
<= È minore o uguale a 5 <= 8 True

Operatori Logici

Gli operatori logici in Python sono operatori binari il cui risultato è sempre un valore booleano!

Operatore Descrizione Esempio Risultato
and Congiunzione logica x = 6
y = 3
x < 10 and y > 1


True
or Disgiunzione logica x = 6
y = 3
x == 5 or y == 5


False
not Negazione logica x = 6
y = 3
not (x == y)


True

Esercizi sui numeri

Alcuni esercizi semplicissimi per assicurarsi di avere ben compreso la logica dei numeri e degli operatori in Python.

Dichiarare alcune variabili:

n1 = 12
n2 = 23
r1 = 21.5
r2 = -14.0

Esercizio 121

Visualizzare i valori contenuti nelle variabili e verificare, tramite il comando type(), che effettivamente contengano rispettivamente 2 valori int e 2 valori float.


Esercizio 122

calcolare e visualizzare:

  • la somma di n1 e n2
  • la somma di n1 e r1
  • il prodotto di n1 e n2
  • il prodotto di n2 e r2
  • la divisione fra n1 e n2
  • la divisione intera fra n1 e n2
  • il resto della divisione intera fra n1 e n2
  • la divisione fra n1 e r1
  • il cubo di n2
  • n1 alla 10
  • la radice quadrata di r1 (come si fa??)

Verificare il tipo di ognuno dei risultati con la funzione type().


Esercizio 123

Visualizzare il risultato delle seguenti operazioni:

  • n1 < n2
  • n1 == r1
  • n2 != r2
  • r1 >= n2

Esercizio 124

Visualizzare il risultato delle seguenti operazioni:

  • n1 < n2 and r1 < r2
  • n1 == r1 or n2 != r2
  • not (n2 != r2)

Stringhe

Abbiamo già visto come dichiarare una qualsiasi variabile numerica; per una stringa le cose non sono affatto più difficili:

>>> nome = "Andrea"
>>> print(nome)
Andrea

In Python gli oggetti stringa sono definibili tramite l'uso degli apici. Per "semplificare" le cose, Python non fa grande differenza fra apici singoli e doppi, ma richiede coerenza nell'utilizzo.

>>> primo = "riso"
>>> print(primo)
riso

>>> secondo = 'carne'
>>> print(secondo)
carne

l'utilizzo di un tipo di apice permette di inserire con più semplicità l'altro all'interno della stringa

>>> primo = "penne all'arrabbiata"
>>> print(primo)
penne all'arrabbiata

>>> contorno = 'patate "duchessa"'
>>> print(contorno)
patate "duchessa"

Nel caso si voglia insistere ad utilizzare un solo tipo di apice, bisogna spiegare a Python quali sono quelli da intendere come semplici caratteri precedendoli con il carattere di escape backslash ( \ )

>>> dessert = "cornetti con crema \"chantilly\""
>>> print(dessert)
cornetti con crema "chantilly"

>>> frutta = 'pere \'abate\' e prugne secche'
>>> print(frutta)
pere 'abate' e prugne secche

Come si vede Python interpreta correttamente le sequenze con apici e caratteri di escape. Gli stessi possono essere utilizzati anche per scrivere caratteri non stampabili, ma utili tipograficamente:

Simbolo Descrizione
\n Capo riga
\t tabulazione

Vediamo qualche esempio per chiarezza.

>>> nome = "Andrea\nDiamantini"
>>> print(nome)
Andrea
Diamantini

>>> scuola = "Liceo\tDa Vinci\nJesi\t(AN)"
>>> print(scuola)
Liceo Da Vinci
Jesi  (AN)

Spero sia abbastanza chiaro.

Le stringhe supportano l'operatore + per la congiunzione delle stringhe e l'operatore * per la ripetizione delle stesse. Anche qui, un esempio conta più di mille parole.

>>> frutto = "ba" + "na" * 2
>>> print(frutto)
banana

>>> mitraglia = "ra" + "tta" * 10
>>> print(mitraglia) # tutti stecchiti :)
rattattattattattattattattattatta

Altra caratteristica delle stringhe in Python è che esse supportano la "concatenazione automatica per vicinanza". Provo ancora a spiegare con un esempio:

>>> gioco = "cal" "cio"
>>> print(gioco)
calcio

Se vuoi concatenare una stringa su più righe, devi usare le parentesi tonde

>>> periodoLungo = ( "Quando uno deve parlare e non ha niente da dire"
>>>                  " dice cose stupide e a volte... le scrive!" )
>>> print(periodoLungo)
Quando uno deve parlare e non ha niente da dire dice cose stupide e a volte... le scrive!

Ok, più o meno ci siamo! Qualche esercizio per assicurarsi che sia tutto chiaro e andiamo avanti :)

Esercizi sulle stringhe

Esercizio 141

Chiedere all'utente di inserire i propri dati personali (nome, cognome, indirizzo, etc), memorizzarli in opportune variabili e alla fine dell'inserimento visualizzare tutti i dati inseriti.


Esercizio 142

Data una stringa da parte dell'utente, visualizzare la stringa inserita per 18 volte in 18 righe diverse, una volta per riga (sugg: ricordate che + congiunge, "\n" va a capo e * intero ripete...)


Esercizio 143

Chiedere all'utente di inserire 2 colori, poi costruire la stringa chiamata bicolore, data dal primo colore, uno spazio, la &, un altro spazio e infine il secondo colore.

Visualizzare la stringa "bicolore".


Esercizio 144: Nome ed età

Programma che richiede all'utente prima il suo nome, poi la sua età e infine scrive la frase "Ciao NOME, hai ETA anni".

Conversioni di tipo

Quando si provano a combinare tipi di dato diversi, si può andare incontro ad errori. Ad esempio, la combinazione di numeri e stringhe da problemi di compatibilità. Vediamo un esempio:

>>> desc = "Età:"
>>> age = 42
>>> print(desc + age)
Traceback (most recent call last):
File "<pyshell>", line 3, in <module>
TypeError: can only concatenate str (not "int") to str

Se il problema è solo la stampa a video... beh, non è un problema! Basta evitare di fare la somma ed elencare le cose da stampare. Saranno visualizzate tutte in un'unica riga, finché c'è posto e con uno spazio di separazione fra esse.

>>> print (desc, age)
Età: 42

In generale comunque, se scrivi a mano i valori, non sei così... distratto da non accorgerti che stai lavorando con valori di tipo diverso. Credo che il codice che segue sia abbastanza chiaro a tutti...

>>> a = 3
>>> b = 5
>>> print(a + b)
8

Se metti i valori numerici a mano, Python si comporta bene, come ti aspetti! Il problema si pone quando si utilizza la funzione input(): essa infatti restituisce sempre e comunque una stringa, qualsiasi sia il valore passato in ingresso. Se vogliamo che questi valori siano interi o float, dobbiamo procedere ad una conversione di tipo.

>>> n = input("Numero: ") # inserisci 6
>>> m = input("Numero: ") # inserisci 4
>>> print(n + m)          # Tu pensi che scriverà 10, invece...
64

Capito cosa è successo?! Una concatenazione invece di una somma!

Per evitare questi errori dobbiamo spesso effettuare delle conversioni; le funzioni necessarie sono semplici e intuitive.

Funzione Descrizione
bool() Trasforma, se possibile, il suo argomento in un booleano, altrimenti restituisce ERRORE.
(Funziona SOLO con i numeri. 0 vale False, tutto il resto vale True)
int() Trasforma, se possibile, il suo argomento in un intero, altrimenti restituisce ERRORE
float() Trasforma, se possibile, il suo argomento in un reale, altrimenti restituisce ERRORE
str() Trasforma il suo argomento in una stringa.
Funziona sempre 😉

Vediamo alcuni esempi per capire il concetto:

# Vuoi un intero? Chiedilo esplicitamente e trasforma il valore digitato
>>> a = int( input("Inserisci un numero intero: ") )
>>> print("Hai inserito", a)
Hai inserito 4

Certo... se l'utente non digita un numero... la conversione non funziona!!! L'unica funzione di conversione che funziona sempre è str(): Tutto si può convertire in una stringa :)

Per chi fa più fatica a intuire al volo e vuole sempre conferme scritte aggiungo un semplicissimo esercizio svolto per capire in quali casi potrebbero essere utili le conversioni di tipo.

Esercizio svolto: area del rettangolo

Chiedi all'utente i valori di base e altezza e calcola l'area del rettangolo di quelle dimensioni.

# Area del rettangolo, date base e altezza dall'utente
# in un solo passaggio chiedo le variabili e le converto in float
base = float( input("Base: ") )
altezza = float( input("Altezza: ") )
area = base * altezza
print("Area = ", area)

Esecuzione del codice

Base: 4.5
Altezza: 2.5
Area = 11.25

f-strings

Arrivati a questo punto del corso, siete già quasi degli espertoni della funzione print() e avrete capito come questa possa visualizzare qualunque tipo di variabile semplicemente per elencazione. Chiarifico subito con un banale esempio:

nome = "Andrea"
anni = 18 # ;)
print("Io mi chiamo", nome, "ed ho", anni, "anni")

Se eseguite questo brillante codice vedrete scritta la frase "Io mi chiamo Andrea ed ho 18 anni" con la print che visualizza senza problemi una stringa e un intero. Se siete a vostro agio con questo tipo di scrittura... saltate questo capitolo 😎

In realtà questa modalità di visualizzare informazioni risulta un pò scomoda:

  • devi alternare stringhe "fisse" con variabili di tutti i tipi
  • devi stare attento agli spazi
  • devi ricordarti le virgole

Insomma, bene... ma non benissimo!

Python, nella speranza di fornire uno strumento più semplice, dalla versione 3.6 ha introdotto il concetto di formatted string literals, abbreviato appunto in f-strings. Qui la documentazione ufficiale.

In poche parole, queste sono stringhe precedute da una f (da cui l'abbreviazione del nome), che permettono di visualizzare variabili semplicemente indicando il loro nome dentro parentesi graffe {}. Un esempio e sarà chiarissimo:

nome = "Andrea"
anni = 28
print( f"Io mi chiamo {nome} ed ho {anni} anni" )

Adesso ho corretto l'età 😉

Come vedete, la stringa scritta in questo modo risulta più semplicemente leggibile dal programmatore, non ha le mille virgole di prima e, grazie alle parentesi graffe, evidenzia bene quale parte della stessa espone le variabili da visualizzare.

Adesso che le avete viste, sta a voi decidere se utilizzarle oppure no!

Suggerimento

Perchè non provate a togliere la f davanti per vedere cosa succede se scrivo solo:

print( "Io mi chiamo {nome} ed ho {anni} anni" )

?

Esercizi

Per ognuno dei seguenti esercizi (e da adesso in poi), creare un file denominato esXXX.py, dove XXX è il numero dell'esercizio. All'interno del file le prime righe devono essere sempre un commento contenente nome, classe ed esercizio. Ad esempio:

# Andrea Diamantini
# 2 XS
# Esercizio 100: merenda

... (poi il codice dell'esercizio) ...

Chiaro?

Al lavoro!!!

Esercizi con i numeri


Esercizio 161: somma

Permettere all'utente di inserire due valori interi e visualizzarne la somma.


Esercizio 162: prodotto

Dichiarare due variabili contenente due valori reali, visualizzarne il valore e il prodotto.


Esercizio 163: divisione intera con resto

Per ognuno dei seguenti valori di x e y, visualizzare il risultato della divisione intera con resto fra i due numeri.

Ad esempio, per x = 13 e y = 5, visualizzare:

13 / 5 = 2 con resto di 3

(fatto bene una volta, il copia e incolla è tuo amico...)

x = 12 , y = 7
x = 25 , y = 6
x = 7 , y = 7
x = 13 , y = 13
x = 4 , y = 6

Esercizio 164: area triangolo

Programma che chiede all'utente di inserire 2 valori reali per la base e l'altezza di un triangolo. Successivamente i valori inseriti vengono visualizzati e viene calcolata l'area dello stesso.


Esercizio 165: secondi trascorsi

Dati tre numeri interi, inseriti dall'utente, visualizzarli come fossero ore, minuti e secondi di un orario (esempio: 5:34:27). Considerarli dunque come hh:mm:ss di un orario determinato.

Calcolare i secondi trascorsi dalla mezzanotte del giorno prima e visualizzare il risultato a video.


Esercizio 166: parcheggio a pagamento

Sapendo che in un parcheggio la prima ora costa 2.5 € mentre tutte lo successive costano 2 €, scrivere un programma che richieda il numero complessivo delle ore di parcheggio e visualizzi il totale da pagare.


Esercizio 167: Dati personali

Programma che richiede l'immissione di alcuni dati personali di un individuo: nome, cognome, sesso (M/F), anno di nascita, altezza (in metri). Alla fine dell'inserimento vengono visualizzati i dati inseriti e viene visualizzata l'età, calcolata in base all'anno di nascita.

Esercizi con valori booleani

Esercizio 180 (svolto)

Dati due valori interi A, B, scrivere una espressione che è sempre vera quando A è minore di zero e B è maggiore di 3.

A = int(input("Inserisci A: "))
B = int(input("Inserisci B: "))
expr = (A < 0 and B >= 3)
print(expr)                      # scriverà True o False a seconda dei valori inseriti

Esercizio 181

Dati due valori interi A, B, scrivere una espressione che è sempre falsa quando A è maggiore di 4 e B è maggiore di 12.


Esercizio 182

Dati due valori interi A, B, scrivere una espressione che è sempre vera quando i segni di A e B sono discordi (cioè uno è positivo, l'altro negativo).


Esercizio 183

Dato un valore intero A, scrivere una espressione che è sempre vera quando A assume un valore pari.


Esercizio 184

Dato un valore intero A, scrivere una espressione che è sempre falsa quando A è multiplo di 5.