la sintassi in Python
La sintassi in Python
In questo articolo andiamo a vedere le forme di interazione, i controlli di flusso e come scrivere un programma. Entriamo, quindi nella sintassi di Python iniziando dalla sua caratteristica (che personalmente fa impazzire per la sua semplicità): l’indentazione.
L’indentazione
Molti linguaggi possono essere scritto in differenti stili, molti sono leggibili, altri un po’ meno. Scrivere codice facile da leggere è, comunque, sempre una buona idea. In Python questo è la base della programmazione. La leggibilità prima di tutto.
Non ci sono parentesi graffe o parole chiavi che aprono e chiudono un blocco di codice. Tutto quello che devi fare è indentare il codice quando inizi un blocco e tornare all’indentazione precedente quando lo chiudi.
Vediamo questo già dal prossimo paragrafo.
A fine paragrafo le raccomandazioni su come scrivere un buon codice in Python
if
Forse l’istruzione più comune tra tutti i linguaggi di programmazione.
Vediamo un esempio:
x = int(input("Per favore inserisci un numero intero: "))
if x > 0:
x = 0
print('Negativo cambiato in zero')
elif x = 0:
print('Zero')
elif x == 1:
print('Singolo')
else:
print('Più di uno')
print('Finito')
La funzione input aspetta una interazione da parte dell’utente che verrà convertito in intero (avremmo un errore se inseriamo delle lettere).
Iniziamo a valutare la sintassi molto semplice dell’istruzione if. Non ci sono parentesi, ma un carattere “:” che indica la fine del test. Quindi se la condizione “x > 0” è vera entra nel blocco. elif corrisponde a oppure se quindi verrà presa in considerazione se le condizioni precedenti sono false, l’ultimo else: è altrimenti fai altro. Giusto come ultima spiaggia.
Gli elif e else sono facoltativi.
Questa costruzione equivale alla costruzione switch o case conosciuta in altri linguaggi.
I test utilizzano una convenzione oramai consolidata nella stragrande maggioranza dei linguaggi:
== per il test di uguaglianza
>, >=, <, <= per i test comparativi
!=, <> per i test di disuguaglianza
Come negli altri programmi è possibile eseguire condizioni più complessi utilizzando gli operatori logici and, or e not.
and risulta vera se entrambe le condizioni sono vere.
or risulta vera se almeno una delle due condizioni è vera.
not nega il valore, quindi Vero diventa Falso e viceversa.
for
L’istruzione for differisce un po’ da come possiamo utilizzarlo in altri linguaggi.
Infatti for prende in considerazione gli oggetti di una sequenza (una lista o una stringa) nell’ordine in cui essi sono nella sequenza. Vediamo con un esempio:
words = ['cat', 'window', 'defenestrate']
for w in words:
print(w, len(w))
Questo darà come risultato
cat 3
window 6
defenestrate 12
Se abbiamo bisogno di modificare le sequenza che stiamo iterando (prendendo in considerazione) nel loop, è raccomandato fare una copia.
La slice notation (fetta dell’oggetto) rende questo molto conveniente:
for w in words[:] # gira su una copia della lista intera
if len(w) > 6:
words.insert(0,w)
Praticamente inserisce come primo valore l’oggetto più lungo di 6 caratteri. Avremo:
['defenestrate', 'cat', 'window', 'defenestrate']
Se avessimo lavorato su for w in words:
saremmo entrati in un loop che avrebbe inserito “defenestrate” all’infinito
range
Se, invece, abbiamo bisogno di iterare una sequenza di numero, la funzione range() viene in mostro aiuto.
a = ['Mary', 'had', 'a', 'little', 'lamb']
for i in range(len(a)):
print(i, a[i])
Questo darà:
0 Mary
1 had
2 a
3 little
4 lamb
Ecco alcuni esempi su come lavora range():
range(5, 10)
5, 6, 7, 8, 9
range(0, 10, 3)
0, 3, 6, 9
range(-10, -100, -30)
-10, -40, -70
Un altro modo per contare gli elementi di una sequenza mentre la esaminiamo è utilizzare la funzione enumerate:
cose = ['spam', 'egg', 'python']
for cont, val in enumerate(cose):
print(cont, val)
nello stesso modo possiamo iterare i dizionari, o lavorare su più liste distinte usando la funzione zip.
while
L’istruzione while è simile a for, differisce solo di un particolare: l’iterazione continua finché la condizione è vera.
x = 1
while x < 5:
print(x)
x += 1
Stamperà
1
2
3
4
5
break, continue e else
Può capitare di dover interrompere o passare all’iterazione successiva in un ciclo for o while.
Le istruzioni break e continue fanno questo mentre l’istruzione else ha molto in comune con la clausola else della gestione delle eccezioni (vedremo in un articolo separato) piuttosto che con le istruzioni if.
Da sapere che questa clausola else viene eseguita quando nessun break è stato invocato.
for n in range(2, 10):
for fatt in range(2, n):
if n % fatt == 0:
print(n, 'equals', x, '*', n//fatt)
break
else:
# gira se non viene trovato un numero fattoriale
print(n, 'is a prime number')
Che darà come risultato:
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3
for n in range(2, 10):
for fatt in range(2, n):
if n % fatt == 0:
print(n, 'equals', x, '*', n//fatt)
break
else:
# gira se non viene trovato un numero fattoriale
print(n, 'is a prime number')
Che darà come risultato:
x = 1
for x in range(5):
if x == 3:
print("Abbiamo saltato il 3")
continue
print(x)
1
2
Abbiamo saltato il 3
4
pass
L’istruzione pass non fa assolutamente niente!
Può essere usata sintatticamente in fase di creazione del programma per definire una classe, una funzione o un controllo non ancora scritto, perché l’interprete segnalerebbe un errore o una interruzione da parte dell’utente.
class ClasseVuota:
pass
if x < 0:
# TODO: da completare in seguito:
# verificare perché la variabile è negativa!
pass
while True:
pass # Occupato, aspetto un Ctrl+C da tastiera
Raccomandazioni
Queste le raccomandazioni tratte dalla documentazione ufficiale Intermezzo: coding Style per rendere ancora più comprensibile Python a ogni sviluppatore che leggerà il tuo codice:
- Usa 4 spazi anziché la funzione tab.
- Non creare linee di codice che eccedano i 79 caratteri
- Inserisci linee vuote per separare funzioni e classi, e blocchi di codice più grandi dentro le funzioni.
- Quando possibile inserisci commenti su una riga a parte.
- Usa docstrings.
- Usa spazi intorno agli operatori e dopo le virgole ma non dentro le parentesi:
a = f(1, 2) + g(3, 4)
. - Chiama le tue classi e funzioni in modo consistente: la convenzione è usare
CamelCase
per le classi elower_case_with_underscores
per funzioni e metodi. - Usa un encoding appropriato all’utilizzo e allo scopo. UTF-8 è l’encoding di default utilizzato da Python.
- Allo stesso modo, non usare caratteri non-ASCII se c’è solo la minima possibilità che persone straniere leggano o mantengano il codice.
Funzioni e Classi … coming soon