Previous Up Next

Buy this book at Amazon.com

Chapter 2  Variabili, espressioni ed istruzioni

Una delle caratteristiche più potenti in un linguaggio di programmazione è la capacità di lavorare con le variabili. Una variabile è un nome che fa riferimento ad un valore.

2.1  Istruzioni di assegnazione

Un’istruzione di assegnazione serve a creare una nuova variabile, specificandone il nome, e ad assegnarle un valore:

>>> messaggio = 'E ora qualcosa di completamente diverso'
>>> n = 17
>>> pi = 3.141592653589793

Questo esempio effettua tre assegnazioni. La prima assegna una stringa ad una nuova variabile chiamata messaggio; la seconda assegna il numero intero 17 alla variabile n; la terza assegna il valore decimale approssimato di π alla variabile pi.

Un modo comune di rappresentare le variabili sulla carta è scriverne il nome con una freccia che punta al loro valore. Questo tipo di illustrazione è chiamato diagramma di stato perché mostra lo stato in cui si trova la variabile. La Figura 2.1 illustra il risultato delle istruzioni di assegnazione dell’esempio precedente.


Figure 2.1: Diagramma di stato.

2.2  Nomi delle variabili

Generalmente, i programmatori scelgono dei nomi significativi per le loro variabili, in modo da documentare a che cosa servono.

I nomi delle variabili possono essere lunghi a piacere e possono contenere sia lettere che numeri, ma non possono iniziare con un numero. È possibile usare anche le lettere maiuscole, ma per i nomi di variabile è convenzione utilizzare solo lettere minuscole. Ricordate comunque che, per l’interprete, maiuscole e minuscole sono diverse, pertanto spam, Spam e SPAM sono variabili diverse.

Il trattino basso o underscore, _, può far parte di un nome: è usato spesso in nomi di variabile composti da più parole (per esempio il_mio_nome o monty_python.)

Se assegnate un nome non valido alla variabile, otterrete un errore di sintassi:

>>> 76tromboni = 'grande banda'
SyntaxError: invalid syntax
>>> altro@ = 1000000
SyntaxError: invalid syntax
>>> class = 'Zymurgy Teorico Avanzato'
SyntaxError: invalid syntax

76tromboni non è valido perché non inizia con una lettera. altro@ non è valido perché contiene un carattere non ammesso (la chiocciola @). Ma cosa c’è di sbagliato in class?

Succede che class è una delle parole chiave riservate di Python. L’interprete utilizza queste parole per riconoscere la struttura del programma, pertanto non possono essere usate come nomi di variabili.

Python 3 ha queste parole chiave:

False      class      finally    is         return
None       continue   for        lambda     try
True       def        from       nonlocal   while
and        del        global     not        with
as         elif       if         or         yield
assert     else       import     pass
break      except     in         raise

Non occorre imparare a memoria questo elenco. Nella maggior parte degli ambienti di sviluppo, le parole chiave vengono evidenziate con un diverso colore; se cercate di usarne una come nome di variabile, ve ne accorgerete subito.

2.3  Espressioni e istruzioni

Un’espressione è una combinazione di valori, variabili e operatori. Un valore è considerato già di per sé un’espressione, come pure una variabile, per cui quelle che seguono sono tutte delle espressioni valide (supponendo che alla variabile n sia già stato assegnato un valore):

>>> 42
42
>>> n
17
>>> n + 25
42

Quando scrivete un’espressione al prompt dei comandi, l’interprete la valuta, cioè trova il valore dell’espressione. Nell’esempio di prima, n ha valore 17 e n + 25 ha valore 42.

Un’istruzione è una porzione di codice che l’interprete Python può eseguire e che ha un qualche effetto, come creare una variabile o mostrare un valore.

>>> n = 17
>>> print(n)

La prima riga è un’istruzione di assegnazione che dà un valore alla variabile n. La seconda è un’istruzione di stampa che mostra a video il valore di n.

Quando scrivete un’istruzione, l’interprete la esegue, cioè fa quello che l’istruzione dice di fare. In linea generale, le istruzioni, a differenza delle espressioni, non contengono valori.

2.4  Modalità script

