la sintassi in Python

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 e lower_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

Tipi di dati

Filippo