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 piacciono 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:
- scegliere un nome per la variabile (ad esempio: altezza)
- decidere un valore da assegnargli (ad esempio: 143)
- assegnare alla variabile il valore tramite l'operatore =
Scriviamo un esempio:
I nomi delle variabili sono identificatori univoci e per esserlo devono rispettare le seguenti regole:
- essere composto solo da lettere (a-z, A-Z), numeri (0-9) e underscore ( il carattere _ , ad esempio per
altezza_rettangolo) - non può iniziare con un numero
- non contenere spazi o caratteri speciali (ad esempio
altezza rettangolocon lo spazio, non va bene!) - non essere uguale a nessuna delle parole chiave del linguaggio (ad esempio, non puoi chiamare una variabile
print)
Python è CASE-SENSITIVE
Significa che Python fa differenza fra MAIUSCOLE e minuscole...
var , Var , VAR sono tre nomi diversi
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 è comunque 7
>>> print(prova)
7
Praticamente in Python una variabile esiste solo quando è assegnata di un valore, tramite l'operatore = (di cui parleremo fra un attimo).
Il nome scelto, con le regole descritte sopra, serve solo da etichetta per ritrovare quel valore (che... è la variabile)!!!
Se siete curiosi di sapere anche voi 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'>
Operatore di assegnazione
Adesso dico una cosa che fino a qui io ho dato per scontato e che voi non avevate ancora pensato.
In Python l'operatore = non assomiglia neanche un pò all'operatore = della matematica.
Anzi... per chi inizia a programmare, forse è l'operatore più complicato.
In matematica scrivo tranquillamente 5 + 3 = 8 e questa cosa significa che la quantità a destra è uguale alla quantità a sinistra. Infatti
potrei anche scrivere 8 = 5 + 3 e tutto avrebbe ancora perfettamente senso.
In Python qualunque delle espressioni sopra da errore:
L'operatore = in Python non serve per fare le uguaglianze ma è un operatore di assegnazione, che funziona in un modo molto preciso:
prende la quantità scritta a destra dell'operatore, la valuta (ovvero, tiene conto del valore e del tipo presenti) e la assegna al nome
di variabile che è presente a sinistra.
>>> a = 5 # prendo il valore 5 e lo assegno ad una variabile di nome a
>>> b = a # valuto il valore di a (vale 5) e lo assegno ad una variabile di nome b
>>> b # Ovviamente, b vale...
5
Invece se scrivo...
>>> 5 = c # valuto il valore di c (non so quale sia) e vorrei assegnarlo... (no no no no...)
SyntaxError...
Spero sia tutto chiaro... Prima di procedere oltre, qualche esercizio di prova.
Esercizi semplici
Esercizio 101
Definire la variabile nome con valore il proprio nome e la variabile cognome
con valore (indovina...). Visualizzare il contenuto delle variabili (con print) ed il tipo contenuto in esse (con type).
Esercizio 102
Definire le seguenti variabili:
- sesso (una lettera, 'M' oppure 'F')
- data di nascita (in realtà 3 variabili per 3 numeri: giorno, mese, anno)
- comune di nascita (ad esempio 'Senigallia')
- la provincia (2 lettere, ad esempio 'AN')
Visualizzare il contenuto delle variabili (con print) ed il tipo contenuto in esse (con type).
Esercizio 103
yyy
Esercizio 104
zzz
Numeri
Python considera i seguenti tipi numerici:
| Tipo | Oggetto | Descrizione |
|---|---|---|
| Numeri Interi | int |
I numeri interi (secondo Python). Il più grande (o più piccolo) intero rappresentabile dipende dalla quantità di memoria presente nella macchina. |
| Numeri Reali | float |
I numeri reali (secondo Python), tipicamente definiti a virgola mobile (floating point numbers) Sono rappresentabili numeri da -1.797693134862316 e308 a 1.797693134862316 e308 |
| Valori Booleani | bool |
I valori di verità dell'algebra booleana. Utilizzano i valori True oppure False. |
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:
I valori booleani sono solo True o 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...
Sottrazione (Operatore -)
Anche qui.. mi sembra facile...
Moltiplicazione (Operatore *)
Tutto sommato, anche questo (operatore) dovrebbe essere semplice...
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.
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!!!
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.
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.
Esercizio 121
Definire una variabile intera, con un numero a scelta e una variabile reale, anch'essa a piacere. Visualizzare nome, valore e tipo.
Esercizio 122
Definire le variabili n1,n2 contenenti due nuemri interi a piacere. Calcolare:
- n1 + n2
- n1 - n2
- n1 * n2
- n1 / n2
- n1 // n2
- n1 % n2
- n1 ** n2
Verificare il tipo di ognuno dei risultati con la funzione type().
Esercizio 123
Definire le variabili r1,r2 contenenti due numeri reali a piacere. Calcolare:
- r1 + r2
- r1 - r2
- r1 * r2
- r1 / r2
- r1 ** r2
Verificare il tipo di ognuno dei risultati con la funzione type().
Esercizio 124
Definire le variabili p, q contenenti due numeri interi a piacere. Calcolare:
- p < q
- p == q
- p != q
- p >= q
Esercizio 125
Definire le variabili a, b, c contenenti tre numeri reali a piacere. Calcolare:
- a < b and b < c
- a == b or a != c
- not (a != b)
Stringhe
Abbiamo già visto come dichiarare una qualsiasi variabile numerica; per una stringa le cose non sono affatto più difficili:
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.
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:
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
Alcuni semplici esercizi di comprensione sulle stringhe
Esercizio 141
Definire due variabili contenenti rispettivamente il nome e il cognome di una persona.
Definire la variabile NomeCompleto formata dalla sequenza 'sig.' (o 'sig.ra') + uno spazio + il nome + uno spazio + il cognome.
Visualizzare le stringhe nome, cognome e NomeCompleto in righe diverse
Esercizio 142
Definita la stringa
visualizzare la stringa per 18 volte in 18 righe diverse, una volta per riga (sugg: ricordate che + congiunge, "\n"
va a capo e * intero ripete...)
Esercizio 143
Definire la variabile colore1 con un colore a scelta. Ripetere l'operazione per colore2.
Definire la stringa bicolore data dal primo colore, uno spazio, la &, un altro
spazio e infine il secondo colore.
Visualizzare la stringa così definita.
Esercizio 144: Nome ed età
Definire la variabile nome con il proprio nome e la variabile eta con il numero intero che rappresenta la propria età.
Visualizzare la frase "Mi chiamo NOME ed ho ETA anni" ovviamente sostituendo opportunatamente le parole maiuscole con i valori
delle variabili definite.
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:
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:
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" )
?
Input valori
La seconda istruzione Python che andiamo a introdurre si chiama input e permette all'utente, ovvero colui
che esegue il programma, di inserire un valore. Vediamo un esempio:
# la funzione input permette a chi utilizza il programma di inserire informazioni
nome = input("Come ti chiami? ")
print("Ciao", nome)
Quando si esegue questo codice vedremo qualcosa tipo:
Come ti chiami? Andrea
Ciao Andrea
Faccio un'altra prova, giusto per essere sicuro che abbiamo capito:
Mi sembra una istruzione davvero semplice... purtroppo l'errore è dietro l'angolo...
>>> n = input("Numero: ") # inserisci 6
>>> m = input("Numero: ") # inserisci 4
>>> print(n + m) # Tu pensi che scriverà 10, invece...
64
Python non è diventato matto stamattina... la funzione input restituisce sempre e solo stringhe, come possiamo verificare
con la funzione type:
Capito cosa è successo?! Una concatenazione invece di una somma!
Per evitare questi errori dobbiamo spesso effettuare delle conversioni di tipo; le funzioni necessarie sono semplici e intuitive.
| Funzione | Descrizione |
|---|---|
bool() |
Trasforma, se possibile, il suo argomento in un booleano. ( 0, 0.0 e "" valgono 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
>>> type(a)
<class 'int'>
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
print("Area rettangolo, date base e altezza")
base = float( input("Base: ") )
altezza = float( input("Altezza: ") )
area = base * altezza
print(f"Area rettangolo = {area}")
Esecuzione del codice
Area rettangolo, date base e altezza
Base: 4.5
Altezza: 2.5
Area rettangolo = 11.25
Esercizi finali
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:
Chiaro?
Al lavoro!!!
Esercizio 161
Definire le seguenti variabili: la stringa nome, l'intero eta, il booleano motorino. Visualizzare il loro contenuto con a fianco il tipo di dato rappresentato.
Esercizio 162
Chiedere all'utente di inserire una stringa per il colore di un tavolino; un intero per la sua altezza in cm; un reale per il suo peso in Kg. Visualizzare tutti i dati inseriti.
Esercizio 163
Permettere all'utente di inserire due valori interi e visualizzarne la somma.
Esercizio 164
Dichiarare due variabili contenente due valori reali, visualizzarne il valore e il prodotto.
Esercizio 165
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...)
Esercizio 166
Chiedere all'utente di inserire 2 valori reali per la base e l'altezza di un triangolo. Visualizzare i valori inseriti e calcolare l'area del triangolo avente tali misure.
Esercizio 167
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 168
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 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.