Finora abbiamo avviato Python in modalità interattiva, detta anche “a riga di comando”, che vuol dire interagire direttamente con l’interprete. La modalità interattiva è un buon modo per iniziare e fare esperimenti, ma se si deve lavorare con più di qualche riga di codice, può diventare in breve tempo un impiccio.

In alternativa alla riga di comando, si può scrivere e salvare un programma in un file di testo semplice, chiamato script, ed usare poi l’interprete in modalità script per eseguirlo. Per convenzione, i file contenenti programmi Python hanno nomi che terminano con l’estensione .py .

Se già sapete come creare e avviare uno script nel vostro computer, siete a cavallo. Altrimenti vi consiglio di nuovo di usare PythonAnywhere. Le istruzioni per l’avvio in modalità script sono pubblicate all’indirizzo http://tinyurl.com/thinkpython2e.

Poiché Python consente entrambe queste modalità, potete provare dei pezzi di codice in modalità interattiva prima di inserirli in uno script. Ma tra le due modalità, ci sono delle differenze che possono disorientare.

Per esempio, usando Python come una calcolatrice, si può scrivere:

>>> miglia = 26.2
>>> miglia * 1.61
42.182

La prima riga assegna un valore a miglia, e non ha alcun effetto visibile. La seconda riga è un’espressione, e l’interprete la valuta e ne mostra il risultato. Vediamo così che una maratona misura circa 42 chilometri.

Ma se scrivete lo stesso codice in uno script e lo avviate, non otterrete alcun riscontro. In modalità script, un’espressione, di per sé, non ha effetti visibili. In realtà Python valuta l’espressione, ma non ne mostra il risultato finché non gli dite esplicitamente di farlo:

miglia = 26.2
print(miglia * 1.61)

Questo comportamento inizialmente può confondere.

Uno script di solito contiene una sequenza di istruzioni. Se ci sono più istruzioni, i risultati compaiono uno alla volta, man mano che le istruzioni vengono eseguite.

Per esempio lo script:

print(1)
x = 2
print(x)

visualizza questo:

1
2

mentre l’istruzione di assegnazione non produce alcun output sullo schermo.

Per controllare se avete capito tutto, scrivete le seguenti istruzioni nell’interprete Python per vedere quali effetti producono:

5
x = 5
x + 1

Ora scrivete le stesse istruzioni in uno script ed avviatelo. Qual è il risultato? Modificate lo script trasformando ciascuna espressione in un’istruzione di stampa, ed avviatelo nuovamente.

2.5  Ordine delle operazioni

Quando un’espressione contiene più operatori, l’ordine in cui viene eseguito il calcolo dipende dal’ordine delle operazioni. Python segue le stesse regole di precedenza usate in matematica. L’acronimo PEMDAS è un modo utile per ricordare le regole:

  • Parentesi: hanno il più alto livello di precedenza e possono essere usate per far valutare l’espressione in qualsiasi ordine volete. Dato che le espressioni tra parentesi sono valutate per prime, 2 * (3-1) fa 4, e (1+1)**(5-2) fa 8. Si possono usare le parentesi anche solo per rendere più leggibile un’espressione, come in (minuti * 100) / 60; in questo caso non influiscono sul risultato.
  • Elevamento a potenza: ha la priorità successiva, così 1 + 2**3 fa 9, e non 27, e 2 * 3**2 fa 18, e non 36.
  • Moltiplicazione e Divisione hanno priorità superiore ad Addizione e Sottrazione. Per cui 2*3-1 fa 5, e non 4, e 6+4/2 fa 8, e non 5.
  • Gli operatori con la stessa priorità sono valutati da sinistra verso destra (eccetto la potenza), così nell’espressione gradi / 2 * pi, la divisione viene calcolata per prima e il risultato viene moltiplicato per pi. Per dividere per 2 π, dovete usare le parentesi o scrivere gradi / 2 / pi.

Personalmente, non mi sforzo molto di ricordare la precedenza degli operatori. Se non ne sono certo guardando un’espressione, inserisco le parentesi per fugare ogni dubbio.

2.6  Operazioni sulle stringhe

In genere non potete effettuare operazioni matematiche sulle stringhe, anche se il loro contenuto sembra essere un numero, quindi gli esempi che seguono non sono validi.

