Programmazione nella Scuola Primaria – 7

1

Oggi una cosa nuova: le funzioni.
Finora abbiamo visto programmi (di solito li chiamiamo script) piccoli, composti da poche righe ma in pratica questo capita raramente. Però senti che idea (vecchia come il cucco): suddividiamo lo script in parti logiche, esattamente come un libro è suddiviso in capitoli e il capitolo in paragrafi.
Ecco i componenti risultanti dalla suddivisione li chiamiamo funzioni. Vediamo subito un esempio:

# f0.py primo esempio di funzioni
# -*- coding: utf-8 -*-

# definisco la funzione pari
def pari(n):
	resto = n % 2
	if resto == 0:
		r = True
	else:
		r = False
	return r

# main, Python parte da qui

prompt = '\ndammi un numero intero, 10 per finire: '
n = input(prompt)
while n > 0:
	if pari(n):
		print n, 'è pari'
	else:
		print n, 'è dispari'
	n = input(prompt)

print 'ciao!'

Uh! quanta roba! Facciamo così: lo proviamo subito per vedere cosa succede e poi lo dissezioniamo.
Al solito salviamo il file scritto con Blocco note nella cartella prove del disco C: chiamandolo f0.py (controllare che Windows non bari) e lo lanciamo dal Prompt dei comandi con c:\python27\python f0.py; otteniamo qualcosa così:

f0

OK! vediamo perché.
Intanto una cosa strana nei commenti. Sappiamo già che son quelli che cominciano con il carattere # e vanno fino alla fine della riga. Ma a riga 2 c’è un commento mooolto particolare: un metacomando. Deve essere scritto esattamente così e essere nelle righe 1 o 2. La sua funzione è di dire a Python che vogliamo usare le lettere accentate, come definite nello standard UTF-8.

Saltiamo a riga 13, è qui che Python considera l’inizio del programma; in gergo viene detto il main (così i ‘mericani dicono per “principale”).
Riga 15 definisce solo una stringa che useremo più avanti, niente di nuovo.
Invece la riga 16 è nuova di pakka: assegna alla variabile n il valore ritornato dalla funzione input().
input() è una funzione predefinita, immediatamente disponibile, in gergo built-in. Opera in questo modo: scrive la stringa di prompt sul terminale e aspetta una risposta, seguita da Invio. A questo punto la funzione ha il valore di quello che abbiamo scritto e nel nostro caso viene assegnata alla variabile n.
Segue quindi un ciclo potenzialmente infinito alle righe 17-22. Il ciclo è semplice: se n è pari scrive che è pari, se è dispari scrive che è dispari (“d’ho!“, direbbe Homer Simpson), finché diamo 0 (o un numero negativo, non c’è gestione degli errori perché lo script risulterebbe inutilmente lungo).

Ma un momento: cos’è la funzione pari()? L’abbiamo definita noi, righe 5-11.
La definizione comincia con la parola riservata def (scrivere define –definisci– era troppo lungo) seguita dal nome che vogliamo dargli, una coppia di parentesi e il solito due-punti. Le parentesi sono obbligatorie, anche se dovessero essere vuote. Nel nostro caso invece gli passiamo il valore della variabile n. Non è qui il momento di approfondire ma c’è differenza tra la variabile n (è una posizione nella memoria) e il suo valore (in questo caso un numero intero positivo); peraltro questa differenza è la cosa più importante della programmazione “da grandi“.
La funzione è un sottoprogramma che fa cose normali, come farebbe qualsiasi programma. Nel nostro caso calcola il resto di n diviso 2 e assegna alla variabile r il valore booleano (logico) vero o falso a seconda che sia 0 o 1.
Nella riga 17 c’è l’istruzione di return: dice che la funzione pari() sarà il valore della variabile r.

Abbiamo così visto due tipi di funzioni: predefinite e fatte da noi.
Avevo anche pensato di dirvi che un Vero Programmatore™ la funzione pari() la scriverebbe in modo completamente diverso, molto più corta, magari usando lambda (fa geek) ma la trovate da altre parti. E sarebbe una complicazione inutile. Non ditemelo nei commenti, nèh! Ma se volete provate a farla.
E la funzione dispari() come la fareste? avendo la pari() basterebbe scrivere:

def dispari(n):
	return not pari(n)

e funziona. Una volta sarebbe stato vietato dal tuo capo perché la chiamata a pari() ha un costo (cioè impiega tempo) e ti avrebbe obbligato a rifarla come la pari() (basta cambiare l’if). Adesso, secondo me, sarebbe OK.

Chiaro? Domande? Continuo? Ci sarebbe da vedere dove si mettono le funzioni, quando ne abbiamo tante e vogliamo utilizzarle in programmi diversi. Prossimamente, forse 😉

Annunci
Post a comment or leave a trackback: Trackback URL.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: