Controllo del flusso

In questo capitolo vedremo i condizionali e i cicli (loop).
Istruzioni condizionali
Se un programma fosse una lista di comandi da eseguire in sequenza, uno per uno, non sarebbe molto utile. I condizionali ci permettono di verificare le condizioni e rendere al nostro programma di comportarsi in un modo o nell’altro, di eseguire un pezzo di codice o di un altro, a seconda della condizione.
È qui dove hanno la loro importanza il tipo booleano e gli operatori logici e relazionali, che abbiamo visto nel capitolo sui tipi di base di Python.
if
La forma più semplice di un condizionale è un if (se, dall’inglese), seguita dalla condizione da valutare, due punti (:) e nella seguente linea indentata, il codice da eseguire se la condizione compie detta condizione.
				fav = "mundogeek.net"
				# se (if) fav è uguale a "mundogeek.net"
				if fav == "mundogeek.net":
				    print "Hai buon gusto!"
				    print "Grazie"
Come potete vedere è molto semplice.
Assicuriamoci che se si identa il codice così come si è fatto nell’esempio, cioè premendo il tasto TAB di tabulazione prima dei due commandi print, indichiamo a Python la nostra intenzione di eseguire i due print nel caso si compia la condizione e non di eseguire il primo print se la condizione è vera e l’altro print sempre: quindi nell’ultimo caso si espressa così:
				if fav == "mundogeek.net":
				    print "Hai buon gusto!"
				print "Grazie"
In altri linguaggi di programmazione, i blocchi di codice sono racchius1 dalle parentesi graffe, e l’indentazione è solo una buona pratica per rendere più facile seguire il flusso del programma con un solo sguardo. Ad esempio, il codice di cui sopra in Java sarebbe espresso in questo modo:
				String fav = "mundogeek.net";
				if (fav.equals("mundogeek.net")){
				    System.out.println("Hai buon gusto!");
				    System.out.println("Grazie");
				}
Tuttavia, come già accennato, in Python è un obbligo e no una scelta. Questo costringerà ai programmatori di identare il codice per renderlo più facile da leggere.
if … else
Vediamo ora una condizione più complicata. Cosa faremmo se volessimo eseguire un certo comando nel caso in cui la condizione non è soddisfatta? Naturalmente si potrebbe aggiungere un altro if che avesse come condizione la negazione della prima:
				if fav == "mundogeek.net":
				    print "Hai buon gusto!"
				    print "Grazie"
				if fav != "mundogeek.net":
				    print "Peccato, mi dispiace"
ma il condizionale ha un seconda costruzione molto più utile:
				if fav == "mundogeek.net":
				    print "Hai buon gusto!"
				    print "Grazie"
				else:
				    print "Peccato, mi dispiace"
Si vede che la seconda condizione può essere sostituita con un else (dall’inglese, se non altrimenti). Se leggete il codice si vede che ha senso: “Se fav è uguale a mundogeek.net, stampa questo e questo, se non, stampa quest’altro.
if … elif … elif … else
C’è ancora un’altra costruzione, che è quella che fa’ uso dell’elif.
				if numero < 0:
				    print "Negativo"
				elif numero > 0:
				    print "Positivo"
				else:
				    print "Zero"
elif è una contrazione di else if, quindi con elif numero > 0 può essere letto come “in caso contrario, se il numero è maggiore di 0“. Cioè, prima valuta la condizione if. Se fosse vero, si esegue il codice e il codice continua a funzionare dopo il condizionale elif. Se non si compie la condizione if viene valutata la condizione elif. Se si compie la condizione elif viene eseguito il suo codice e continua ad eseguire il codice dopo il condizionale, se non si compie la condizione elif e c’è un’altro elif si continua con il prossimo in ordine di apparizione. Se non si compie la condizione if e nessuna delle elif, si esegue il codice else.
A if C else B
Vi è anche una costruzione simile all’operatore ? di altri linguaggi, che è solo un modo compatto per esprimere un if else. In questa costruzione viene valutato il predicato C e restituisce A se si compie altrimeti restituisce B. Ecco un esempio:
				var = "pari" if (num % 2 == 0) else "dispari"
E questo è tutto. Se conoscete altri linguaggi di programmazione speravate la descrizione dell’interruttore switch, ma in Python non c’è questa costruzione: potrebbe essere emulato da un semplice dizionario. Così andiamo direttamente ai cicli (loops).
Cicli
Mentre il condizionale ci permette di eseguire frammenti di codice diversi a seconda di determinate condizioni, i cicli ci permettono di eseguire un singolo pezzo di codice per un certo numero di volte, mentre una certa condizione è soddisfatta.
while
Il ciclo while (dall’inglese mentre) esegue un frammento di codice mentre la condizione è soddisfatta.
				eta = 0
				while eta < 18:
				    eta = eta + 1
				    print "Complimenti, hai " + str(eta) + " anni!"
La variabile eta comincia con un valore pari 0. Siccome la condizione eta è inferiore a 18 è vera (0 è inferiore a 18), si entra nel ciclo (loop). Allora si aumenta la variabile eta di 1 e stampa il messaggio che informa l’utente che ha compiuto un anno. Ricordate che l’operatore + per le stringhe opera concatenando entrambe le stringhe. Inoltre è necessario utilizzare la funzione str (da string, stringa) per trasformare i numeri in stringhe, dal momento che non è possibile concatenare i numeri con le stringhe, ma discuteremo di questo nei capitoli successivi.
Finito di stampare il messaggio, si rivaluta la condizione e siccome 1 è ancora inferiore a 18, esegue il codice che aumenta la variabile eta di 1o e stampa il suo valore sullo schermo. Il ciclo continuerà a rivalutare la condizione fino a che la variabile eta sia pari a 18, momento in cui la condizione non sarà più soddisfatta e il programma dovrebbe continuare a eseguire le sucessive istruzioni che seguono il ciclo.
Ora immaginate che ci dimentichiamo di scrivere la dichiarazione che aumenta la variabile eta. In tal caso, non si raggiungerà mai la condizione dove questa variabile sia pari o superiore a 18; sarebbe sempre 0, e il ciclo continuerà indefinitamente a scrivere sullo schermo
Complimenti, hai 0 anni!“.
Questo fenomeno è noto come un ciclo infinito.
Tuttavia ci sono situazioni in cui un ciclo infinito è utile. Ad esempio, come questo piccolo programma che ripete tutto quello che l’utente scriva finché non digita “ciao“.
				while True:
				    tastiera = raw_input("> ")
				    if tastiera == "ciao":
				        break
				    else:
				       print tastiera
Per ottenere ciò che l’utente ha digitato sullo schermo usiamo la funzione raw_input. Non hai bisogno di sapere cos’è una funzione o come funziona esattamente, accetta solo che per ogni iterazione la variabile tastiera avrà come contenuto ciò che l’utente ha digitato finché non preme il tasto Invio.
Verifichiamo quindi se l’utente ha digitato “ciao“, nel qual caso verrà eseguito l’ordine break o se si tratta di qualsiasi altra parola, nel qual caso stamperà ciò che l’utente ha digitato.
La parola chiave break (rottura) esce dal ciclo in cui siamo.
Questo ciclo può anche essere scritto come segue:
				uscire = False
				while not uscire:
				    tastiera = raw_input()
				    if tastiera == "ciao":
				      uscire = True
				    else:
				      print tastiera
… ma ci ha servito per vedere come funziona il break.
Un’altra parola chiave che possono trovate all’interno dei cicli è continue (continuare). Come avete intuito che non fa altro che andare direttamente alla prossima iterazione del ciclo.
				eta = 0			
				while eta < 18:
				    eta = eta + 1
				    if eta % 2 == 0:
				        continue
				    print "Complimenti, hai " + str(eta) + " anni!"