'2'-'1'    'uova'/'facili'    'terzo'*'una magia'

Ma ci sono due eccezioni: + e *.

L’operatore + esegue il concatenamento, cioè unisce le stringhe collegandole ai due estremi. Per esempio:

primo = 'bagno'
secondo = 'schiuma'
primo + secondo

Il risultato a video di questo programma è bagnoschiuma.

Anche l’operatore * funziona sulle stringhe: ne esegue la ripetizione. Per esempio, 'Spam'*3'SpamSpamSpam'. Uno degli operandi deve essere una stringa, l’altro un numero intero.

Questo utilizzo di + e * è coerente per analogia con l’addizione e la moltiplicazione in matematica. Così come 4*3 è equivalente a 4+4+4, ci aspettiamo che 'Spam'*3 sia lo stesso di 'Spam'+'Spam'+'Spam', ed effettivamente è così. D’altro canto, c’è un particolare sostanziale che rende diverse la somma e la moltiplicazione di numeri interi e di stringhe. Riuscite a pensare ad una proprietà che ha l’addizione ma che non vale per il concatenamento di stringhe?

2.7  Commenti

Man mano che il programma cresce di dimensioni e diventa più complesso, diventa anche sempre più difficile da leggere. I linguaggi formali sono ricchi di significato, e può risultare difficile capire a prima vista cosa fa un pezzo di codice o perché è stato scritto in un certo modo.

Per questa ragione, è buona abitudine aggiungere delle note ai vostri programmi, per spiegare in linguaggio naturale cosa sta facendo il programma nelle sue varie parti. Queste note sono chiamate commenti, e sono demarcate dal simbolo #:

# calcola la percentuale di ora trascorsa
percentuale = (minuti * 100) / 60

In questo caso il commento appare su una riga a sé stante. Potete anche inserire un commento alla fine di una riga:

percentuale = (minuti * 100) / 60     # percentuale di un'ora

Qualsiasi cosa scritta dopo il simbolo # e fino alla fine della riga, viene trascurata e non ha alcun effetto sull’esecuzione del programma.

I commenti più utili sono quelli che documentano caratteristiche del codice di non immediata comprensione. È ragionevole supporre che chi legge il codice possa capire cosa esso faccia; è più utile spiegare perché.

Questo commento è ridondante e inutile:

v = 5     # assegna 5 a v

Questo commento contiene invece un’informazione utile che non è contenuta nel codice:

v = 5     # velocità in metri/secondo 

Dei buoni nomi di variabile possono ridurre la necessità di commenti, ma nomi lunghi possono complicare la lettura, pertanto va trovato un giusto compromesso.

2.8  Debug

Ci sono tre tipi di errori nei quali si incorre durante la programmazione: gli errori di sintassi, gli errori in esecuzione e gli errori di semantica. È utile analizzarli singolarmente per facilitarne l’individuazione.

2.8.1  Errori di sintassi

Il termine sintassi si riferisce alla struttura di un programma e alle regole che la governano. Ad esempio, le parentesi devono essere sempre presenti a coppie corrispondenti, così (1 + 2) è corretto, ma 8) è un errore di sintassi.

Se c’è un singolo errore di sintassi da qualche parte nel programma, Python visualizzerà un messaggio d’errore e ne interromperà l’esecuzione, rendendo impossibile proseguire. Durante le prime settimane della vostra carriera di programmatori, probabilmente passerete molto tempo a cercare errori di sintassi. Via via che acquisirete esperienza, questi si faranno meno numerosi e vi risulterà sempre più facile rintracciarli.

2.8.2  Errori in esecuzione

Il secondo tipo di errore è l’errore in esecuzione (o di runtime), così chiamato perché l’errore non appare finché il programma non viene eseguito. Questi errori sono anche chiamati eccezioni perché indicano che è accaduto qualcosa di eccezionale (e di spiacevole) nel corso dell’esecuzione.

Gli errori in esecuzione sono rari nei semplici programmi che vedrete nei primissimi capitoli, e potrebbe passare un po’ di tempo prima di incontrarne uno.

2.8.3  Errori di semantica

