Sintassi di Python: indentazione e istruzioni per flusso

Sintassi di Python: indentazione e istruzioni per flusso

29 Ago 2018 5 Di Admin M.

Adesso che abbiamo conosciuto i principali tipi di dati, passiamo ad analizzare la sintassi di Python: i comandi che possiamo utilizzare per operare su di essi.

 

 

La sintassi di Python

 

Prima di tutto, prenderemo in esame l’indentazione; poi vedremo le istruzioni per il controllo del flusso: if, for, while, break, continue e pass. 

 

L’identazione

 

La sintassi di Python si differenzia dagli altri linguaggi di programmazione in particolare per l’indentazione.

 

Diamo uno sguardo al seguente esempio di codice Python:

 

Sintassi di Python: indentazione

 

 

E’ facile notare a vista d’occhio dove termina un blocco di istruzioni e dove inizia il successivo.

Questo invece è lo stesso programma scritto in C da un programmatore particolarmente ‘perverso’:

 

Esempio identazione scorretta - Python

 

 

Chiunque sia stato così sfortunato da dover eseguire la manutenzione di un frammento di codice scritto più o meno in questo modo, probabilmente ricorda ancora il tenore dei suoi pensieri in quei tragici momenti…

 

L’esempio appena presentato è sicuramente un eccesso; nessun programmatore con un po’ di sale in zucca si azzarderebbe a scrivere un codice sorgente in tal modo.

Tuttavia nulla impedisce di farlo: magari per la fretta di qualche scadenza imminente, può sfuggire qualche riga di codice disordinata e di difficile interpretazione.

 


Esiste addirittura un concorso internazionale per programmi scritti in C in maniera intenzionalmente incomprensibile: “The International Obfuscated C Code Contest”.

Il sito dove possiamo trovare delle vere e proprie opere d’arte è: www.ioccc.org. Si tratta di programmi realmente funzionanti, scritti in linguaggio C.

Eccone un esempio:

 

Codice C concorso - Python

Un candidato al concorso 2018 per il codice sorgente più illegibile.


 

Noi invece dobbiamo proprio scordarci di essere disordinati: il disordine è vietato a livello di sintassi di Python.

 

Anche in Python esiste la possibilità di scrivere “brutti” programmi, ma già essere quanto meno intenzionati all’ordine, elimina in partenza una delle principali fonti di incomprensione nella lettura e nella manutenzione del codice sorgente.

 


In IDLE possiamo indentare il codice premendo il tasto TAB e de-indentarlo premendo il tasto BACKSPACE.

Normalmente IDLE propone già l’indentazione corretta: per esempio, nella riga che segue un’istruzione if  o while

il cursore si posiziona già a un livello di indentazione in più rispetto alla riga precedente.


 

Un altro grande vantaggio dell’indentazione è il fatto che la regola di chiusura di un blocco di codice è universale.

 

Per chiudere un blocco non dovremmo specificare con un end, endif, fi, parentesi graffe o tonde, wend e chi più ne ha più ne metta, come per altri linguaggi.

Ci basta quest’unica, semplice e meravigliosa regola: rispettare l’indentazione del codice.

 

 

L’istruzione if

 

L’if è forse l’istruzione più comune fra tutti i linguaggi di programmazione.

Vediamo un esempio di if, completo in tutte le sue possibilità:

 

Sintassi di Python: Istruzione if

 

 

La sintassi dell’istruzione if è semplice, non c’è molto altro da dire dopo aver visto questo esempio.

 

Possiamo limitarci a osservare l’uso del carattere “:” che indica la fine del test che controlla il flusso del programma.

Potete inserire tutti gli elif di cui avere bisogno e l’ultimo else non è mai obbligatorio.

 

 


In Python non esiste il corrispondente dell’istruzione switch in C o del Select Case in Visual Basic.

Dobbiamo pertanto usare una sequenza di if…elif…elif…else.


 

Nella sintassi di Python i test booleani usano una convenzione ormai consolidata nella stragrande maggioranza dei linguaggi:

 

  • == : per il test di uguaglianza;
  • >, >=, <, <= : per i test comparativi;
  • != : per il test di disuguaglianza.

 

 

L’istruzione for

 

For è l’istruzione che in Python ci permette di definire delle iterazioni.

Per decidere quante iterazioni svolgere e su quale elemento eseguire l’iterazione, possiamo usare un qualunque oggetto che possa essere considerato una sequenza.

 

Ormai abbiamo già visto parecchi esempi di sequenze: liste, stringhe, tuple, sono tutti dati che possiamo usare per le iterazioni con for

 

Sintassi di Python: Istruzione for

 

 

Ma come fare se vogliamo semplicemente eseguire un’iterazione per un certo numero di volte e non abbiamo una sequenza adatta?

In questo caso useremo il costrutto range:

 

For: costrutto "range" - Python

 

 

Con range possiamo specificare anche l’inizio, la fine e il passo dell’iterazione:

 

Costrutto "range" con inizio, fine e passo - Python

 

 


Non è consigliabile modificare la lista sulla quale si basa l’iterazione del for.

Se proprio dobbiamo farlo, dovremmo passare a for una copia della lista, anziché la lista stessa.

Ci ricordiamo come si duplica facilmente una lista? Basta usare lo slicing senza indici: “[ : ]”.


 

Fino a qui il costrutto for  non è molto diverso dall’omologo costrutto presente in altri linguaggi di programmazione.

Ma ancora una volta la sintassi di Python offre qualcosa in più, ci permette di eseguire un ciclo su più variabili contemporaneamente.

 

Definiamo un dizionario ed eseguiamo un loop sui suoi elementi:

 

Ciclo for con dizionario - Python

 

 