Come potete vedere questa è una piccola modifica del nostro programma di auguri. Questa volta abbiamo aggiunto un if che controlla se l’età è pari, nel qual caso salta all’iterazione successiva invece di stampare il messaggio. Cioè, con questa modifica il programma stampa i complimenti solo quando l’età è dispari.
for … in
Quelli che hanno avuto precedenti esperienze con qualche linguaggio, questo ciclo vi sorprenderà piacevolmente. In Python for viene utilizzato come un modo generico per iterare in una sequenza. E come tale ci riesce a facilitare il suo uso per questo scopo.
Questo è l’aspetto di un ciclo for in Python:
				sequenza = ["uno", "due", "tre"]
				for elemento in sequenza:
				    print elemento
Come abbiamo detto i for si utilizzano in Python per attraversare sequenze, quindi useremo un tipo di sequenza, come la lista, per il nostro esempio.
Leggiamo l’intestazione del ciclo come se fosse un linguaggio naturale “”per ogni elemento in sequenza“”. E questo è esattamente ciò che fa’ il ciclo: per ogni elemento che abbiamo in sequenza, eseguire queste righe di codice.
Ciò che fa’ l’intestazione del ciclo è di ottenere il seguente elemento della sequenza e lo memorizza in una variabile di nome elemento. Per questo motivo nella prima iterazione del ciclo elemento vale “uno”, nella seconda “due” e nella terza “tre”.
Facile e semplice.
In C o C++, per esempio, avremmo fatto l’iterazione sulle posizioni e non sugli elementi:
				int mi_array[] = {1, 2, 3, 4, 5};
				int i;
				for(i = 0; i < 5; i++) {
				    printf("%d\n", mi_array[i]);
				}
Cioè, si avrebbe un ciclo for che aumenta una variabile i ad ogni iterazione, da 0 alla dimensione della sequenza, e utilizza questa variabile come indice per ottenere ciascun elemento e stamparlo.
Come si può vedere l’approccio di Python è più naturale e intuitivo.
Ma cosa succede se si usa il for come se fossimo in C o Java, per esempio, per stampare i numeri da 30 a 50? Non vi preoccupate, perché non avrete bisogno di creare una lista e aggiungere uno a uno i numeri da 30 a 50. Python offre una funzione di range (intervallo) che genera un lista che va dal primo numero indicato, al secondo. Vedremo, nel capitolo successivo, che cosa vuol dire questo termine così ricorrente: le funzioni.


Similari
Overloading di metodi in Java
12% Java
Un metodo overload viene utilizzato per riutilizzare il nome di un metodo ma con argomenti diversi, opzionalmente con un differente tipo di ritorno. [expand title=”Regole per overload” startwrap=”” endwrap=”” excerpt=”⤽” s…
Modi di fare e di non fare in Python
11% Python
Questo documento può essere considerato un compagno del tutorial di Python. Viene illustrato come utilizzare Python, e quasi ancora più importante, come non usare Python. [expand title=”Costrutti del linguaggio che non dov…
redirect 301 usando mod_alias
9% Server
mod_alias è fondamentalmente la versione più semplice di mod_rewrite. Non può fare le cose che fa mod_rewrite, ad esempio modificare la stringa di query. Per eseguire reindirizzamenti nel server web Apache è possibile di u…
Installare Python e Django su Windows
8% Django
Quando ci riferiamo allo sviluppo web con Python, la prima cosa che viene in mente è usare un qualche framework. Il più famoso e utilizzato da tutti è il Django, ma non è l’unico. Ci sono Pylons, Grok, TurboGears e Zope: t…
Metodi magici e costanti predefinite in PHP
8% Php
PHP fornisce un insieme di costanti predefinite e metodi magici per i nostri programmi. A differenza delle normali costanti i quali si impostano con define(), il valore delle costanti predefinite o speciali dipendono da do…