Il terzo tipo di errore è l’errore di semantica (o di logica), che è correlato al significato del programma. In presenza di un errore di semantica, il programma verrà eseguito senza che compaia alcun messaggio di errore, ma non farà la cosa giusta: farà qualcosa di diverso. Nello specifico, farà esattamente ciò che voi gli avete detto di fare, esprimendovi in modo sbagliato.

L’identificazione degli errori di semantica può essere complicata perché richiede di lavorare a ritroso, partendo dai risultati dell’esecuzione e cercando di risalire a che cosa non sia andato per il verso giusto.

2.9  Glossario

variabile:
Un nome che fa riferimento ad un valore.
assegnazione:
Istruzione che assegna un valore ad una variabile.
diagramma di stato:
Rappresentazione grafica di una serie di variabili e dei valori ai quali esse si riferiscono.
parola chiave riservata:
Parola chiave usata per analizzare il programma e che non può essere usata come nome di variabile o di funzione, come if, def, e while.
operando:
Uno dei valori sui quali agisce un operatore.
espressione:
Combinazione di variabili, operatori e valori che rappresentano un unico valore risultante.
valutare:
Semplificare un’espressione eseguendo una serie di operazioni per produrre un singolo valore.
istruzione:
Parte di codice che rappresenta un comando o un’azione. Finora abbiamo visto istruzioni di assegnazione e istruzioni di stampa.
eseguire:
Dare effetto a un’istruzione e fare ciò che dice.
modalità interattiva:
Un modo di usare l’interprete Python, scrivendo del codice al prompt.
modalità script:
Un modo di usare l’interprete Python, leggendo del codice da uno script ed eseguendolo.
script:
Un programma memorizzato in un file.
ordine delle operazioni:
Insieme di regole che determinano l’ordine dei calcoli di espressioni complesse in cui sono presenti più operandi ed operatori.
concatenare:
Unire due stringhe tramite l’accodamento della seconda alla prima.
commento:
Informazione inserita in un programma riguardante il significato di una sua parte; non ha alcun effetto sull’esecuzione del programma ma serve solo per facilitarne la comprensione.
errore di sintassi:
Errore in un programma che ne rende impossibile l’analisi (il programma non può quindi essere interpretato o compilato).
eccezione:
Errore (detto anche di runtime) che si verifica mentre il programma è in esecuzione.
semantica:
Il significato logico di un programma.
errore di semantica:
Errore nel programma tale per cui esso produce risultati diversi da quelli che il programmatore si aspettava.

2.10  Esercizi

Esercizio 1  

Rinnovo la raccomandazione del capitolo precedente: ogni volta che apprendete qualcosa di nuovo, provatelo in modalità interattiva e fate degli errori di proposito per vedere cosa non funziona.

  • Abbiamo visto che n = 42 è valido. E 42 = n?
  • E se scrivete x = y = 1?
  • In alcuni linguaggi, ogni istruzione termina con un punto e virgola, ;. Cosa succede se mettete un punto e virgola alla fine di un’istruzione in Python?
  • E se mettete un punto alla fine di un’istruzione?
  • Nella notazione matematica potete indicare la moltiplicazione di x per y scrivendo: x y. Cosa succede scrivendo questo in Python?


Esercizio 2  

Fate un po’ di pratica con l’interprete Python usandolo come calcolatrice:

  1. Il volume di una sfera di raggio r è 4/3 π r3. Che volume ha una sfera di raggio 5?
  2. Il prezzo di copertina di un libro è 24,95, ma una libreria ottiene il 40% di sconto. I costi di spedizione sono 3 per la prima copia e 75 centesimi per ogni copia aggiuntiva. Qual è il costo totale di 60 copie?
  3. Se uscite di casa alle 6:52 di mattina e correte 1 miglio a ritmo blando (8:15 al miglio), poi 3 miglia a ritmo moderato (7:12 al miglio), quindi 1 altro miglio a ritmo blando, a che ora tornate a casa per colazione?

Buy this book at Amazon.com

Contribute

If you would like to make a contribution to support my books, you can use the button below. Thank you!
Pay what you want:

Are you using one of our books in a class?

We'd like to know about it. Please consider filling out this short survey.



Previous Up Next