Folder Open Duotone Icon

Controllo del flusso di esecuzione in Python

Avatar Mario Giagnotti

·

·

13 min read

Python

In questo articolo, “Controllo del flusso di esecuzione in Python” ci occupiamo delle strutture fondamentali: sequenza, selezione e ripetizione in python

In questo articolo, “Controllo del flusso di esecuzione in Python” ci occupiamo delle strutture fondamentali: sequenza, selezione e ripetizione in python

Input e Output

📥 Input da console

  • input() restituisce sempre una stringa:
name = input("Inserisci il tuo nome: ")
  • Per input numerici:
age = int(input("Inserisci la tua età: "))
price = float(input("Inserisci il prezzo: "))

📤 Output formattato

Talvolta è opportuno inserire dei valori numerici in stringhe di testo
in modo da ottenere un output più chiaro e ordinato da
visualizzare
▪ Python offre diverse soluzioni

Metodi per inserire variabili in stringhe:

  • Concatenazione
print("Ciao " + name + "!")
  • f-String (raccomandato)
print(f"Ciao {name}!")
  • Operatore %
print("Età: %d" % age)
  • Metodo .format()
print("Età: {}".format(age))

✅ Esempio (confronto dei metodi)

pi = 3.14
r = 2.0
area = (r**2) * pi
print('The area of a circle of radius '+str(r)+' is
'+str(area))
print(f'The area of a circle of radius {r} is {area}')
print('The area of a circle of radius %f is %f' % (r, area))
print('The area of a circle of radius {r} is {a}'.format(r=r, a=area))

f-String: dettagli

Una stringa formattata o f-String è una stringa preceduta dal carattere ‘f’ or ‘F’.
▪ Queste stringhe possono contenere dei campi sostituibili, nella forma di espressioni racchiuse tra parentesi graffe Array.
▪ Mentre le stringhe classiche hanno normalmente un valore costante, le f-String sono praticamente espressioni valutate al momento dell’esecuzione.

Sintassi: f"Testo {variabile} testo"

Può includere espressioni:

print(f"La somma è {a + b}") #La somma è ...

Debug con =

print(f"{age=}")  # age=25

🎯 Formattazione nelle f-String

È possibile modificare il formato in cui vengono stampati i valori, utilizzando degli specificatori di formato
▪ Gli specificatori di formato vengono inseriti all’interno delle graffe, dopo l’esspressione da valutare, separati dal simbolo :

Sintassi completa:

Esempi pratici:

f"{pi:10.3f}"    # '     3.142'
f"{7:10.6f}"     # '  7.000000'
f"{pi:.2f}"      # '3.14'

📌 Specificatori utili:

  • Allineamento: < sinistra, > destra, ^ centro
  • Segno: + per sempre, - solo negativi, ' ' (spazio)
  • Tipo:
    • d decimale
    • f punto fisso
    • % percentuale
    • e notazione scientifica

Stampare numeri reali (float)

▪ Quando occorre stampare un numero reale con un determinato
numero di cifre decimali, l’ideale è utilizzare il formato:

f'{pi:10.3f}' # '·····3.142'
f'{pi:8.6f}' # '3.141593'
f'{pi:10.6f}' # '··3.141593'
f'{7:10.6f}' # '··7.000000'

⚠️ Differenza con round()

round(valore, cifre) restituisce un float arrotondato

print(round(7, 3))     # 7

Le f-string permettono maggiore controllo visivo:

print(f"{7:8.3f}")     # '   7.000'

📌 Visualizzare l’esempio volume2.py nella sezione DOWNLOAD

Controllo del flusso di esecuzione

In Python il codice si può organizzare impiegando le tre strutture fondamentali:

  • sequenza;
  • selezione;
  • ripetizione.

Queste strutture permettono di controllare il flusso di esecuzione di un programma, ovvero l’ordine con cui viene eseguita la sequenza di istruzioni che compongo il programma stesso definendo di volta in volta se un gruppo di istruzioni debba essere eseguito o meno a seconda della valutazione di una condizione (selezione) o quale sequenza di istruzioni debba essere ripetuta e per quante volte come conseguenza di una condizione che deve risultare soddisfatta per permetterne la ripetizione (ripetizione).

Sequenza

In Python il concetto di sequenza coincide con quello di blocco di istruzioni dotate della stessa indentazione

Nello schema della tabella successiva è possibile confrontare l’implementazione Python di una sequenza di istruzioni con il formalismo adottato nelle due modalità di rappresentazione di un algoritmo.

Selezione

La selezione in Python prevede i due tipi classici a una e a due vie mostrati nelle due tabelle di seguito:

Osservando la sintassi della struttura di selezione riportata nelle precedenti tabelle, è possibile notare:

  • la presenza obbligatoria del simbolo «:» dopo if<condizione> ed else;
  • l’uso dell’indentazione per definire il blocco di istruzioni da eseguire a seconda della valutazione della condizione della selezione; i blocchi appartenenti alle due possibili vie della selezione devono avere la stessa indentazione: la prima istruzione allineata con la parola chiave if è considerata esterna alla struttura di selezione.

ESEMPIO

Il seguente programma deve calcolare il totale da pagare, applicando uno sconto del 10% per una spesa superiore ai 100 € e del 5% altrimenti:

spesa = float(input("Inserisci la spesa: "))

if spesa > 100:
   print("Applicato sconto del 10%")
    sconto = spesa * 10/100

else:
      print("Applicato sconto del 5%")
      sconto = spesa * 5/100

   spesa = spesa – sconto

print("Totale dovuto:", spesa)

In esso sono però presenti i seguenti errori di indentazione:

  • le istruzioni del blocco associato allo scenario in cui la condizione spesa > 100 è vera non hanno la stessa indentazione;
  • i blocchi associati alle due vie del comando di selezione non hanno la stessa indentazione;
  • l’istruzione spesa = spesa – costo non ha un’indentazione che corrisponde ai livelli di indentazione precedenti il comando di selezione o a quella dei blocchi del comando stesso.

La versione correttamente indentata è la seguente:

spesa = float(input("Inserisci la spesa:"))

if spesa > 100:
   print("Applicato sconto del 10%")
   sconto = spesa * 10/100 

else:
   print("Applicato sconto del 5%")
   sconto = spesa * 5/100

spesa = spesa – sconto

print("Totale dovuto: ", spesa)

Nella costruzione di un programma può essere necessario condizionare l’esecuzione in seguito a più condizioni, per esempio in base ai diversi valori che può assumere una variabile.

Questa situazione può essere gestita in Python:

  • utilizzando una serie di if(...): ... else: ... nidificati;
  • con la sintassi if(...): ... elif(...): ... else: ... che permette una semplificazione del codice.

La forma pertanto più generale della struttura di selezione in Python è la seguente:

if<condizione_booleana 1>:
      <operazione 11>
      ...
      <operazione 1n>

elif<condizione_booleana 2>:
      <operazione 21>
      ...
      <operazione 2n>

elif<condizione_booleana N>:
      <operazione N1>
      ...
      <operazione Nn>

else:
      <operazione E1>
...
      <operazione En>

OSSERVAZIONE Da sottolineare che in una struttura con controlli in sequenza soltanto uno dei «rami» sarà eseguito; in altre parole, una volta che uno dei controlli restituisce True, viene eseguito il relativo blocco di istruzioni e nessuno degli altri. Il ramo relativo alla parola chiave else viene eseguito soltanto se tutti i controlli precedenti hanno restituito False.


ESEMPIO

Le seguenti due soluzioni per il programma che determina la classe di merito (dalla migliore «A» alla peggiore «E») di uno studente in funzione del punteggio centesimale riportato in un test sono equivalenti:

Soluzione 1:

punteggio = int(input("Inserire il punteggio del test: "))

if(punteggio >= 90):
   print("Classe di merito A")

else:
   if(punteggio >= 80):
      print("Classe di merito B") 

   else:
      if(punteggio >= 70):
         print("Classe di merito C")

      else:
         if(punteggio >= 60):
           print("Classe di merito D")

         else:
           print("Classe di merito E")

Soluzione 2:

punteggio = int(input("Inserire il punteggio del test:"))

if(punteggio >= 90):
   print("Classe di merito A")

elif(punteggio >= 80):
   print("Classe di merito B")

elif(punteggio >= 70):
   print("Classe di merito C")

elif(punteggio >= 60):
   print("Classe di merito D")

else:
   print("Classe di merito E")

Per effettuare selezioni multiple le più recenti versioni di Python rendono disponibile la struttura match/case che presenta la seguente struttura sintattica:

match(<variabile>)

 case <valore 1>:
      <operazione 11>
      ...
      <operazione 1n>

 case <valore 2>:
      <operazione 21>
      ...
      <operazione 2n> ...

 case <valore N>:
      <operazione N1>
      ...
      <operazione Nn>

 case other:
      <operazione O1>
      ...
      <operazione On>

Il codice associato a ogni clausola case viene eseguito solo se la variabile assume il corrispondente valore; il codice associato alla clausola con valore other viene eseguito se il valore della variabile non corrisponde ad alcuna delle possibilità indicate nelle altre clausole case.

OSSERVAZIONE La clausola case può:

  • essere associata a più valori utilizzando la sintassi

case(<valore1> | <Valore2>):

  • contenere ulteriori condizioni da soddisfare per eseguire il blocco di istruzioni, in aggiunta alla corrispondenza del valore, mediante la sintassi

case <valore> if <condizione>:


ESEMPIO

La tabella illustra le classi di merito (dalla migliore «A» alla peggiore «E») corrispondenti ai punteggi decimali di un test per la valutazione degli studenti.

Il seguente programma visualizza la classe di merito associata al punteggio fornito come input:

punteggio = int(input("Inserire il punteggio del test: "))

classe = ''

match(punteggio):
   case (9 | 10):
      classe = 'A'

   case 8:
      classe = 'B'

   case 7:
      classe = 'C'

   case 6:
      classe = 'D'

   case punteggio if punteggio < 6:
      classe = 'E'

   case other:

      print("Punteggio", punteggio, "non valido")

print("Classe di merito", classe)

Ripetizione

In relazione alla struttura di ripetizione Python consente l’implementazione dei due tipi base dello schema iterativo:

  • ciclo indeterminato (prima tabella);
  • ciclo determinato (seconda tabella).

ESEMPIO

Il programma seguente richiede in input all’utente due valori interi, uno per la base e uno per l’esponente, e calcola e visualizza la potenza:

p = 1

b = int(input("Inserire la base: "))

e = int(input("Inserire l'esponente: "))

while(e > 0):
   p = p * b
   e = e - 1

print("La potenza è:" , p)

L’istruzione while a ogni ciclo valuta la condizione contenuta tra la parola chiave while e il simbolo «:» e, se vera, esegue il blocco di istruzioni successivo che deve essere indentato rispetto la parola chiave while.

OSSERVAZIONE Python non prevede una struttura iterativa con controllo in coda

Un’implementazione per questo tipo di iterazione è mostrata nell’esempio seguente:


ESEMPIO

'''Il programma richiede in input un valore intero e visualizza il numero di cifre di cui è costituito in base 10'''

c = 0

ripeti_ciclo = True

numero = int(input("Inserire un valore: "))

n = numero

while(ripeti_ciclo):
   n = int(n/10)
   c = c + 1
   if(n <= 0):
      ripeti_ciclo = False

print("Il numero di cifre del numero", numero, "è", c)

Per implementare cicli determinati da una sequenza o un intervallo di valori Python prevede l’istruzione for.

Nel caso più semplice la situazione è quella rappresentata nella tabella seguente:

La sintassi dell’istruzione for utilizza un operatore in che restituisce la condizione booleana True se il valore della variabile di iterazione appartiene alla sequenza.

Il for a ogni ciclo:

  • prende in ordine uno dei valori della sequenza esplicitata;
  • lo assegna a una variabile;
  • esegue il blocco di istruzioni presente dopo il simbolo «:» e opportunamente indentato rispetto la parola chiave if.

Ripete le operazioni finché l’operatore in restituisce True.

La sequenza di valori da prendere in considerazione mediante l’operatore in può essere espressa racchiudendo i valori separati da «,» (non è obbligatorio racchiudere i valori tra «(» e «)» ma il loro utilizzo facilita la lettura del codice). I valori racchiusi in questo tipo di sequenza possono essere di qualsiasi tipo e diversi tra loro.


Le seguenti istruzioni visualizzano sequenze contenenti valori di tipo omogeneo ed eterogeneo:

for i in (1, 2, 3):
   print(i) #stampa 1 2 3
   
for i in (1, 'abc', 3.14):
   print(i) #stampa 1 abc 3.14

In presenza di una sequenza di valori numerici intervallati da periodo costante è possibile utilizzare la funzione range() per definire una sequenza.

Nella sua formulazione più semplice

range(<valore_finale>)

la funzione range ritorna una sequenza di valori numerici partendo dal numero 0 e incrementati di un’unità fino al valore finale escluso

Il programma seguente richiede in input all’utente un valore intero e visualizza la somma di tutti i numeri naturali minori o uguali al valore fornito:

somma = 0

n = int(input("Inserire un valore: "))

for i in range(n + 1):
   somma += i

print("La somma dei primi numeri è", somma)

range ha tre parametri: (inizio, fine, passo). Passo può essere positivo o negativo. Ad esempio se voglio generare tutti i numeri tra 10 e 40(escluso) con passo 5 scrivo:

for i in range(10, 40, 5):
       print(i) #stampa 10 15 20 25 30 35

Se voglio generare tutti i numeri tra 10 e 0 con passo -2 scrivo:

for i in range(10, 0, -2):
       print(i) #stampa 10 8 6 4 2

Python ha due specifiche istruzioni per controllare l’esecuzione dei cicli: break e continue.

L’istruzione break, eseguita nel corpo di un ciclo, forza l’uscita immediata da esso interrompendo il processo iterativo e proseguendo l’esecuzione dall’istruzione successiva al ciclo stesso.

L’istruzione continue fa sì che vengano ignorate le istruzioni del corpo del ciclo che eventualmente sono specificate dopo di essa, ripartendo dalla prima istruzione del ciclo stesso per la successiva iterazione.

OSSERVAZIONE Le istruzioni break e continue, quando utilizzate, sono sempre inserite nel corpo di un ciclo in modo che la loro esecuzione sia controllata dal verificarsi di specifiche condizioni (tipicamente nell’ambito di una struttura di selezione). In caso contrario esse altererebbero il significato del blocco di istruzioni la cui esecuzione deve essere ripetuta.

ESEMPIO: Il programma seguente visualizza la media dei valori numerici inseriti dall’utente fino a che non viene inserito un valore negativo, ignorando quelli maggiori di 10:

somma = 0.0

contatore = 0

while(True):
   numero = float(input("Inserire un valore numerico: "))
   if(numero < 0):
      break

   if(numero > 10):
      continue

   somma += numero

   contatore += 1

media = somma/contatore

print("La media è", media)

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *