Vai al contenuto
Leo

Parte I — Le basi

Capitolo 2 — Variabili e costanti

Un programma che non ricorda nulla può fare ben poco. Le variabili sono i cassetti in cui il programma mette i dati per ritrovarli più tardi: un punteggio, un nome, una lista della spesa. Ogni cassetto ha un nome che scegli tu, e dentro ci metti un valore.

Dichiarare e cambiare

In Leo una variabile si dichiara la prima volta con la parola variabile, seguita dal nome, un segno di uguale e il valore iniziale. Dopo, per cambiarle valore, basta il nome e il segno di uguale:

Leo
variabile punti = 0
scrivi "All'inizio: {punti}"
punti = 10
scrivi "Dopo aver segnato: {punti}"
punti += 5
scrivi "Con il bonus: {punti}"
Risultato
All'inizio: 0
Dopo aver segnato: 10
Con il bonus: 15

Nota la differenza: la prima volta serve variabile (stai creando il cassetto); le volte successive no (il cassetto esiste già, lo stai solo riempiendo di nuovo). L'ultima riga usa +=, una scorciatoia che vuol dire «aggiungi a quello che c'è già»: punti += 5 è identico a punti = punti + 5. Esistono anche -=, *= e /=, con lo stesso senso.

💡 L'idea — L'etichetta e il contenuto

Una variabile è come un armadietto con un'etichetta. Il nome che scegli è l'etichetta incollata sullo sportello; il valore è ciò che hai messo dentro. Quando scrivi punti = 10 stai cambiando il contenuto dell'armadietto, non l'etichetta: il nome resta lo stesso, cambia solo quello che custodisce. Ecco perché puoi riempirlo e svuotarlo quante volte vuoi senza doverlo ri-dichiarare.

Questa regola — variabile solo alla nascita — non è una formalità noiosa. Serve a proteggerti dai refusi. Se scrivi per sbaglio pnuti = 3 pensando a punti, Leo non crea di nascosto una variabile nuova: si ferma e te lo dice.

Risultato
ErroreNome alla riga 1, colonna 1 di programma.leo

    1 | pnuti = 3
      | ^^^^^

`pnuti` non esiste ancora: una variabile nuova si crea con `variabile`.
Suggerimento: Scrivi `variabile pnuti = 3`; dopo, per cambiarle valore, basta `pnuti = ...`.

In un linguaggio che crea le variabili al volo, quel refuso sarebbe passato inosservato e il bug si sarebbe manifestato molto più tardi, molto più lontano.

Stampare il valore, non il nome

Qui c'è una trappola gentile in cui tutti inciampano una volta. Ricordi che scrivi senza parentesi tratta quello che segue come testo? Allora questa riga:

Leo
scrivi punti

...non stampa il valore di punti: stampa la parola punti. Per mostrare il valore hai due strade, entrambe corrette:

Leo
scrivi(punti)              # forma con parentesi: calcola e stampa il valore
scrivi "Punti: {punti}"    # interpolazione: il valore entra nel testo

Tienilo a mente: le parentesi (o le graffe dentro un testo) vogliono dire «calcola». Senza di esse, scrivi prende le parole alla lettera. È la stessa regola del capitolo scorso, vista da un'altra angolazione; dopo un po' diventa naturale.

Le costanti: valori che non devono cambiare

A volte un valore non deve mai cambiare per tutta la vita del programma: l'aliquota IVA, il numero di giocatori, il titolo di una finestra. Per questi casi c'è la costante, che si dichiara con costante:

Leo
costante IVA = 22
variabile prezzo = 100
scrivi "Prezzo con IVA: {prezzo + prezzo * IVA / 100}"
Risultato
Prezzo con IVA: 122.0

(Il risultato è 122.0, con il punto e lo zero: la divisione / in Leo dà sempre un numero decimale. Ne parleremo nel prossimo capitolo.)

La differenza con una variabile è che una costante, una volta dichiarata, non si può più cambiare. Se ci provi, Leo ti ferma:

Risultato
ErroreValore alla riga 2, colonna 1 di programma.leo

    2 | IVA = 10
      | ^^^

