Organizzazione

Come dare un nome a pezzi di programma, definizione e uso di funzioni.

Un programma è una sequenza di istruzioni ma sono passati i tempi in cui un programma era semplicemente una lista numerata di istruzioni. In un buon programma le istruzioni sono raggruppate in blocchi che hanno un senso preciso, una funzione precisa. questi blocchi si chiamano appunto funzioni (in altri linguaggi si distingue tra funzioni e procedure). Ad ogni funzione possiamo dare un suo nome e ogni volta che definiamo una nuova funzione il linguaggio si amplia di un nuovo comando. Ad es. se definisco una funzione che si chiama “saluta”, il linguaggio saprà eseguire il comando “saluta”. Una funzione è costituita dalla parola riservata “def” seguita dal nome della funzione, da una coppia di parentesi tonde, dal carattere”:” e da un blocco di istruzioni:

def <nome>():
    <istruzioni>

<nome> è una qualunque parola, ma dobbiamo scegliere una parola che descriva meglio possibile il significato della funzione stessa: il linguaggio di programmazione serve innanzitutto a rendere comprensibile un programma agli umani! <istruzioni> è una qualsiasi sequenza di istruzioni che può essere costituita a da istruzioni già presenti nel linguaggio o definite da noi come nuove funzioni.

Un programma generalmente non è altro che un insieme di funzioni. Per allenarci scriviamo le procedure che calcolino i primi termini di alcune successioni.

  1. Iniziamo creando un nuovo programma: da IDLE, Menu: File - New Window.
  2. Poi salviamo il file con il nome successioni.py, Menu: File - Save as.
  3. Ora scriviamo le prime righe del programma: i commenti che contengono: data, titolo, autori.

Iniziamo con la successione dei primi 10 numeri triangolari. Questa successione si ottiene partendo da 0 e aggiungendo il successivo numero naturale all’ultimo numero triangolare:

0+0, 0+1, 1+2, 3+3, 6+4, ...

Serve quindi una variabile che contenga il numero triangolare (all’inizio 0) e un ciclo che percorra i primi numeri naturali (ciclo for). All’interno del ciclo aggiungo al numero triangolare attuale l’attuale numero naturale e stampo il nuovo valore:

def triangolari10():
    triangolare=0
    for num in range(10):
        triangolare+=num
        print "%5s" % triangolare

Ora proviamo a eseguire il programma: <F5>... Non succede niente! In realtà Pyhon ha lavorato, ma il risultato di questo lavoro non ci appare. Python ha imparato cosa deve fare quando noi gli diciamo di eseguire triangolari10. Per provarlo ci spostiamo nell’ambiente IDLE e diamo il comando:

>>> triangolari10()

Se non ci vengono segnalati errori, vengono stampati i primi 10 numeri triangolari. Ma se non ci andassero bene i primi 10 numeri della successione, ne volessimo 15 o 20 o 100? Possiamo scrivere un’altra procedura, simile a questa che ci chieda quanti numeri vogliamo stampare. L’istruzione che permette di leggere da tastiera una stringa di caratteri è raw_input([<messaggio>]).

Possiamo anche iniziare la funzione con un’istruzione che stampi un’intestazione:

def triangolari():
    print "Successione dei numeri triangolari"
    print
    n=raw_input("Quanti termini della successione? ")
    triangolare=0
    for num in range(n):
        triangolare+=num
        print "%5s" % triangolare

Solito <F5> e poi nella shell di IDLE. diamo il comando triangolari(), rispondiamo alla richiesta con un numero, ... e leggiamo il messaggio di errore:

Traceback (most recent call last):
  File "<pyshell#4>", line 1, in -toplevel-
    triangolari()
  File "/.../python/successioni.py", line 16, in triangolari
    for num in range(n):
TypeError: an integer is required

Ma noi avevamo scritto un numero come mai range dice che in n non c’è un numero? La funzione raw_input() restituisce una stringa, dobbiamo convertirla in numero. Quindi ritorniamo nel programma e modifichiamo la terza riga della funzione in modo che esegua la conversione e inserisca in n, non il risultato di raw_input ma la conversione in intero del risultato di raw_input:

n <-- int <-- raw_input

In Python:

n=int(raw_input("Quanti termini della successione? "))

Con questa modifica, se non ci sono altri errori, la funzione produce la successione desiderata.

Riassumendo

  • In un programma, le istruzione vanno raggruppate in funzioni (o procedure).

  • La sintassi per scrivere una funzione è:

    def <nome>():
        <istruzioni>
    
  • Bisogna distinguere bene la definizione di una funzione dall’esecuzione della funzione stessa. Quando si definisce (def ...) la funzione, Python associa un blocco di codice a un nome. Quando si esegue una funzione, si scrive il suo nome seguito da una coppia di parentesi e Python esegue il codice associato a quel nome.

  • Il meccanismo delle funzioni permette di creare delle nuove funzionalità del linguaggio permettendo di collegare un blocco di codice a una parola.

Prova tu

  1. Scrivi le funzioni che stampano i primi 10 numeri pari e i primi 10 numeri dispari.
  2. Scrivi le funzioni, derivate dalle precedenti, ma che chiedono quanti numeri stampare.
  3. Scrivi le funzioni che stampano i numeri quadrati e i numeri esagonali.