1.2.2 - Programmazione strutturata¶
Come tutti i linguaggi derivati da C, anche Python offre il supporto ai principali costrutti della programmazione strutturata. Vediamoli brevemente.
Istruzione condizionale¶
Partiamo dall'istruzione condizionale che, come in tutti i linguaggi di programmazione, è espressa dalle parole chiave if
ed else
.
La sintassi base è di questo tipo:
In pratica, se condizione_verificata
è vero, allora saranno eseguite le istruzioni
. In alternativa, se condizione_verificata
è falso, allora saranno eseguite le altre_istruzioni
. Ad esempio:
Per utilizzare la notazione else if
dovremo ricorrere alla parola chiave elif
. Ad esempio:
>>> if a < 5:
>>> print('a è minore di 5')
>>> elif a == 5:
>>> print('a è uguale a 5')
>>> else:
>>> print('a è maggiore di 5')
Switch/case in Python
Fino alla versione 3.10, Python non offriva un'implementazione per il costrutto switch/case
. A partire da quest'ultima, però, è stato implementato il cosiddetto pattern matching mediante la sintassi match/case
:
Approfondiremo questo costrutto nell'apposita lezione.
Cicli¶
Ciclo for
¶
Il ciclo for
itera su una sequenza, come una lista o una stringa, ed ha una sintassi del tipo:
Per fare un esempio, nel seguente blocco di codice vediamo come mostrare a schermo in maniera iterativa i numeri che vanno da 0 a 5 (escluso):
Il risultato che sarà stampato a schermo è:
Rispetto ai linguaggi "classici", quindi, il ciclo for
opera esclusivamente sugli iterabili, per cui potrebbe in qualche caso occorrere una riprogettazione del codice. Tuttavia, questa caratteristica di Python comporta anche una maggiore semplicità del codice; ad esempio, vediamo come è molto semplice iterare su una stringa:
A schermo vedremo in entrambi i casi il seguente risultato:
No free lunches!
Come ci ricorda il no free lunches theorem, non esistono pasti gratuiti! Infatti, la maggiore semplicità sintattica offerta da Python non è indolore, ma ha un costo. Uno script Python, infatti, per quanto ottimizzato, non potrà quasi mai offrire performance paragonabili ad un codice ottimizzato in C o C++, a meno di non usare particolari (ed avanzati) accorgimenti.
Ciclo while
¶
A differenza del ciclo for
, il funzionamento del while
è analogo a quello delle controparti negli altri linguaggi di programmazione. La sintassi generica è:
Ad esempio:
import random
i = True
while (i):
if random.randint(-5, 5) > 0:
print("Continuo!")
else:
print("Esco!")
i = False
Il codice nel blocco precedente non fa altro che generare un valore numerico intero casuale nell'intervallo \([-5, 5]\) mediante la funzione randint
. Se tale valore è superiore a \(0\), il ciclo continua, altrimenti si esce dallo stesso.
A schermo vedremo, ad esempio:
I valori booleani in Python
I più attenti avranno notato come i valori booleani in Python siano stati scritti come True
e False
. Questo non è un refuso: la prima lettera è proprio una maiuscola.
La funzione range()
¶
Riprendiamo adesso il ciclo for
visto in precedenza.
Nonostante il codice sia già compatto, scrivere manualmente la sequenza da iterare può facilmente diventare un'operazione abbastanza complessa. Python ci viene quindi in aiuto tramite la funzione range(i, j, s)
, che genera una sequenza avente tutti i numeri compresi tra i
(incluso) e j
(escluso) a passo s
. Ad esempio, per generare i numeri compresi tra 0 e 4 scriveremo:
Nota
Notiamo che per mandare in output i valori di r
dovremo convertirlo in lista (list(r)
).
Qualora omessi, i
ed s
assumono valori di default rispettivamente 0 ed 1:
E' anche possibile specificare una sequenza decrementale ponendo i > j
ed s < 0
:
Istruzioni break
e continue
¶
Le istruzioni break
e continue
permettono rispettivamente di uscire dal ciclo o di saltare all'iterazione successiva. Ad esempio:
while (True):
if randint(-5, 5) > 0:
print("Continuo!")
continue
else:
print("Esco!")
break
print("Sono uscito!")
Le istruzioni precedenti usciranno dal ciclo quando viene generato casualmente un numero negativo, mentre continueranno ad iterare quando viene generato casualmente un numero positivo.