`IVA` è una costante: non si può cambiare il suo valore.
Suggerimento: Se deve cambiare, dichiarala con `variabile` invece di `costante`.

Non è una punizione: è una rete di sicurezza. Dichiarare costante un valore che non deve cambiare documenta la tua intenzione e impedisce che un errore distratto lo modifichi. Usa costante ogni volta che puoi; variabile solo quando il valore deve davvero cambiare.

🦁 Curiosità — La costante che definisce il metro

La velocità della luce nel vuoto vale esattamente 299.792.458 metri al secondo. «Esattamente» non è un modo di dire: dal 1983 quel numero è fissato per convenzione, e il metro viene definito a partire da esso, come la distanza che la luce percorre in una frazione precisa di secondo. In natura come nel codice, una costante serve proprio a questo: dare un nome stabile a un valore su cui tutto il resto può appoggiarsi.

Più valori in una volta sola

Una dichiarazione (o un'assegnazione) può riguardare più nomi insieme, separati da virgole. È comodo quando i valori arrivano da una lista o quando vuoi assegnarne diversi in una riga:

Leo
variabile nome, anni = ["Beatrice", 24]
scrivi "{nome} ha {anni} anni"
variabile a, b = 1, 2
a, b = b, a
scrivi "a vale {a}, b vale {b}"
Risultato
Beatrice ha 24 anni
a vale 2, b vale 1

L'ultima riga merita attenzione: a, b = b, a scambia i due valori senza bisogno di una variabile d'appoggio. Funziona perché Leo calcola prima tutti i valori a destra e solo dopo li assegna. Se nomi e valori non sono lo stesso numero, l'errore te lo dice con precisione: «Ci sono 2 nomi ma 3 valori.»

Aumentare e diminuire a parole

Oltre a += e -=, Leo offre due parole che si leggono come una frase: aumenta e diminuisci. Dopo di scrivi di quanto; senza di, vuol dire di uno:

Leo
variabile punti = 0
variabile vite = 3
aumenta punti di 10
diminuisci vite
scrivi "Punti: {punti}, vite: {vite}"
Risultato
Punti: 10, vite: 2

Sono perfettamente equivalenti a punti += 10 e vite -= 1: scegli la forma che in quel punto si legge meglio.

Dove vive una variabile

Ogni blocco di codice — lo vedremo meglio parlando di cicli e funzioni — ha un suo spazio. Una variabile dichiarata dentro un blocco con variabile esiste solo lì dentro; fuori non si vede. Per cambiare invece una variabile che esisteva già prima, basta il segno di uguale (senza variabile):

Leo
variabile totale = 0
per ogni n in [1, 2, 3] fai
    variabile doppio = n * 2     # esiste solo dentro il ciclo
    totale += doppio             # cambia la variabile di fuori
fine
scrivi "Il totale è {totale}"
Risultato
Il totale è 12

La variabile doppio nasce e muore a ogni giro del ciclo; totale, dichiarata fuori, sopravvive e accumula. Questa separazione — che si chiama visibilità o ambito — tiene i programmi ordinati: le variabili temporanee non «sporcano» il resto del codice. Torneremo sull'argomento quando parleremo di funzioni, dove conta davvero.

I nomi

Qualche parola sui nomi delle variabili, perché nomi buoni valgono più di molti commenti. Un nome inizia con una lettera o un trattino basso _ e prosegue con lettere, cifre e trattini bassi. Le lettere accentate sono ammesse, quindi età e città sono nomi legittimi. Scegli nomi che dicono cosa contengono: media_voti è meglio di m, prezzo_finale è meglio di x. Il tuo io del mese prossimo ti ringrazierà.

Prova tu

  1. Dichiara una costante con il tuo anno di nascita e una variabile con l'anno corrente, poi stampa quanti anni compi quest'anno.
  2. Crea tre variabili a, b, c con tre valori a tuo piacere su una riga sola, poi ruotale: a prende il valore di b, b quello di c, c quello di a. Stampa i tre valori prima e dopo.
  3. Prova a scrivere scrivi prezzo (senza parentesi) in uno degli esempi e guarda cosa succede. Poi correggilo in scrivi(prezzo). Hai capito la differenza?