1 / 1
Indice della lezione

Capitolo 1 - I fondamenti di Python

Al termine di questo capitolo sarai in grado di:

  • spiegare che cos'è Python e come viene eseguito un programma;
  • utilizzare la REPL per fare prove rapide;
  • creare e utilizzare variabili;
  • riconoscere i principali tipi di dato;
  • scegliere nomi corretti e leggibili per le variabili;
  • lavorare con stringhe, indici e slicing;
  • usare i principali metodi delle stringhe;
  • eseguire operazioni matematiche;
  • convertire valori da un tipo all'altro;
  • acquisire dati tramite input();
  • utilizzare confronti, operatori logici e operatori di appartenenza;
  • formattare correttamente l'output con le f-string;
  • combinare questi elementi in un piccolo programma completo.

1.1 Che cos'è Python?

Python è un linguaggio di programmazione general purpose, cioè progettato per essere utilizzato in moltissimi contesti.

È nato all'inizio degli anni Novanta per iniziativa di Guido van Rossum e nel corso degli anni è diventato uno dei linguaggi più utilizzati.

Python viene impiegato, tra gli altri, per:

  • sviluppo web;
  • automazione;
  • scripting;
  • analisi dei dati;
  • intelligenza artificiale e machine learning;
  • sviluppo di applicazioni;
  • Internet of Things;
  • test e strumenti di supporto.

Una delle ragioni del suo successo è la particolare attenzione dedicata alla leggibilità del codice.

Python è un linguaggio ad alto livello

Un linguaggio ad alto livello permette al programmatore di esprimere le proprie intenzioni utilizzando costrutti relativamente vicini al linguaggio umano e lontani dai dettagli dell'hardware.

Per esempio:

total = price * quantity

è molto più immediato da comprendere rispetto alla gestione manuale delle istruzioni macchina necessarie per ottenere lo stesso risultato.

Python è multipiattaforma

Lo stesso programma Python può essere eseguito, con gli opportuni strumenti, su:

  • Windows;
  • Linux;
  • macOS.

Python è a tipizzazione dinamica

In Python non è necessario dichiarare esplicitamente il tipo di una variabile prima di assegnarle un valore:

age = 25
name = "Mario"
price = 9.90

Python determina il tipo a partire dal valore assegnato.

Questo non significa che Python sia "senza tipi": ogni valore ha comunque un tipo.

Un chiarimento sul termine "interpretato"

Per ragioni didattiche si dice spesso che Python è un linguaggio "interpretato". È una semplificazione utile per iniziare: normalmente scriviamo il codice sorgente e lo affidiamo all'interprete Python, senza dover produrre manualmente un eseguibile nativo prima dell'esecuzione.

L'implementazione più comune, CPython, utilizza comunque una fase intermedia di compilazione in bytecode.

Per ora è sufficiente ricordare il concetto pratico:

Scriviamo codice Python e lo eseguiamo attraverso l'interprete Python.


📝 Esercizi --- Che cos'è Python?

Esercizio 1 --- Vero o falso

Indica se le seguenti affermazioni sono vere o false.

  1. Python può essere utilizzato per l'analisi dei dati.
  2. Python funziona soltanto su Linux.
  3. In Python ogni valore ha un tipo.
  4. In Python è sempre obbligatorio dichiarare il tipo di una variabile.
  5. La leggibilità del codice è uno dei punti di forza di Python.

Esercizio 2 --- Ragiona sul linguaggio

Indica almeno tre ambiti nei quali Python può essere utilizzato.

Esercizio 3 --- Tipizzazione dinamica

Cosa succede secondo te al termine di questo programma?

value = 10
value = "Python"

1.2 Installare Python e preparare l'ambiente

Per programmare in Python servono principalmente:

  1. l'interprete Python;
  2. un editor o un ambiente di sviluppo.

Il sito ufficiale di riferimento è:

https://www.python.org/

Dopo l'installazione possiamo verificare la versione disponibile dal terminale:

python --version

Su alcuni sistemi il comando è:

python3 --version

La versione esatta dipende dall'ambiente utilizzato.

File Python

Un programma Python viene normalmente salvato in un file con estensione:

.py

Per esempio:

hello.py

Un file Python è semplicemente un file di testo contenente istruzioni Python.


1.3 Il primo programma

Il primo programma può essere estremamente semplice:

print("Hello, World!")

La funzione print() visualizza un valore sullo standard output.

Possiamo naturalmente utilizzare una frase italiana:

print("Benvenuto nel corso di Python!")

Eseguire un file

Se il file si chiama hello.py, dal terminale possiamo eseguire:

python hello.py

oppure, quando necessario:

python3 hello.py

La REPL

Python mette a disposizione anche una console interattiva chiamata REPL:

Read -- Eval -- Print -- Loop

La REPL legge un'istruzione, la valuta, mostra il risultato e torna in attesa di una nuova istruzione.

Esempio:

>>> 2 + 3
5
>>> 10 * 5
50
>>> print("Ciao Python")
Ciao Python

La REPL è particolarmente utile per:

  • sperimentare;
  • verificare rapidamente il comportamento di un'istruzione;
  • provare un metodo;
  • controllare il risultato di un'espressione;
  • fare piccoli calcoli.

REPL o file .py?

La REPL è ottima per esperimenti veloci.

Un file .py è invece più adatto quando vogliamo:

  • conservare il programma;
  • modificarlo;
  • riutilizzarlo;
  • condividerlo;
  • costruire applicazioni più grandi.