Questa forma è possibile perché, come abbiamo visto nell’articolo dedicato ai dizionari,  il metodo items di un dizionario restituisce un oggetto iterabile come sequenza di tuple, composte dalla chiave e dal rispettivo valore. For esegue un ciclo su ogni elemento e assegna alle variabili key e value i due valori presenti in ciascuna tupla.

 

Spesso ci capiterà di voler contare gli elementi di una sequenza mentre la esaminiamo.

Una funzione pronta all’uso per svolgere questa operazione si chiama enumerate

 

Funzione "enumerate" - Istruzione "for" Python

 

 

Se invece abbiamo liste distinte e vogliamo definire dei cicli su di esse, possiamo usare la funzione predefinita zip

 

Funzione "zip" - Istruzione "for" Python

 

 

L’istruzione while

 

L’istruzione while è simile a for, ma differisce per un solo particolare: l’iterazione non si basa su una sequenza, ma continua fino a che rimane verificata la condizione che la segue:

 

Sintassi di Python: Istruzione "while"

 

 


All’apparenza, in questo esempio, il codice che segue while non è indentato: in realtà l’indentazione c’è ma non si vede.

Perché stiamo usando IDLE in modalità interattiva: per questo motivo il while viene subito dopo il prompt, mentre le due righe seguenti sono indentate di un blocco.


 

Le istruzioni break e continue 

 

Potrà succedere che, sia con for che con while, capiti la necessità di terminare bruscamente il ciclo o di passare all’iterazione successiva: per queste due operazioni la sintassi di Python mette a disposizione rispettivamente le istruzioni break e continue.

 

Sintassi di Python: Istruzioni "break" e "continue"

 

 

Visto il funzionamento di break e continue, facciamo un attimo un passo indietro.

Le istruzioni for e while di Python hanno anche un altro particolare: l’else. Ma come? L’else non era una clausola dell’if?  E’ vero, però ci può tornare comodo anche con i cicli.

 

Le istruzioni che scriveremo nella parte else, verranno eseguite al termine del ciclo, sempre che non decidiamo di terminarlo prima con un break.

 

Esempio programma while con else - Python

 

 

Questo breve programma calcola e visualizza tutti i numeri primi compresi fra 1 e 99: per i numeri non primi visualizza invece la prima fattorizzazione trovata.

 

 

 

L’istruzione return

 

Vedremo in dettaglio l’istruzione return in un prossimo articolo dedicato alle funzioni.

Per ora ci basti sapere che questa istruzione provoca l’uscita da una funzione e la restituzione del valore (o dei valori) che la seguono:

 

Sintassi di Python: Istruzione "return"

 

 

L’istruzione import

 

Abbiamo già visto in diversi esempi come funziona import e a cosa serve: ci permette di caricare nel programma corrente una libreria di funzioni matematiche.

 

Possiamo usarlo in due modi differenti:

  • importando la libreria in toto e usando le funzioni con il nome della libreria come prefisso:

 

Istruzione "import" totale - Python

 

 

  • Oppure importando le singole funzioni dalla libreria per poterle usare direttamente (in questo caso l’istruzione è from…import…):

 

Istruzione "import" singole funzioni - Python

 

 


E’ preferibile non abusare di questa seconda sintassi di import, si rischierebbe di “inquinare” con troppi valori lo spazio dei nomi delle variabili e delle funzioni locali.

Nell’esempio precedente, per esempio, se definissimo in seguito una variabile chiamata “pi”, perderemmo il riferimento al valore originale di pi greco

(il math.pi del primo esempio rimarrebbe invece perfettamente accessibile comunque).


 

L’istruzione assert

 

La traduzione italiana di assert è “affermare”, “asserire”. Questa istruzione ci permette appunto di definire, in un certo punto del programma, che ci aspettiamo che una certa condizione venga sempre verificata.

Se non lo è, viene generato un errore (viene sollevata un’eccezione per la precisione, ma aspettiamo l’articolo dedicato ad esse per parlarne approfonditamente).

 

Proviamo a scrivere una funzione che ritorni il valore maggiore tra i due passati come parametri e, prima di restituire il valore maggiore, asseriamo che quest’ultimo debba essere uno dei due parametri:

 

Sintassi di Python: Istruzione "assert"

 

 

L’assert ha evidenziato un problema della nostra funzione: se i due valori sono uguali, nessuno dei due if  viene eseguito e quindi val_max  mantiene il valore iniziale None.

 


L’assert  può in certi casi fungere anche in parte come documentazione del codice, visto che definisce una condizione sempre vera in un dato punto del programma.


 

L’istruzione pass

 

In fase di stesura iniziale di un programma, potrà capitarci di voler scrivere un costrutto if o while  senza alcuna istruzione, tranne un commento.

Come possiamo dire a Python che nel blocco che stiamo scrivendo non c’è alcuna istruzione? Se dopo un if  non inseriamo alcuna indentazione, l’interprete ci segnalerà un errore.

 

La soluzione è rappresentata dall’istruzione pass , che non fa assolutamente nulla, se non “tenere occupato il posto”.

Vediamo un esempio per chiarire meglio il funzionamento di tale istruzione:

 

Sintassi di Python: Istruzione "pass"

 


In realtà pass può servire non solo in una fase iniziale della stesura di un programma.

Quando, nella gestione di un’eccezione, non vogliamo fare nulla, nella relativa parte di codice (obbligatoria) scriveremo solo l’istruzione pass.

Capiremo meglio il significato di questa nota nel prossimo articolo dedicato alle eccezioni.


Error - Python

 

 

Una volta scoperto cosa ci offre la fantastica sintassi di Python, continuiamo il nostro percorso dedicandoci alle eccezioni.

 

Non perdere il prossimo articolo, iscriviti alla nostra newsletter!

Segui la nostra sezione dedicata alla programmazione in Python!