2. I tuoi primi programmi Python
Nel Capitolo 1 hai imparato come installare Python, usare la shell interattiva (REPL) ed eseguire semplici file script. Hai anche dato una prima occhiata agli errori e ai traceback. Ora è il momento di scrivere i tuoi primi veri programmi Python: programmi che visualizzano informazioni, accettano input dagli utenti e producono risultati significativi.
Questo capitolo introduce i blocchi fondamentali che userai in quasi tutti i programmi Python che scriverai: la funzione print() per visualizzare l'output, i commenti per documentare il tuo codice, le variabili per memorizzare i dati e la funzione input() per ottenere informazioni dagli utenti. Alla fine di questo capitolo sarai in grado di creare programmi interattivi semplici ma completi che seguono il classico modello input-process-output.
2.1) Stampare testo con la funzione print()
La funzione print() è uno degli strumenti più essenziali di Python. Visualizza testo (e altre informazioni) sullo schermo, permettendo ai tuoi programmi di comunicare con gli utenti. Hai già visto brevemente print() nel Capitolo 1, ma ora la esploreremo in profondità.
2.1.1) Stampa di base
Nella sua forma più semplice, print() visualizza testo racchiuso tra virgolette. Creiamo un file script per vedere come funziona:
# hello.py
print("Hello, World!")Quando esegui questo script, Python visualizza:
Hello, World!Il testo all'interno delle virgolette—"Hello, World!"—si chiama stringa. Una stringa è una sequenza di caratteri (lettere, numeri, simboli, spazi) che Python tratta come testo. Esploreremo le stringhe in modo molto più dettagliato nel Capitolo 5, ma per ora, pensa a esse come al modo in cui rappresenti il testo in Python.
Puoi stampare qualsiasi testo desideri mettendolo tra virgolette:
# greetings.py
print("Welcome to Python programming!")
print("This is your first real program.")
print("Python makes programming fun and accessible.")Output:
Welcome to Python programming!
This is your first real program.
Python makes programming fun and accessible.Nota che ogni istruzione print() produce output su una riga separata. Python aggiunge automaticamente un'interruzione di riga (newline) dopo ogni chiamata a print(), spostando il cursore alla riga successiva.
2.1.2) Stampare più elementi
La funzione print() può visualizzare più elementi in una singola chiamata separandoli con virgole:
# multiple_items.py
print("Python", "is", "awesome!")
print("I", "am", "learning", "to", "code")Output:
Python is awesome!
I am learning to codeQuando separi gli elementi con virgole, print() inserisce automaticamente uno spazio tra di essi. Questo è comodo per combinare più parti di testo senza dover aggiungere manualmente gli spazi.
Puoi anche mescolare tipi di dati diversi. Ad esempio, puoi stampare sia testo che numeri:
# mixed_output.py
print("The answer is", 42)
print("Python version", 3.12, "is powerful")Output:
The answer is 42
Python version 3.12 is powerfulPython converte automaticamente i numeri in testo quando li stampa, quindi per ora non è necessario preoccuparsi dei dettagli tecnici. Impareremo di più sui diversi tipi di dati nel Capitolo 3.
2.1.3) Virgolette singole vs doppie
Python accetta sia le virgolette singole (') sia le virgolette doppie (") per le stringhe. Sono completamente intercambiabili per testo semplice:
# quotes.py
print("This uses double quotes")
print('This uses single quotes')
print("Both work exactly the same way")Output:
This uses double quotes
This uses single quotes
Both work exactly the same wayTuttavia, le virgolette diventano importanti quando il tuo testo contiene apostrofi o virgolette. Se il tuo testo contiene un apostrofo (che è lo stesso carattere della virgoletta singola), usa le virgolette doppie per racchiuderlo:
# apostrophes.py
print("It's a beautiful day!")
print("Python's syntax is clean")Output:
It's a beautiful day!
Python's syntax is cleanSe provassi a usare le virgolette singole qui, Python si confonderebbe:
# This causes an error:
print('It's a beautiful day!') # Error! Python sees three separate quotesL'errore si verifica perché Python vede l'apostrofo in "It's" come la fine della stringa, lasciando "s a beautiful day!" come codice non valido.
Allo stesso modo, se il tuo testo contiene virgolette doppie, usa le virgolette singole per racchiuderlo:
# quotations.py
print('She said, "Hello!"')
print('The book is called "Python Basics"')Output:
She said, "Hello!"
The book is called "Python Basics"Linea guida pratica: scegli uno stile (virgolette singole o doppie) e usalo in modo coerente in tutto il tuo codice. La maggior parte dei programmatori Python preferisce le virgolette doppie per le stringhe normali, ma entrambe le scelte vanno bene. Passa all'altro stile solo quando il testo contiene il carattere di virgoletta che usi normalmente.
2.1.4) Stampare righe vuote
A volte vuoi aggiungere righe vuote al tuo output per renderlo più leggibile. Puoi farlo chiamando print() senza argomenti:
# spacing.py
print("First section of output")
print("More information here")
print() # Empty line
print("Second section of output")
print("This is separated from the first section")Output:
First section of output
More information here
Second section of output
This is separated from the first sectionLa chiamata vuota a print() crea una riga vuota, rendendo l'output più facile da leggere grazie alla separazione visiva tra sezioni diverse.
2.1.5) Caratteri speciali nelle stringhe
A volte hai bisogno di includere nel tuo output caratteri speciali che non puoi digitare direttamente o che hanno un significato speciale in Python. Ad esempio, come crei un'interruzione di riga in mezzo a una stringa? O come includi una tabulazione per l'allineamento? Python fornisce le sequenze di escape—speciali combinazioni di due caratteri che iniziano con una barra rovesciata (\)—per rappresentare questi caratteri.
Queste sequenze di escape sono particolarmente utili quando devi formattare l'output in modi specifici: creare messaggi su più righe, allineare colonne di dati o lavorare con percorsi di file su Windows. Userai spesso \n man mano che scriverai più programmi.
La sequenza di escape più comune è \n, che rappresenta un newline (interruzione di riga):
# newlines.py
print("First line\nSecond line\nThird line")Output:
First line
Second line
Third lineIl \n dice a Python di andare a una nuova riga in quel punto della stringa. Questo è utile quando vuoi creare più righe di output con una singola istruzione print().
Un'altra sequenza di escape utile è \t, che rappresenta una tabulazione (spaziatura orizzontale):
# tabs.py
print("Name:\tJohn")
print("Age:\t25")
print("City:\tNew York")Output:
Name: John
Age: 25
City: New YorkIl \t crea una spaziatura uniforme, allineando i valori in un formato simile a colonne.
Se hai bisogno di includere una barra rovesciata reale nel tuo output, usa \\:
# backslash.py
print("The file path is C:\\Users\\Documents")Output:
The file path is C:\Users\DocumentsEsploreremo le sequenze di escape e la gestione delle stringhe in modo molto più approfondito nel Capitolo 5. Per ora, sappi solo che \n crea nuove righe e \t crea tabulazioni.
2.2) Usare i commenti per spiegare il codice
Man mano che i tuoi programmi diventano più complessi, diventa importante spiegare cosa fa il tuo codice—sia per le altre persone che potrebbero leggerlo sia per il tuo io futuro. Python fornisce i commenti per questo scopo: note nel tuo codice che Python ignora completamente quando esegue il programma.
2.2.1) Commenti su una singola riga
In Python, qualsiasi testo che segue un simbolo # su una riga è un commento. Python ignora tutto dal # fino alla fine di quella riga:
# comment_example.py
# This is a comment. Python ignores this line completely.
print("This line runs") # This comment explains the print statement
# print("This line does NOT run because it's commented out")
print("This line also runs")Output:
This line runs
This line also runsNota che la seconda istruzione print() non è stata eseguita perché l'intera riga era commentata. Questo è utile quando vuoi disabilitare temporaneamente del codice senza cancellarlo.
I commenti possono apparire su una propria riga o alla fine di una riga di codice. Entrambi gli stili sono comuni:
# display_info.py
# Display a welcome message to the user
print("Welcome to the program!")
print("Processing data...") # Inform the user of progress2.2.2) Quando e come scrivere buoni commenti
I commenti dovrebbero spiegare perché stai facendo qualcosa, non solo cosa fa il codice. Ecco un esempio di commento poco utile:
# Bad comment - just repeats what the code obviously does
print("Hello") # Print "Hello"Questo commento non aggiunge valore perché chiunque legga il codice può già vedere che stampa "Hello".
Ecco un approccio migliore:
# Good comment - explains the purpose or context
# Greet the user before requesting their information
print("Hello")Questo commento spiega perché stiamo stampando "Hello": fa parte di un'interazione più ampia con l'utente.
Linee guida per scrivere commenti utili:
- Spiega lo scopo: perché esiste questo codice? Quale problema risolve?
- Chiarisci la logica complessa: se qualcosa non è immediatamente ovvio, spiegalo
- Evidenzia decisioni importanti: spiega perché hai scelto un approccio invece di un altro
- Avvisa di possibili tranelli: segnala tutto ciò che potrebbe essere confuso o inaspettato
- Mantienili aggiornati: aggiorna i commenti quando cambi il codice
Ecco un esempio che mostra commenti efficaci:
# temperature_converter.py
# This program converts temperatures from Fahrenheit to Celsius
# Formula: C = (F - 32) × 5/9
# Display program title
print("Temperature Converter")
print("Fahrenheit to Celsius")
print()
# We'll learn how to get user input in section 2.4
# For now, we'll use a fixed temperature value
fahrenheit = 75 # Temperature in Fahrenheit to convert
# Perform the conversion using the standard formula
# Subtract 32 first (order matters due to the formula)
celsius = (fahrenheit - 32) * 5 / 9
# Display the result
print("Temperature:", fahrenheit, "°F =", celsius, "°C")Output:
Temperature Converter
Fahrenheit to Celsius
Temperature: 75 °F = 23.88888888888889 °CNota come i commenti spieghino lo scopo del programma, la formula utilizzata e la logica dietro il calcolo. Rendono il codice molto più facile da capire, soprattutto per qualcuno che lo vede per la prima volta.
2.2.3) Commenti su più righe e docstring
Per spiegazioni più lunghe, puoi usare più commenti su singole righe:
# multi_line_comments.py
# This program demonstrates a longer explanation
# that spans multiple lines. Each line starts
# with a # symbol.
print("Program starts here")Python non ha una sintassi speciale per i commenti su più righe come alcuni altri linguaggi. Tuttavia, esiste un approccio alternativo usando stringhe tra triple virgolette. Impareremo di più su questo nel Capitolo 19 quando parleremo delle docstring (stringhe di documentazione per le funzioni), ma ecco un'anteprima:
# docstring_preview.py
"""
This is a multi-line string that can serve as a comment.
It's not technically a comment—it's a string that Python
creates but doesn't use. However, it's often used for
longer explanations at the beginning of files.
"""
print("Program starts here")Per ora, attieniti a # per i commenti. Esploreremo le stringhe tra triple virgolette e i loro usi corretti nei capitoli successivi.
2.2.4) Commentare il codice per i test
I commenti sono utili anche per disabilitare temporaneamente il codice durante i test:
# testing.py
print("This always runs")
# print("This is disabled for testing")
print("This also always runs")Questa tecnica si chiama "commentare" (commenting out) il codice. È utile quando vuoi testare come si comporta il tuo programma senza certe righe, ma non vuoi eliminare quelle righe in modo permanente.
2.3) Introduzione alle variabili e all'assegnazione (anteprima)
I programmi diventano molto più utili quando possono memorizzare e manipolare dati. Le variabili sono contenitori con un nome che contengono valori. Pensa a una variabile come a una scatola etichettata in cui puoi memorizzare informazioni e recuperarle in seguito.
Nota importante: questa sezione fornisce un'anteprima delle variabili per aiutarti a capire gli esempi in questo capitolo. Esploreremo le variabili in modo completo nel Capitolo 3, incluse le regole di denominazione, i tipi di dati e come Python gestisce internamente le variabili. Per ora, ci concentreremo sul concetto di base e sull'uso.
2.3.1) Creare variabili con l'assegnazione
Crei una variabile usando l'operatore di assegnazione (=). Il modello di base è:
variable_name = valueIl nome della variabile va a sinistra, il valore va a destra e il = li collega:
# variables_basic.py
message = "Hello, Python!"
print(message)Output:
Hello, Python!Ecco cosa succede:
- Python crea una variabile chiamata
message - Python memorizza la stringa
"Hello, Python!"in quella variabile - Quando usiamo
messagenella funzioneprint(), Python recupera il valore memorizzato e lo visualizza
Le variabili possono memorizzare diversi tipi di dati. Ecco alcuni esempi:
# variable_types.py
greeting = "Welcome!" # A string (text)
age = 25 # A number (integer)
price = 19.99 # A number with a decimal point (float)
is_student = True # A boolean (True or False)
print(greeting)
print(age)
print(price)
print(is_student)Output:
Welcome!
25
19.99
TrueImpareremo questi diversi tipi di dati (stringhe, interi, float, booleani) nel Capitolo 3. Per ora, ti basta capire che le variabili possono contenere vari tipi di informazioni.
2.3.2) Perché le variabili sono utili
Le variabili rendono il tuo codice più flessibile e facile da mantenere. Confronta questi due approcci:
Senza variabili:
# no_variables.py
print("Welcome, John!")
print("John, your account balance is $1000")
print("Thank you for banking with us, John!")Con le variabili:
# with_variables.py
name = "John"
balance = 1000
print("Welcome,", name + "!")
print(name, "your account balance is $", balance)
print("Thank you for banking with us,", name + "!")Entrambi i programmi producono un output simile, ma la versione con le variabili ha vantaggi significativi:
- Aggiornamenti facili: per cambiare il nome, devi modificare una sola riga (
name = "John") invece di tre - Meno errori: non puoi sbagliare a scrivere il nome in un punto
- Maggiore flessibilità: in seguito puoi cambiare il modo in cui
nameottiene il suo valore (per esempio, chiedendolo all'utente)
2.3.3) Riassegnare le variabili
Le variabili possono cambiare valore durante l'esecuzione del programma. Questo si chiama riassegnazione:
# reassignment.py
score = 0
print("Initial score:", score)
score = 10
print("After first update:", score)
score = 25
print("After second update:", score)Output:
Initial score: 0
After first update: 10
After second update: 25Ogni volta che assegni un nuovo valore a una variabile, Python sostituisce il vecchio valore con quello nuovo. Il valore precedente viene scartato.
Puoi persino usare il valore attuale di una variabile per calcolare il suo nuovo valore:
# updating_values.py
count = 5
print("Starting count:", count)
count = count + 1 # Add 1 to count
print("After adding 1:", count)
count = count + 10 # Add 10 to count
print("After adding 10:", count)Output:
Starting count: 5
After adding 1: 6
After adding 10: 16Questo schema—count = count + 1—è estremamente comune nella programmazione. Significa "prendi il valore attuale di count, aggiungi 1 e memorizza il risultato di nuovo in count". Impareremo una scorciatoia per questo (count += 1) nel Capitolo 4.
2.3.4) Anteprima sui nomi delle variabili
I nomi delle variabili in Python devono seguire alcune regole:
- Possono contenere lettere, numeri e underscore (
_) - Devono iniziare con una lettera o un underscore (non con un numero)
- Non possono contenere spazi o caratteri speciali come
@,$,%, ecc. - Non possono essere parole chiave di Python (parole riservate come
print,if,for, ecc.)
Ecco alcuni nomi di variabile validi:
# valid_names.py
user_name = "Alice"
age2 = 30
_private_value = 42
totalPrice = 99.99E alcuni nomi non validi:
# These cause errors:
# 2age = 30 # Cannot start with a number
# user-name = "Alice" # Cannot contain hyphens
# total price = 99.99 # Cannot contain spaces
# print = "Hello" # Cannot use Python keywordsBuona pratica: usa nomi descrittivi che spieghino cosa rappresenta la variabile. user_age è meglio di a, e total_price è meglio di tp. Discuteremo le convenzioni di denominazione in dettaglio nel Capitolo 3.
2.3.5) Le variabili rendono i programmi dinamici
La vera potenza delle variabili diventa evidente quando le usi per rendere i programmi più dinamici:
# dynamic_greeting.py
name = "Alice"
age = 28
city = "Seattle"
print("Personal Information")
print("====================")
print("Name:", name)
print("Age:", age)
print("City:", city)
print()
print("Summary:", name, "is", age, "years old and lives in", city)Output:
Personal Information
====================
Name: Alice
Age: 28
City: Seattle
Summary: Alice is 28 years old and lives in SeattleModificando i valori di name, age e city all'inizio del programma, puoi personalizzare l'intero output senza modificare le istruzioni print(). Questa separazione tra dati e logica è un principio fondamentale della buona programmazione.
Uno sguardo al futuro: nel Capitolo 3 esploreremo in modo completo le variabili, inclusi tipi di dati, conversione di tipo, regole di denominazione e come Python gestisce internamente le variabili. Per ora hai una comprensione sufficiente per usare le variabili in programmi semplici.
2.4) Leggere input dalla tastiera con input()
Finora, tutti i dati nei nostri programmi sono stati hardcoded, cioè scritti direttamente nel codice. Ma i programmi reali spesso devono interagire con gli utenti, accettando le informazioni che essi forniscono. La funzione input() di Python rende possibile questo.
2.4.1) Input di base
La funzione input() visualizza un messaggio (chiamato prompt) e attende che l'utente digiti qualcosa e prema Invio. Ecco il modello di base:
# basic_input.py
name = input("What is your name? ")
print("Hello,", name + "!")Quando esegui questo programma, ecco cosa succede:
What is your name? Alice
Hello, Alice!Analizziamo la sequenza:
- Python esegue
input("What is your name? ") - Python visualizza il prompt:
What is your name? - Il programma si mette in pausa e attende che l'utente digiti qualcosa
- L'utente digita
Alicee preme Invio - Python memorizza il testo
"Alice"nella variabilename - Il programma continua, stampando il saluto
Il testo che fornisci a input() è il prompt—ciò che l'utente vede prima di digitare. Includi sempre uno spazio alla fine del prompt (nota lo spazio dopo il punto interrogativo) per separare il prompt dall'input dell'utente, rendendo il tutto più leggibile.
2.4.2) input restituisce sempre una stringa
Questo è fondamentale da capire: input() restituisce sempre una stringa, anche se l'utente digita numeri:
# input_as_string.py
age = input("How old are you? ")
print("You entered:", age)
print("The type is:", type(age))Quando esegui questo programma e inserisci 25:
How old are you? 25
You entered: 25
The type is: <class 'str'>Anche se l'utente ha digitato 25, Python lo memorizza come stringa "25", non come numero 25. La funzione type() lo conferma: mostra che age è una stringa (str), non un intero.
Questo è importante quando vuoi fare calcoli. Non puoi eseguire direttamente operazioni matematiche con le stringhe:
# This causes an error:
age = input("How old are you? ")
next_year_age = age + 1 # Error! Can't add a number to a stringQuesto genera un errore perché Python non sa come sommare il numero 1 alla stringa "25".
2.4.3) Convertire l'input in numeri
Per usare l'input come numero, devi convertirlo esplicitamente usando int() (per i numeri interi) o float() (per i numeri decimali):
# input_conversion.py
age_string = input("How old are you? ")
age = int(age_string) # Convert string to integer
next_year = age + 1
print("Next year, you will be", next_year, "years old")Quando esegui questo programma e inserisci 25:
How old are you? 25
Next year, you will be 26 years oldPuoi anche combinare input e conversione in un'unica riga:
# input_conversion_compact.py
age = int(input("How old are you? "))
next_year = age + 1
print("Next year, you will be", next_year, "years old")Questa versione è più concisa ed è lo stile che vedrai più spesso. Funziona dall'interno verso l'esterno:
input("How old are you? ")ottiene l'input dell'utente come stringaint(...)converte quella stringa in un intero- L'intero viene memorizzato nella variabile
age
Ecco un esempio che usa float() per numeri decimali:
# float_input.py
price = float(input("Enter the price: $"))
tax_rate = 0.08
tax = price * tax_rate
total = price + tax
print("Price: $", price)
print("Tax: $", tax)
print("Total: $", total)Quando esegui questo programma e inserisci 19.99:
Enter the price: $19.99
Price: $ 19.99
Tax: $ 1.5992
Total: $ 21.5892Importante: se l'utente inserisce un testo che non può essere convertito in numero, Python genererà un errore. Per esempio, se usi int(input("Enter a number: ")) e l'utente digita "hello", Python non può convertire "hello" in un intero e mostrerà un messaggio di errore. Impareremo come gestire queste situazioni in modo elegante nel Capitolo 27, quando studieremo la gestione delle eccezioni.
2.4.4) Input multipli
I programmi hanno spesso bisogno di più informazioni dall'utente. È sufficiente chiamare input() più volte:
# multiple_inputs.py
print("Please enter your information:")
print()
first_name = input("First name: ")
last_name = input("Last name: ")
age = int(input("Age: "))
city = input("City: ")
print()
print("Summary")
print("=======")
print("Name:", first_name, last_name)
print("Age:", age)
print("Location:", city)Esempio di interazione:
Please enter your information:
First name: John
Last name: Smith
Age: 30
City: Boston
Summary
=======
Name: John Smith
Age: 30
Location: BostonNota come il programma richieda separatamente ciascuna informazione. Questo rende chiaro all'utente cosa deve fornire e in quale ordine.
2.4.5) Creare prompt informativi
Prompt ben scritti rendono i tuoi programmi più facili da usare. Ecco alcune linee guida:
Sii specifico su ciò che vuoi:
# Good prompts
name = input("Enter your full name: ")
temperature = float(input("Enter temperature in Fahrenheit: "))
quantity = int(input("How many items do you want to purchase? "))Includi il formato o le unità attese:
# format_prompts.py
date = input("Enter date (MM/DD/YYYY): ")
phone = input("Enter phone number (XXX-XXX-XXXX): ")
price = float(input("Enter price in dollars (without $): "))Usa un linguaggio chiaro e cordiale:
# friendly_prompts.py
print("Welcome to the Temperature Converter!")
print()
temp = float(input("Please enter a temperature in Fahrenheit: "))Prompt chiari riducono la confusione dell'utente e rendono i tuoi programmi più professionali.
2.5) Semplici programmi input-process-output
La maggior parte dei programmi segue un modello comune chiamato Input-Process-Output (IPO):
- Input: ottenere dati dall'utente o da un'altra fonte
- Process: eseguire calcoli o trasformazioni sui dati
- Output: visualizzare i risultati
Questo modello è così fondamentale che lo userai in innumerevoli programmi lungo il tuo percorso di programmazione. Esploriamolo con alcuni esempi completi.
2.5.1) Esempio: convertitore di temperatura
Creiamo un programma completo che converte temperature da Fahrenheit a Celsius:
# temperature_converter.py
# This program converts a temperature from Fahrenheit to Celsius
# Formula: C = (F - 32) × 5/9
print("Temperature Converter")
print("Fahrenheit to Celsius")
print("=" * 30) # Print a line of equal signs
print()
# INPUT: Get temperature from user
fahrenheit = float(input("Enter temperature in Fahrenheit: "))
# PROCESS: Convert using the formula
celsius = (fahrenheit - 32) * 5 / 9
# OUTPUT: Display the result
print()
print("Result:", fahrenheit, "°F =", celsius, "°C")Esempio di interazione:
Temperature Converter
Fahrenheit to Celsius
==============================
Enter temperature in Fahrenheit: 75
Result: 75.0 °F = 23.88888888888889 °CNota come il programma segua chiaramente il modello IPO:
- Input: ottiene la temperatura in Fahrenheit
- Process: applica la formula di conversione
- Output: visualizza il risultato in Celsius
I commenti nel codice marcano esplicitamente queste tre sezioni, rendendo chiara la struttura del programma.
2.5.2) Esempio: calcolatore dell'area di un rettangolo
Ecco un altro esempio IPO che calcola l'area di un rettangolo:
# rectangle_area.py
# Calculate the area of a rectangle
# Formula: Area = length × width
print("Rectangle Area Calculator")
print("=" * 30)
print()
# INPUT: Get dimensions from user
length = float(input("Enter the length: "))
width = float(input("Enter the width: "))
# PROCESS: Calculate area
area = length * width
# OUTPUT: Display the result
print()
print("A rectangle with length", length, "and width", width)
print("has an area of", area, "square units")Esempio di interazione:
Rectangle Area Calculator
==============================
Enter the length: 5.5
Enter the width: 3.2
A rectangle with length 5.5 and width 3.2
has an area of 17.6 square units2.5.3) Esempio: calcolatore del totale della spesa
Questo esempio calcola il totale di una spesa con l'imposta:
# shopping_total.py
# Calculate total cost including tax
print("Shopping Total Calculator")
print("=" * 30)
print()
# INPUT: Get price and tax rate
price = float(input("Enter item price: $"))
tax_rate = float(input("Enter tax rate (as decimal, e.g., 0.08 for 8%): "))
# PROCESS: Calculate tax and total
tax_amount = price * tax_rate
total = price + tax_amount
# OUTPUT: Display itemized breakdown
# Note: Comma in print() adds a space after $
print()
print("Purchase Summary")
print("-" * 30)
print("Item price: $", price)
print("Tax rate: ", tax_rate * 100, "%")
print("Tax amount: $", tax_amount)
print("-" * 30)
print("Total: $", total)Esempio di interazione:
Shopping Total Calculator
==============================
Enter item price: $49.99
Enter tax rate (as decimal, e.g., 0.08 for 8%): 0.08
Purchase Summary
------------------------------
Item price: $ 49.99
Tax rate: 8.0 %
Tax amount: $ 3.9992
------------------------------
Total: $ 53.98922.6) Debugging di base leggendo i messaggi di errore semplici
Anche i programmatori esperti commettono errori. Imparare a leggere e capire i messaggi di errore è una competenza essenziale che ti farà risparmiare innumerevoli ore di frustrazione. I messaggi di errore di Python sono in realtà molto utili: ti dicono cosa è andato storto e dove si è verificato il problema.
I termini "messaggio di errore" e "errore traceback" sono correlati ma leggermente diversi: un traceback è il report completo che Python mostra quando si verifica un errore, includendo il tipo di errore, la descrizione e il percorso attraverso il tuo codice che ha portato all'errore. Il messaggio di errore è l'ultima riga del traceback che descrive cosa è andato storto. Nel linguaggio quotidiano, i programmatori usano spesso "messaggio di errore" per riferirsi all'intero traceback.
2.6.1) Capire i messaggi di errore
Quando Python incontra un errore, visualizza un traceback—un report dettagliato su cosa è andato storto. Vediamo un esempio semplice:
# error_example.py
print("Starting the program")
print("This line works fine"
print("This line might not be reached")Quando provi a eseguirlo, Python visualizza:
File "error_example.py", line 2
print("This line works fine"
^
SyntaxError: '(' was never closedAnalizziamo cosa ci dice questo messaggio di errore:
- Nome del file:
error_example.py- il file in cui si è verificato l'errore - Numero di riga:
line 2- dove Python ha rilevato il problema - Frammento di codice: mostra la riga problematica con un
^che indica dove Python ha notato il problema - Tipo di errore:
SyntaxError- il tipo di errore - Descrizione:
'(' was never closed- una spiegazione in linguaggio naturale
L'errore si è verificato perché abbiamo dimenticato la parentesi chiusa sulla riga 2. Python ha cercato di continuare a leggere la riga successiva come parte della stessa istruzione print() e si è confuso.
2.6.2) Tipi di errore comuni per i principianti
Esploriamo gli errori più comuni che incontrerai come principiante e come risolverli.
SyntaxError: Invalid Syntax
Questo è l'errore più comune per i principianti. Significa che Python non ha potuto capire il tuo codice perché non segue le regole grammaticali di Python.
Due punti mancanti:
# missing_colon.py
name = input("What is your name? ")
if name == "Alice" # Missing colon
print("Hello, Alice!")Errore:
File "missing_colon.py", line 2
if name == "Alice"
^
SyntaxError: expected ':'Nota: non abbiamo ancora imparato le istruzioni if; le tratteremo nel Capitolo 8. Questo esempio serve solo a mostrarti come appare l'errore.
Virgolette non corrispondenti:
# mismatched_quotes.py
message = "Hello, world!'
print(message)Errore:
File "mismatched_quotes.py", line 1
message = "Hello, world!'
^
SyntaxError: unterminated string literal (detected at line 1)L'errore si verifica perché la stringa inizia con una virgoletta doppia (") ma termina con una virgoletta singola ('). Python si aspetta lo stesso tipo di virgoletta all'inizio e alla fine.
NameError: Name Not Defined
Questo errore si verifica quando provi a usare una variabile che non esiste:
# name_error.py
print("Starting calculation")
result = total + 10 # 'total' was never created
print(result)Errore:
Traceback (most recent call last):
File "name_error.py", line 2, in <module>
result = total + 10
^^^^^
NameError: name 'total' is not definedPython ti sta dicendo che non sa cosa sia total perché non hai mai creato quella variabile. La soluzione è definire total prima di usarla:
# name_error_fixed.py
print("Starting calculation")
total = 0 # Define the variable first
result = total + 10
print(result)Cause comuni di NameError:
- Errori di battitura nei nomi delle variabili (
totlainvece ditotal) - Uso di una variabile prima di assegnarle un valore
- Dimenticare completamente di creare una variabile
TypeError: Unsupported Operand Type(s)
Questo errore si verifica quando provi a eseguire un'operazione su tipi non compatibili:
# type_error.py
age = input("How old are you? ")
next_year = age + 1 # Can't add a number to a string
print("Next year:", next_year)Errore:
Traceback (most recent call last):
File "type_error.py", line 2, in <module>
next_year = age + 1
~~~~^~~
TypeError: can only concatenate str (not "int") to strPython ti sta dicendo che age è una stringa (perché input() restituisce stringhe) e non puoi sommare un numero a una stringa. La correzione è convertire l'input in un intero:
# type_error_fixed.py
age = int(input("How old are you? ")) # Convert to integer
next_year = age + 1
print("Next year:", next_year)ValueError: Invalid Literal
Questo errore si verifica quando provi a convertire una stringa in numero, ma la stringa non rappresenta un numero valido:
# value_error.py
age = int(input("How old are you? "))
print("You are", age, "years old")Se l'utente inserisce testo invece di un numero:
How old are you? twenty
Traceback (most recent call last):
File "value_error.py", line 1, in <module>
age = int(input("How old are you? "))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'twenty'Python ti sta dicendo che non può convertire la stringa "twenty" in un intero. L'utente deve inserire un numero come 20 invece.
Importante: al momento, se gli utenti inseriscono input non validi, il tuo programma andrà in crash con un errore. Questo è normale per i programmi dei principianti. Nel Capitolo 27 impareremo come gestire queste situazioni in modo elegante usando la gestione delle eccezioni, permettendo al tuo programma di recuperare dagli errori e chiedere all'utente di riprovare.
2.6.3) Leggere con attenzione i traceback
Quando si verifica un errore, Python mostra un traceback che ripercorre l'errore all'indietro attraverso il tuo codice. Per i programmi semplici, il traceback è breve:
# simple_traceback.py
print("Starting program")
name = input("Enter your name: ")
age = int(input("Enter your age: "))
print("Hello,", name)
print("Next year you'll be", age + 1)Se l'utente inserisce un input non valido per l'età:
Starting program
Enter your name: Alice
Enter your age: abc
Traceback (most recent call last):
File "simple_traceback.py", line 3, in <module>
age = int(input("Enter your age: "))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'abc'Il traceback mostra:
- Il nome del file e il numero di riga in cui si è verificato l'errore
- La riga di codice che ha causato il problema
- Il tipo di errore e una descrizione
Strategia di lettura: inizia dal fondo del traceback e risali verso l'alto. L'ultima riga ti dice cosa è andato storto. Le righe sopra mostrano dove nel tuo codice si è verificato l'errore.
2.6.4) Strategie comuni di debugging
Quando incontri un errore, segui questi passaggi:
1. Leggi attentamente il messaggio di errore
Non farti prendere dal panico. Il messaggio di errore sta cercando di aiutarti. Leggilo per intero e cerca di capire cosa sta dicendo.
2. Guarda il numero di riga
Il messaggio di errore ti dice su quale riga Python pensa ci sia il problema. Tuttavia, a volte l'errore reale è sulla riga precedente. Ad esempio, una parentesi chiusa mancante sulla riga 2 potrebbe non essere rilevata finché Python non legge la riga 3.
3. Controlla gli errori comuni
- Virgolette mancanti o non corrispondenti
- Parentesi o parentesi quadre mancanti
- Due punti mancanti (per istruzioni che impareremo più avanti come
if,for,while) - Errori di battitura nei nomi delle variabili
- Dimenticare di convertire l'input in numeri
4. Usa print() per ispezionare i valori
Se non sei sicuro di cosa stia succedendo, aggiungi istruzioni print() per vedere quali valori contengono le tue variabili:
# debugging_with_print.py
price = input("Enter price: ")
print("DEBUG: price =", price, "type =", type(price)) # Debugging line
tax = price * 0.08 # This will cause an error
print("Tax:", tax)La riga di debug ti mostra che price è una stringa, non un numero, aiutandoti a identificare il problema.
5. Commenta il codice per isolare il problema
Se hai più righe e non sei sicuro di quale causi l'errore, commenta alcune righe finché l'errore non scompare:
# isolating_error.py
name = input("Enter name: ")
# age = int(input("Enter age: ")) # Commented out for testing
# city = input("Enter city: ") # Commented out for testing
print("Name:", name)Una volta che l'errore sparisce, sai che il problema si trova in una delle righe commentate.
6. Parti da una versione semplice
Se il tuo programma non funziona, semplificalo al minimo indispensabile:
# simplified_version.py
# Start with just the basic structure
print("Program starting")
# Add one feature at a time and testQuando la versione semplice funziona, aggiungi funzionalità una alla volta, testando dopo ogni aggiunta.
2.6.5) Prevenire gli errori
Mentre il debugging è importante, prevenire gli errori è ancora meglio:
Scrivi il codice in modo incrementale
Non scrivere l'intero programma e poi eseguirlo per la prima volta. Scrivi poche righe, esegui il programma, assicurati che quelle righe funzionino, poi aggiungine altre. In questo modo, quando compare un errore, sai che si trova nel codice che hai appena aggiunto.
# incremental_development.py
# Step 1: Get input and test
name = input("Enter name: ")
print("DEBUG: Got name:", name)
# Step 2: Add more input and test
# age = int(input("Enter age: "))
# print("DEBUG: Got age:", age)
# Step 3: Add processing and test
# ... and so onUsa nomi di variabili descrittivi
Nomi di variabili chiari ti aiutano a evitare errori:
# Clear variable names make errors less likely
user_age = int(input("Enter your age: "))
next_year_age = user_age + 1Aggiungi commenti per spiegare la tua logica
I commenti ti aiutano (e aiutano gli altri) a capire cosa dovrebbe fare il codice, rendendo più facile notare quando fa qualcosa di diverso:
# temperature_with_comments.py
# Get temperature in Fahrenheit from user
fahrenheit = float(input("Enter temperature in Fahrenheit: "))
# Convert to Celsius using the standard formula: C = (F - 32) × 5/9
celsius = (fahrenheit - 32) * 5 / 9
# Display the result
print(fahrenheit, "°F =", celsius, "°C")Testa con input diversi
Non testare il tuo programma una sola volta. Prova diversi input, inclusi casi limite:
- Valori normali:
25,100 - Zero:
0 - Numeri negativi:
-10 - Numeri decimali:
3.14 - Numeri molto grandi:
1000000
Questo ti aiuta a scoprire problemi prima che li incontrino gli utenti.
2.6.6) Quando chiedere aiuto
A volte incontrerai errori che non riesci a risolvere da solo. Prima di chiedere aiuto:
- Leggi attentamente il messaggio di errore - assicurati di capire cosa sta dicendo
- Cerca l'errore - copia il messaggio di errore (senza i nomi specifici delle tue variabili) e cercalo online. Molti errori sono già stati incontrati e risolti da altri
- Controlla attentamente il tuo codice - cerca errori di battitura, punteggiatura mancante e errori comuni
- Crea un esempio minimo - riduci il tuo codice alla versione più piccola che produce ancora l'errore
Quando chiedi aiuto, fornisci:
- Il messaggio di errore completo
- Il codice che produce l'errore
- Cosa ti aspettavi che accadesse
- Cosa è successo in realtà
- Cosa hai già provato
Ricorda: gli errori sono una parte normale della programmazione. Ogni programmatore, dai principianti agli esperti, incontra errori ogni giorno. La differenza è che i programmatori esperti hanno imparato a leggere i messaggi di errore in modo efficiente e conoscono le soluzioni comuni. Svilupperai anche tu queste competenze con la pratica.
Hai ora imparato i blocchi fondamentali della programmazione in Python: visualizzare output con print(), documentare il codice con i commenti, memorizzare dati nelle variabili, ottenere input dall'utente con input(), seguire il modello input-process-output e fare debugging dei semplici errori.
Questi concetti costituiscono le fondamenta per tutto ciò che imparerai in Python. Nel prossimo capitolo, approfondiremo le variabili ed esploreremo i tipi di dati di base di Python, dandoti una comprensione più completa di come Python memorizza e manipola diversi tipi di informazioni.
Punti chiave di questo capitolo:
- Usa
print()per visualizzare testo e altre informazioni agli utenti - Usa i commenti (
#) per spiegare il tuo codice e documentare il tuo ragionamento - Memorizza i dati nelle variabili usando l'assegnazione (
=) - Ottieni input dall'utente con
input()e convertilo in numeri quando necessario - Struttura i programmi usando il modello input-process-output
- Leggi attentamente i messaggi di errore: cercano di aiutarti a risolvere i problemi
- Scrivi codice in modo incrementale e testalo spesso per intercettare presto gli errori
Con queste competenze puoi ora scrivere programmi interattivi semplici ma completi. Continuando a imparare, costruirai su queste fondamenta per creare applicazioni sempre più sofisticate.