📝 Esercizi --- Primi programmi

Esercizio 4 --- Primo contatto con la REPL

Apri la REPL ed esegui:

2 + 3

poi:

10 * 7

e infine:

100 / 4

Osserva i risultati.

Esercizio 5 --- Primo file

Crea un file chiamato hello.py che visualizzi:

Benvenuto nel corso di Python!

Aggiungi poi una seconda riga contenente il tuo nome.

Esercizio 6 --- Espressioni

Prova nella REPL:

7 + 3 * 2

e poi:

(7 + 3) * 2

I risultati sono uguali? Perché?


1.4 Scrivere codice leggibile: lo spirito "pythonico"

Python non punta soltanto a permettere di scrivere programmi funzionanti. Punta anche a rendere il codice leggibile.

Puoi visualizzare lo Zen di Python con:

import this

Tra i principi più importanti troviamo idee come:

  • la semplicità è preferibile alla complessità;
  • la leggibilità conta;
  • dovrebbe esserci un modo ovvio per fare le cose.

Non è necessario imparare a memoria lo Zen di Python. È però utile farne propria l'idea principale:

Il codice deve essere scritto prima di tutto per essere compreso dalle persone.

Per esempio, questo codice è tecnicamente possibile:

x = 12
y = 5
z = x * y

ma, in un programma reale, questo è spesso più leggibile:

item_price = 12
item_quantity = 5
total_cost = item_price * item_quantity

Il secondo esempio comunica immediatamente il significato dei dati.


📝 Esercizio --- Dai un significato al codice

Riscrivi il seguente codice utilizzando nomi più descrittivi:

a = 7.50
b = 4
c = a * b

1.5 Variabili e assegnazione

Una variabile è un nome associato a un valore.

Per creare una variabile utilizziamo l'operatore di assegnazione:

nome = valore

Esempio:

name = "Mario"
age = 25

Abbiamo creato due variabili:

  • name contiene la stringa "Mario";
  • age contiene l'intero 25.

Possiamo utilizzare le variabili successivamente:

name = "Mario"
age = 25

print(name)
print(age)

Output:

Mario
25

L'operatore = non significa "uguale"

Questa distinzione è fondamentale.

In matematica:

x = 10

può essere letto come "x è uguale a 10".

In Python, è più corretto leggerlo come:

assegna il valore 10 alla variabile x.

Per esempio:

x = 10
x = 20

Dopo la seconda istruzione, x contiene 20.


Le variabili possono cambiare valore

Python consente di riassegnare una variabile:

score = 10
print(score)

score = 20
print(score)

Output:

10
20

Il nome score continua a essere lo stesso, ma ora è associato a un valore diverso.


1.6 Tipi di dato fondamentali

Ogni valore in Python ha un tipo.

I quattro tipi fondamentali che utilizzeremo più spesso all'inizio sono:

Tipo Nome Esempio


int intero 42 float numero decimale 3.14 str stringa "Python" bool booleano True

int

Rappresenta numeri interi:

age = 25
quantity = 100
temperature = -3

float

Rappresenta numeri in virgola mobile:

price = 9.99
weight = 2.5
temperature = 18.75

In Python il separatore decimale è il punto, non la virgola:

price = 9.99

non:

price = 9,99

Quest'ultima espressione ha infatti un significato diverso in Python.

str

Una stringa rappresenta testo:

name = "Mario"
product = 'Milk'

Possiamo utilizzare sia gli apici singoli sia le virgolette doppie.

bool

Un booleano può assumere soltanto due valori:

True
False

Attenzione alle maiuscole: in Python si scrive True, non true.

Esempio:

is_available = True
is_closed = False

1.7 Controllare il tipo con type()

La funzione type() permette di conoscere il tipo di un valore:

age = 25
print(type(age))

Output:

<class 'int'>

Altri esempi:

print(type(3.14))
print(type("Python"))
print(type(True))

Possiamo utilizzarla anche con le variabili:

price = 9.99
print(type(price))

Type hints: una prima introduzione

Python permette di aggiungere indicazioni sul tipo atteso:

age: int = 25
price: float = 9.99
name: str = "Mario"

Queste indicazioni sono chiamate type hints o annotazioni di tipo.

Sono utili per:

  • documentare il codice;
  • aiutare l'editor;
  • migliorare l'analisi statica;
  • rendere più chiaro il significato delle variabili.

È importante però capire che:

un type hint non trasforma Python in un linguaggio a tipizzazione statica e, da solo, non impedisce di assegnare un valore di tipo diverso.


📝 Esercizi --- Variabili e tipi

Esercizio 7 --- Crea le variabili

Definisci:

item_name = "Eggs"
item_price = 3.99
item_stock_quantity = 120
in_stock = True

Stampa tutte le variabili.

Esercizio 8 --- Controlla i tipi

Per ciascuna variabile dell'esercizio precedente stampa anche il tipo usando type().

Esercizio 9 --- Riassegnazione

Scrivi:

score = 10

poi assegna 25 alla stessa variabile e stampa il risultato.

Esercizio 10 --- Type hints

Riscrivi le quattro variabili dell'esercizio 7 utilizzando type hints.


1.8 Come scegliere i nomi delle variabili

Un buon nome rende il codice più facile da capire.

Python impone alcune regole sintattiche.

Un nome può iniziare con:

  • una lettera;
  • _.

Non può iniziare con un numero.

Sono validi:

item_name = "Apple"
_price = 0.99
item1_quantity = 10

Non sono validi:

2item = "Apple"
5_price = 10

Lettere, numeri e underscore

Dopo il primo carattere possiamo utilizzare lettere, numeri e underscore:

item1_quantity = 10

Non possiamo usare il trattino:

item-name = "Orange"

Il simbolo - viene interpretato come operatore di sottrazione.

Python distingue maiuscole e minuscole

Le seguenti variabili sono diverse:

item = "Milk"
Item = "Bread"
ITEM = "Eggs"

Python è quindi case-sensitive.

Evitare le parole chiave

Python possiede parole riservate che hanno un significato speciale nella sintassi del linguaggio, come:

if
else
for
while
class
return
import

Non possono essere utilizzate come normali nomi di variabile.

È inoltre fortemente consigliato non sovrascrivere i nomi di funzioni integrate che utilizzeremo, come print, type o input.

Per esempio, evitare:

print = 5

perché in seguito print() non sarà più disponibile come previsto.

snake_case

La convenzione più comune per le variabili Python è snake_case:

user_name = "Alice"
total_price = 15.75
items_in_stock = 230

È preferibile a nomi poco descrittivi come:

x = 15.75
a = 230

quando il significato può essere espresso in modo chiaro.


📝 Esercizi --- Nomi delle variabili

Esercizio 11 --- Individua i nomi validi

Quali dei seguenti nomi sono validi?

total_price
2price
user-name
user_name
_price
class
item2

Esercizio 12 --- Correggi i nomi

Correggi:

user Name = "Mario"
item-price = 3.50
2items = 20

Esercizio 13 --- Migliora il codice

Rendi più leggibili:

a = "Bread"
b = 4.52
c = 230

1.9 Utilizzare le variabili nei calcoli

Una variabile diventa davvero utile quando possiamo utilizzarla nelle espressioni.

Esempio:

item_price = 0.50
item_quantity = 100

total_cost = item_price * item_quantity

print(total_cost)

Il risultato è:

50.0

Abbiamo separato i dati dal calcolo:

prezzo × quantità = totale

Questa è una delle idee fondamentali della programmazione.

Un esempio più completo

item_name = "Cupcakes"
item_price = 0.50
item_quantity = 100

total_cost = item_price * item_quantity

print("Item:", item_name)
print("Price:", item_price)
print("Quantity:", item_quantity)
print("Total cost:", total_cost)

Attenzione alle variabili non definite

Una variabile deve essere assegnata prima di essere utilizzata:

print(total_cost)

se total_cost non è stata precedentemente definita, produce un errore:

NameError

La regola pratica è semplice:

Prima crea il dato, poi utilizzalo.


📝 Esercizi --- Variabili nei calcoli

Esercizio 14 --- Totale di un acquisto

Definisci:

item_name = "Soda"
item_price = 6.99
purchase_quantity = 5

Calcola:

total_cost = item_price * purchase_quantity

e stampa tutti i dati.

Esercizio 15 --- Prezzo e quantità

Un prodotto costa 2.75 € e ne vengono acquistati 8.

Calcola il totale usando due variabili.


1.10 Operatori aritmetici

Python mette a disposizione i normali operatori matematici.

Operatore Significato Esempio


+ somma 5 + 2 - sottrazione 5 - 2 * moltiplicazione 5 * 2 / divisione 5 / 2 // divisione intera 5 // 2 % resto 5 % 2 ** potenza 5 ** 2

Somma, sottrazione e moltiplicazione

a = 5
b = 2

print(a + b)
print(a - b)
print(a * b)

Output:

7
3
10

Divisione /

L'operatore / esegue la divisione:

print(5 / 2)

Risultato:

2.5

Divisione intera //

L'operatore // restituisce il quoziente intero della divisione:

print(7 // 3)

Risultato:

2

Resto %

L'operatore % restituisce il resto:

print(7 % 3)

Risultato:

1

È molto utile, per esempio, per verificare se un numero è pari:

number = 8
print(number % 2)

Se il risultato è 0, il numero è pari.

Potenza **

print(2 ** 3)

Risultato:

8

1.11 Precedenza degli operatori

Python applica le normali regole di precedenza.

Per esempio:

result = 10 + 5 * 2

produce:

20

perché la moltiplicazione viene eseguita prima della somma.

Le parentesi permettono di rendere esplicito l'ordine:

result = (10 + 5) * 2

che produce:

30

Una buona pratica è utilizzare le parentesi quando aiutano a rendere evidente l'intenzione del programmatore.


📝 Esercizi --- Operatori

Esercizio 16 --- Calcolatrice

Dati:

a = 10
b = 3

stampa:

  • somma;
  • differenza;
  • prodotto;
  • divisione;
  • divisione intera;
  • resto;
  • potenza.

Esercizio 17 --- Pari o dispari

Dato:

number = 17

usa % per stabilire se il numero è pari o dispari.

Esercizio 18 --- Precedenza

Calcola separatamente:

10 + 5 * 2

e:

(10 + 5) * 2

Spiega la differenza.


1.12 Stringhe

Una stringa è una sequenza di caratteri.

Possiamo crearla con apici singoli:

name = 'Python'

oppure con virgolette doppie:

name = "Python"

Entrambe le forme sono valide.

Le stringhe possono contenere:

  • lettere;
  • numeri;
  • spazi;
  • simboli;
  • caratteri speciali.

Esempio:

message = "Benvenuto al corso di Python!"

1.13 Caratteri speciali ed escape sequence

Le stringhe possono contenere sequenze speciali precedute da \.

Le più comuni sono:

Sequenza Significato


\n nuova riga \t tabulazione \" virgolette doppie \' apice singolo \\ backslash

Esempio:

print("Hello\nWorld")

Output:

Hello
World

Tabulazione:

print("Item:\tMilk")

Virgolette:

print("She said: \"Hello\"")

Backslash:

print("C:\\Users\\Mario")

1.14 Raw string

Quando dobbiamo scrivere stringhe contenenti molti backslash, può essere comodo utilizzare una raw string:

path = r"C:\Users\Mario\Documenti"
print(path)

La r davanti alla stringa indica che il contenuto deve essere trattato, per quanto riguarda le sequenze di escape, come una raw string.

È particolarmente utile per:

  • percorsi Windows;
  • espressioni regolari, che vedremo più avanti.

📝 Esercizi --- Stringhe ed escape

Esercizio 19 --- Due righe

Stampa:

Ciao
Python!

utilizzando una sola stringa e \n.

Esercizio 20 --- Tabulazione

Produci un output simile a:

Nome:   Mario
Età:    25

utilizzando \t.

Esercizio 21 --- Percorso

Stampa:

C:\Users\Studente\Desktop\python

prima utilizzando \\, poi utilizzando una raw string.


1.15 Concatenazione di stringhe

Possiamo unire due stringhe usando +:

first = "Hello"
second = "World"

message = first + " " + second

print(message)

Output:

Hello World

La concatenazione funziona tra stringhe.

Non possiamo invece concatenare direttamente una stringa e un numero:

age = 25
print("Age: " + age)

Questo produce un TypeError.

Dovremmo convertire il numero in stringa:

print("Age: " + str(age))

Ma esiste un modo ancora più leggibile, che vedremo tra poco: le f-string.

Ripetizione delle stringhe

L'operatore * può essere utilizzato con una stringa e un intero:

print("Ha" * 3)

Output:

HaHaHa

1.16 Lunghezza e indicizzazione delle stringhe

Una stringa è una sequenza. Ogni carattere occupa una posizione chiamata indice.

Consideriamo:

word = "Apple"

Gli indici sono:

 A   p   p   l   e
 0   1   2   3   4

L'indicizzazione in Python parte da 0.

Possiamo accedere a un carattere con:

print(word[0])

Output:

A

L'ultimo carattere può essere ottenuto utilizzando l'indice negativo -1:

print(word[-1])

Output:

e

Gli indici negativi partono dalla fine:

 A    p    p    l    e
-5   -4   -3   -2   -1

len()

La funzione len() restituisce il numero di caratteri:

word = "Python"
print(len(word))

Risultato:

6

Gli spazi vengono conteggiati:

text = "Ciao mondo"
print(len(text))

La lunghezza comprende anche lo spazio.


📝 Esercizi --- Indicizzazione

Esercizio 22 --- Primo e ultimo carattere

Dato:

grocery_item = "Milk"

stampa:

  • il primo carattere;
  • l'ultimo carattere.

Esercizio 23 --- Lunghezza

Chiedi una parola all'utente e stampa:

La parola contiene X caratteri

Esercizio 24 --- Indici

Data:

word = "Programmazione"

stampa:

  1. il primo carattere;
  2. l'ultimo carattere;
  3. il terzo carattere;
  4. il penultimo carattere.

1.17 Slicing

Lo slicing permette di estrarre una parte di una sequenza.

La sintassi fondamentale è:

string[start:end]

L'indice start è incluso.

L'indice end è escluso.

Per esempio:

fruit = "Strawberries"
print(fruit[0:5])

produce:

Straw

Perché vengono considerati gli indici:

0 1 2 3 4
S t r a w

ma non l'indice 5.

Omettere start

word = "Python"
print(word[:3])

Risultato:

Pyt

Omettere end

print(word[2:])

Risultato:

thon

Copiare una stringa

copy = word[:]

Step

La sintassi completa è:

string[start:end:step]

Per esempio:

word = "Python"
print(word[::2])

Prende un carattere ogni due.

Invertire una stringa

Un esempio molto utile:

word = "Pizza"
print(word[::-1])

Risultato:

azziP

1.18 Slicing e concatenazione insieme

Possiamo estrarre parti di stringhe e poi unirle.

Esempio:

item = "Chocolate"
short = item[:5] + "..."

print(short)

Output:

Choco...

Possiamo anche lavorare su un testo più lungo:

grocery_items = "milk, eggs, cheese, bread, apples"

dairy1 = grocery_items[0:4]
dairy2 = grocery_items[12:18]
bakery1 = grocery_items[20:25]

message = (
    "We have dairy and bakery items: "
    + dairy1
    + ", "
    + dairy2
    + ", and "
    + bakery1
    + " in aisle 5"
)

print(message)

In questo caso lo slicing è stato utilizzato per estrarre porzioni precise della stringa.

Nella programmazione reale, se il testo ha una struttura variabile, non è generalmente una buona idea affidarsi a indici fissi. In questo capitolo lo facciamo intenzionalmente per imparare lo slicing.


📝 Esercizi --- Slicing

Esercizio 25 --- Estrazioni

Dato:

word = "Programming"

estrai:

  • i primi quattro caratteri;
  • gli ultimi tre;
  • i caratteri dal terzo al settimo.

Esercizio 26 --- Stringa inversa

Dato:

word = "Python"

crea una nuova stringa contenente la parola al contrario.

Esercizio 27 --- Costruisci una parola

Dati:

a = "spaghetti"
b = "gelato"

usa slicing e concatenazione per costruire:

spato

1.19 I principali metodi delle stringhe

Le stringhe possiedono numerosi metodi integrati.

Consideriamo:

text = "  Python è Fantastico  "

.upper()

Converte in maiuscolo:

print(text.upper())

.lower()

Converte in minuscolo:

print(text.lower())

.capitalize()

Rende maiuscola la prima lettera:

print(text.capitalize())

.title()

Converte il testo in formato titolo:

print(text.title())

.swapcase()

Inverte maiuscole e minuscole:

print(text.swapcase())

.strip()

Rimuove gli spazi all'inizio e alla fine:

clean_text = text.strip()

Esistono anche:

text.lstrip()
text.rstrip()

che rimuovono rispettivamente gli spazi a sinistra e a destra.

.replace()

Sostituisce una parte della stringa:

text = "Python è Fantastico"
print(text.replace("Fantastico", "Potente"))

.find()

Cerca una sottostringa e restituisce la posizione della prima occorrenza:

text = "Ciao mondo"
print(text.find("mondo"))

Se il testo non viene trovato, find() restituisce -1.

.count()

Conta quante volte compare una sottostringa:

text = "banana"
print(text.count("a"))

.startswith() e .endswith()

Permettono di verificare l'inizio e la fine di una stringa:

filename = "documento.pdf"

print(filename.startswith("doc"))
print(filename.endswith(".pdf"))

Questi metodi restituiscono booleani.


1.20 Le stringhe sono immutabili

Questo concetto è importante.

Le stringhe Python sono immutabili: un metodo come .upper() non modifica direttamente la stringa originale.

Per esempio:

text = "python"
text.upper()

print(text)

stampa ancora:

python

Per conservare il risultato dobbiamo assegnarlo:

text = text.upper()
print(text)

Ora otteniamo:

PYTHON

Questa caratteristica spiega perché spesso vediamo codice come:

text = text.strip()
text = text.lower()

📝 Esercizi --- Metodi delle stringhe

Esercizio 28 --- Pulizia

Dato:

text = "  Python è Divertente  "
  1. rimuovi gli spazi;
  2. converti in maiuscolo;
  3. sostituisci "Divertente" con "Potente".

Esercizio 29 --- Ricerca

Dato:

text = "Python è un linguaggio potente"

usa .find() per trovare la posizione di "linguaggio".

Esercizio 30 --- Verifica

Dato:

filename = "report.pdf"

verifica con .endswith() se il file è un PDF.


1.21 Conversione dei tipi

La conversione di tipo, o casting, permette di trasformare un valore in un altro tipo quando la conversione è possibile.

Le funzioni più utilizzate sono:

Funzione Risultato


int() intero float() numero decimale str() stringa bool() booleano

Da stringa a intero

number = int("42")

Ora number è un intero.

Da stringa a float

price = float("3.99")

Da numero a stringa

age = 25
text = str(age)

Questo è utile quando dobbiamo combinare un numero con testo attraverso concatenazione:

age = 25
print("Age: " + str(age))

Conversioni non valide

Non tutte le conversioni sono possibili:

number = int("abc")

produce un ValueError, perché "abc" non rappresenta un intero valido.


1.22 input(): leggere dati dall'utente

La funzione input() permette di leggere un valore inserito dall'utente:

name = input("Inserisci il tuo nome: ")
print("Ciao", name)

Un dettaglio fondamentale:

input() restituisce sempre una stringa.

Anche se l'utente digita:

25

Python riceve:

"25"

e non:

25

Per questo, se vogliamo eseguire operazioni numeriche, dobbiamo convertire il valore.

age = int(input("Inserisci l'età: "))
print(age + 1)

Per un numero decimale:

price = float(input("Inserisci il prezzo: "))

Un errore molto comune

Questo codice non funziona come potremmo aspettarci:

number = input("Inserisci un numero: ")
print(number + 1)

number è una stringa, quindi Python non può sommare direttamente una stringa e un intero.

La correzione è:

number = int(input("Inserisci un numero: "))
print(number + 1)

📝 Esercizi --- Input e conversioni

Esercizio 31 --- Anagrafica

Chiedi:

  • nome;
  • età.

Stampa:

Ciao Marco, hai 20 anni

Esercizio 32 --- Età futura

Chiedi l'età e stampa quanti anni avrà l'utente tra 5 anni.

Esercizio 33 --- Due numeri

Chiedi due numeri interi e stampa:

  • somma;
  • differenza;
  • prodotto;
  • divisione.

Esercizio 34 --- Prezzo

Chiedi un prezzo e una quantità, convertendo correttamente i dati, poi calcola il totale.


1.23 Confronti e valori booleani

I confronti producono valori booleani.

Gli operatori principali sono:

Operatore Significato


== uguale != diverso > maggiore < minore >= maggiore o uguale <= minore o uguale

Esempio:

age = 20

print(age >= 18)

Risultato:

True

Attenzione a = e ==

Sono due operatori diversi.

age = 20

assegna 20 a age.

age == 20

chiede invece:

age è uguale a 20?

Il risultato è un booleano.


1.24 Un esempio con la disponibilità di magazzino

Immaginiamo di voler sapere se un prodotto è sotto la soglia minima:

milk_quantity = 12
low_stock_threshold = 10

low_stock = milk_quantity <= low_stock_threshold

print("Is the item low in stock?", low_stock)

Il risultato è:

Is the item low in stock? False

Se milk_quantity fosse 10, il risultato sarebbe True, perché abbiamo utilizzato <=.


📝 Esercizi --- Booleani e confronti

Esercizio 35 --- Sconto

Dato:

total_cost = 25.00

crea una variabile booleana che indichi se il cliente ha diritto allo sconto quando il totale è almeno 20.00.

Esercizio 36 --- Confronti

Per:

number = 15

crea espressioni che verifichino:

  • se è maggiore di 10;
  • se è uguale a 15;
  • se è diverso da 20;
  • se è minore o uguale a 15.

1.25 Operatori logici

I confronti diventano molto potenti quando possiamo combinarli.

Gli operatori logici principali sono:

and
or
not

and

Richiede che entrambe le condizioni siano vere:

age = 30

result = age >= 18 and age <= 65
print(result)

Il risultato è True.

or

È sufficiente che almeno una condizione sia vera:

day = "Saturday"

is_weekend = day == "Saturday" or day == "Sunday"

not

Inverte un valore booleano:

is_closed = False
print(not is_closed)

Risultato:

True

1.26 Combinare condizioni

Possiamo costruire condizioni più significative.

Esempio:

stock = 50
minimum_stock = 10
on_sale = False

promotion = not on_sale and stock >= minimum_stock

print(promotion)

Analizziamo l'espressione un pezzo alla volta:

not on_sale

produce True, perché on_sale vale False.

Poi:

stock >= minimum_stock

produce True, perché 50 >= 10.

Infine:

True and True

produce:

True

Questa tecnica è molto importante: costruire una condizione complessa partendo da condizioni semplici.


📝 Esercizi --- Operatori logici

Esercizio 37 --- Fascia di età

Dato:

age = 35

verifica se l'età è compresa tra 18 e 65 anni.

Esercizio 38 --- Weekend

Dato:

day = "Sunday"

verifica se è sabato oppure domenica.

Esercizio 39 --- Promozione

Un prodotto può essere promosso se:

  • non è già in saldo;
  • ha almeno 10 pezzi disponibili.

Scrivi l'espressione booleana.


1.27 Operatori di appartenenza: in e not in

Gli operatori:

in
not in

permettono di verificare se un elemento è contenuto in una sequenza o in un altro oggetto che supporta l'appartenenza.

Con le stringhe possiamo verificare la presenza di una sottostringa:

item_name = "Strawberries"

print("Straw" in item_name)

Risultato:

True

Possiamo usare anche not in:

print("Banana" not in item_name)

Attenzione alle maiuscole

Python distingue maiuscole e minuscole:

"raw" in "RAW milk"

restituisce:

False

perché "raw" e "RAW" sono stringhe diverse.

Un modo semplice per rendere il controllo indipendente dalle maiuscole è normalizzare il testo:

description = "RAW milk"

contains_raw = "raw" in description.lower()

print(contains_raw)

📝 Esercizi --- Appartenenza

Esercizio 40 --- Parole chiave

Dato:

description = "Fresh organic milk from local farms"

verifica se contiene:

  • "organic";
  • "local".

Esercizio 41 --- Negazione

Verifica che "meat" non sia presente nella descrizione.

Esercizio 42 --- Case insensitive

Modifica il programma per trovare "ORGANIC" anche se nella descrizione compare "organic".


1.28 Controllare i tipi

Possiamo usare type() anche per confrontare il tipo di un valore:

product_name = "Almond Milk"
product_price = 3.49
product_quantity = 30

print(type(product_name) == str)
print(type(product_price) == float)
print(type(product_quantity) == int)

Il risultato di ciascun confronto è un booleano.

Un caso interessante è quando il dato arriva come stringa:

product_price = "3.49"

print(type(product_price) == float)

Il risultato è:

False

Il contenuto sembra un prezzo, ma il tipo è str.

In Python moderno, quando si vuole verificare il tipo tenendo conto anche dell'ereditarietà, può essere preferibile utilizzare isinstance():

is_price_numeric = isinstance(product_price, (int, float))

Per ora è sufficiente sapere che type() permette di osservare il tipo effettivo di un valore e che isinstance() è spesso più flessibile per controllare se un oggetto appartiene a un determinato tipo o famiglia di tipi.


📝 Esercizi --- Tipi

Esercizio 43

Dati:

price = 4.50
count = 10

crea:

price_is_float
count_is_int

utilizzando type().

Esercizio 44

Dato:

price = "4.50"

verifica il tipo e spiega perché:

type(price) == float

restituisce False.


1.29 Formattare l'output con le f-string

Le f-string sono il metodo più pratico e leggibile per costruire stringhe che contengono valori.

Esempio:

name = "Anna"
age = 25

print(f"Ciao {name}, hai {age} anni")

Le variabili vengono inserite direttamente tra parentesi graffe:

{name}
{age}

Espressioni dentro una f-string

Possiamo inserire anche espressioni:

age = 25

print(f"Tra 5 anni avrai {age + 5} anni")

Output:

Tra 5 anni avrai 30 anni

Formattare numeri decimali

Supponiamo di avere:

price = 9.5

Possiamo visualizzarlo con due cifre decimali:

print(f"Prezzo: {price:.2f} €")

Output:

Prezzo: 9.50 €

La parte:

:.2f

significa che vogliamo rappresentare il numero in formato decimale con due cifre dopo il punto.

F-string contro concatenazione

Questo:

print("Price: " + str(price) + " €")

funziona, ma è meno leggibile.

Questo:

print(f"Price: {price:.2f} €")

è generalmente più chiaro.

Per questo motivo, nelle nostre esercitazioni useremo prevalentemente le f-string.


📝 Esercizi --- Formattazione

Esercizio 45 --- Anagrafica

Chiedi:

  • nome;
  • cognome;
  • età.

Stampa con una sola f-string:

Nome: Mario Rossi – Età: 25

Esercizio 46 --- Prezzo

Dato:

price = 7.5

stampa:

Prezzo: 7.50 €

Esercizio 47 --- Totale

Dati:

price = 4.25
quantity = 6

calcola il totale e visualizzalo con due cifre decimali.


1.30 Un programma completo

Ora possiamo combinare diversi concetti.

Realizziamo un piccolo programma che gestisce un acquisto.

Il programma deve:

  1. chiedere il nome del prodotto;
  2. chiedere il prezzo;
  3. chiedere la quantità;
  4. calcolare il totale;
  5. visualizzare i dati in modo leggibile.

Una possibile soluzione è:

product = input("Inserisci il prodotto: ")
price = float(input("Inserisci il prezzo: "))
quantity = int(input("Inserisci la quantità: "))

total = price * quantity

print()
print("=== RIEPILOGO ACQUISTO ===")
print(f"Prodotto: {product}")
print(f"Prezzo: {price:.2f} €")
print(f"Quantità: {quantity}")
print(f"Totale: {total:.2f} €")

Esempio di esecuzione:

Inserisci il prodotto: Pane
Inserisci il prezzo: 2.50
Inserisci la quantità: 3

=== RIEPILOGO ACQUISTO ===
Prodotto: Pane
Prezzo: 2.50 €
Quantità: 3
Totale: 7.50 €

Abbiamo utilizzato:

  • input();
  • str;
  • float;
  • int;
  • variabili;
  • moltiplicazione;
  • f-string;
  • formattazione numerica.

Questo è già un vero piccolo programma, anche se molto semplice.


1.31 Un secondo esempio: anagrafica

Possiamo applicare gli stessi concetti a un'altra situazione.

name = input("Nome: ")
surname = input("Cognome: ")
age = int(input("Età: "))

full_name = f"{name} {surname}"

print()
print(f"{full_name} ha {age} anni")
print(f"Il nome completo contiene {len(full_name)} caratteri")
print(f"L'anno prossimo avrà {age + 1} anni")

In questo esempio abbiamo anche utilizzato len() e un'espressione dentro una f-string.


1.32 Errori comuni

Imparare a programmare significa anche imparare a leggere gli errori.

NameError

Si verifica quando utilizziamo un nome che Python non conosce:

print(total)

se total non è mai stata definita.

TypeError

Si verifica quando tentiamo di eseguire un'operazione incompatibile con i tipi coinvolti:

age = 25
print("Age: " + age)

Correzione:

print("Age: " + str(age))

oppure, meglio:

print(f"Age: {age}")

ValueError

Si verifica quando una conversione riceve un valore non valido:

number = int("abc")

Python non può trasformare "abc" in un intero.

Indici fuori intervallo

L'accesso diretto a un carattere con un indice non valido produce IndexError:

word = "Hi"
print(word[5])

Lo slicing è invece più permissivo:

print(word[5:10])

restituisce semplicemente una stringa vuota.

Questa differenza è importante.


1.33 Mini-verifica

Domande teoriche

1. Che cos'è una variabile?

2. Qual è la differenza tra = e ==?

3. Quali sono i quattro tipi di dato fondamentali studiati in questo capitolo?

4. Cosa restituisce input()?

5. A cosa serve type()?

6. Qual è il primo indice di una stringa?

7. Che cosa rappresenta l'indice -1?

8. Qual è la differenza tra / e //?

9. A cosa serve %?

10. Che cosa fanno and, or e not?

11. A cosa servono in e not in?

12. Perché le stringhe vengono definite immutabili?

13. A cosa serve una f-string?

14. Che cosa significa :.2f in una f-string?

15. Qual è la differenza tra int("10") e "10"?


1.34 Esercizi di riepilogo

Esercizio 48 --- Dati di un prodotto

Crea le variabili:

item_name
item_price
items_in_stock
in_stock

utilizzando tipi appropriati.

Stampa:

Prodotto: ...
Prezzo: ... €
Disponibilità: ...
Pezzi: ...

Utilizza una f-string per ogni riga.


Esercizio 49 --- Calcolo del totale

Chiedi all'utente:

  • nome prodotto;
  • prezzo;
  • quantità.

Calcola il totale e visualizza il risultato con due cifre decimali.


Esercizio 50 --- Analisi di una parola

Chiedi una parola all'utente e visualizza:

  • lunghezza;
  • primo carattere;
  • ultimo carattere;
  • parola in maiuscolo;
  • parola al contrario.

Esempio:

Parola: Python
Lunghezza: 6
Primo carattere: P
Ultimo carattere: n
Maiuscolo: PYTHON
Al contrario: nohtyP

Esercizio 51 --- Analisi di una descrizione

Dato:

description = "Fresh organic milk from local farms"

verifica se contiene:

  • "organic";
  • "local";
  • "meat".

Stampa i tre risultati.


Esercizio 52 --- Controllo magazzino

Dati:

stock = 12
minimum_stock = 10

crea una variabile:

low_stock

che valga True quando la quantità è minore o uguale alla soglia minima.


Esercizio 53 --- Fascia di età

Chiedi l'età all'utente e verifica se è compresa tra 18 e 65 anni.

Non è necessario utilizzare if: per ora è sufficiente produrre e stampare il valore booleano.


1.35 Sfida finale --- Mini programma "Gestione prodotto"

È arrivato il momento di mettere insieme tutto ciò che abbiamo imparato.

Realizza un programma Python per la gestione di un prodotto di magazzino.

Requisiti

Il programma deve chiedere all'utente:

  1. nome del prodotto;
  2. categoria;
  3. prezzo;
  4. quantità disponibile;
  5. descrizione.

Il programma deve poi:

1. Calcolare il valore del magazzino

valore_magazzino = prezzo × quantità

2. Verificare la disponibilità

Il prodotto è disponibile se la quantità è maggiore di 0.

3. Verificare la scorta minima

Utilizza una soglia:

minimum_stock = 10

e determina se la scorta è bassa.

4. Analizzare la descrizione

Verifica se la descrizione contiene la parola:

organic

Il controllo deve funzionare anche se l'utente scrive Organic o ORGANIC.

5. Visualizzare un riepilogo

L'output deve essere leggibile e utilizzare le f-string.

Un possibile risultato è:

========================================
        SCHEDA PRODOTTO
========================================

Prodotto: Organic Milk
Categoria: Dairy
Prezzo: 3.49 €
Quantità disponibile: 25
Valore magazzino: 87.25 €

Disponibile: True
Scorta bassa: False
Prodotto organic: True
========================================

Vincoli

Per questa versione della sfida puoi utilizzare esclusivamente i concetti studiati nel capitolo:

  • variabili;
  • input();
  • int();
  • float();
  • str;
  • bool;
  • operatori aritmetici;
  • operatori di confronto;
  • and, or, not;
  • in, not in;
  • metodi delle stringhe;
  • len();
  • f-string.

Non utilizzare ancora if, for, while, liste o dizionari.

L'obiettivo è imparare a costruire un programma significativo utilizzando soltanto i mattoni fondamentali.


1.36 Soluzione guidata della sfida

Una possibile soluzione è:

product = input("Nome prodotto: ")
category = input("Categoria: ")
price = float(input("Prezzo: "))
quantity = int(input("Quantità disponibile: "))
description = input("Descrizione: ")

minimum_stock = 10

stock_value = price * quantity
available = quantity > 0
low_stock = quantity <= minimum_stock
is_organic = "organic" in description.lower()

print()
print("========================================")
print("        SCHEDA PRODOTTO")
print("========================================")
print()
print(f"Prodotto: {product}")
print(f"Categoria: {category}")
print(f"Prezzo: {price:.2f} €")
print(f"Quantità disponibile: {quantity}")
print(f"Valore magazzino: {stock_value:.2f} €")
print()
print(f"Disponibile: {available}")
print(f"Scorta bassa: {low_stock}")
print(f"Prodotto organic: {is_organic}")
print("========================================")

Cosa abbiamo imparato costruendo questo programma?

Il programma è interessante non perché sia complesso, ma perché mette insieme molte idee fondamentali:

input()
   ↓
conversione dei dati
   ↓
variabili
   ↓
calcoli
   ↓
confronti
   ↓
metodi delle stringhe
   ↓
valori booleani
   ↓
f-string
   ↓
output

Questa sequenza rappresenta uno schema che incontreremo continuamente nei programmi reali:

acquisire dati → elaborarli → produrre un risultato


1.37 Riepilogo del capitolo

In questo capitolo abbiamo costruito le fondamenta necessarie per iniziare a programmare in Python.

Abbiamo visto che:

  • Python è un linguaggio general purpose, leggibile e multipiattaforma;
  • il codice può essere eseguito tramite l'interprete Python;
  • la REPL permette di sperimentare rapidamente;
  • un programma Python può essere salvato in un file .py;
  • le variabili associano nomi a valori;
  • Python utilizza la tipizzazione dinamica;
  • i principali tipi di base sono int, float, str e bool;
  • type() permette di conoscere il tipo di un valore;
  • i nomi delle variabili devono rispettare precise regole sintattiche;
  • snake_case è la convenzione normalmente utilizzata per le variabili;
  • le stringhe sono sequenze indicizzate e immutabili;
  • len() restituisce la lunghezza di una stringa;
  • gli indici possono essere positivi o negativi;
  • lo slicing permette di estrarre porzioni di una stringa;
  • i metodi delle stringhe consentono di trasformare, cercare e pulire il testo;
  • int(), float() e str() permettono di convertire i valori;
  • input() restituisce sempre una stringa;
  • gli operatori aritmetici permettono di eseguire calcoli;
  • gli operatori di confronto producono valori booleani;
  • and, or e not permettono di combinare condizioni;
  • in e not in permettono di verificare l'appartenenza;
  • le f-string rendono semplice e leggibile la formattazione dell'output.

Questi concetti sono i mattoni fondamentali sui quali costruiremo tutto il resto del linguaggio.

Nel prossimo capitolo potremo utilizzare questi strumenti per fare qualcosa di ancora più interessante: far prendere decisioni ai nostri programmi.

← → per navigare F fullscreen