giovedì 8 novembre 2012

Mission Python: Le funzioni. Seconda parte

Nell'ultimo post abbiamo visto come utilizzare le funzioni, quelle già disponibili perché fatti da qualcun altro. Oggi vedremo come Farne di nostre.
È necessario saperle fare sia perché potremmo avere esisgenze particolari tutte nostre sia perché quando uno script diventa grosso conviene suddividerlo in blocchi tra loro indipendenti.


Seguendo la tradizione partiremo dai saluti.
Nella sua forma minima potrebbe essere qualcosa come questa (saluti-1.py)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# questa è la definizione 
# della funzione saluti
def saluti():
 ''' funzione saluti, 
 saluta '''
 print 'ciao!\n'

# adesso la chiamata alla funzione
saluti()

Sappiamo già delle prime 2 righe speciali vero? E sappiamo anche che # e tutto quello che lo segue fino alla fine della riga è un commento che serve a noi ma è ignorato dall'interprete Python vero?
OK, siamo così arrivati alla definizione della funzione; inizia con def, seguita dal nome della funzione, una coppia di parentesi (in questo caso vuota, ma ci vogliono anche se vuote) e il segno due-punti (mai dimenticare il due-punti.)
Sarebbe bene che subito dopo la definizione della funzione questa fosse seguita da un commento speciale: una stringa, anche su più righe racchiusa tra 3 apici o virgolette. Utile se la funzione non è banale.
Seguono le istruzioni che costituiscono il corpo della funzione, in questo caso una sola riga. Notare che il corpo è rientrato rispetto alla definizione, come capita sempre tutte le volte che c'è due-punti.

Lo script esce dalla funzione (visto che non c'è più il rientro?) e siamo nel main. Volendo si potrebbe anche indicare ma in questo caso non servirebbe. E qui abbiamo la chiamata alla funzione.
Semplice vero?

Siamo pronti per la seconda versione (saluti-2.py)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def saluti(nome):
 ''' funzione saluti, 
 saluta il nome passato
 in: nome (string)
 out: --'''
 print 'ciao', nome, '!\n'

# adesso le chiamate alla funzione
saluti("Beppe")
saluti("Pippo")
saluti("Pino")
saluti("a tutti")

Quasi OK! Non ci vorrebbe lo spazio prima del punto eclamativo, dai correggiamo (saluti-3.py)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def saluti(nome):
 ''' funzione saluti, 
 saluta il nome passato
 in: nome (string)
 out: --'''
 print 'ciao', nome + '!', '\n'

# adesso le chiamate alla funzione
saluti("Beppe")
saluti("Pippo")
saluti("Pino")
saluti("a tutti")

No, niente screenshot, se non ci credete provate!

Finora le nostre funzioni, cioè le varie versioni di saluti non restituiscono alcun valore. Cosa che farà la prossima (saluti-4.py)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def saluti(nome):
 ''' funzione saluti, 
 saluta il nome passato
 in: nome (string)
 out: risposta (string)'''
 print 'ciao', nome + '!'
 risposta = raw_input('come stai: ')
 return risposta

# adesso la chiamata alla funzione
chi = "Beppe"
res = saluti(chi)
if len(res) > 0:
 print chi, 'sta', res
else:
 print 'nessuna risposta da', chi

La cosa nuova qui è l'istruzione return seguita dalla variabile (o variabili, possono essere più di una come vedremo in seguito).

La chiamata cambia per memorizzare in una variabile il valore della funzione, come abbiamo visto nel post precedente. I più perspicaci (pistini) avranno già visto che c'è un'altra funzione, una built-in, len().

Una cosa ancora: la variabile risposta è definita solo all'interno della funzione, possiamo verificarlo con questo script (errore-1.py)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# ATTENZIONE ERRORE QUI

def saluti(nome):
 ''' funzione saluti, 
 saluta il nome passato
 in: nome (string)
 out: risposta (string)'''
 print 'ciao', nome + '!'
 risposta = raw_input('come stai: ')
 return risposta

# adesso la chiamata alla funzione
chi = "Beppe"
res = saluti(chi)
if len(res) > 0:
 print chi, 'sta', res
else:
 print 'nessuna risposta da', chi

#qui va in errore
print risposta

Diversamente variabile chi  all'interno della funzione saluti() è definita, è una variabile globale perché definita all'esterno di ogni funzione (saluti-5.py)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#uso di variabili globali, sconsigliato

def saluti():
 ''' funzione saluti, 
 saluta il nome passato
 in: nome (string)
 out: risposta (string)'''
 print 'ciao', chi + '!' #chi è globale, 
 # funziona ma è brutto, facile fare errori
 risposta = raw_input('come stai: ')
 return risposta

# adesso la chiamata alla funzione
chi = "Beppe"
res = saluti()
if len(res) > 0:
 print chi, 'sta', res
else:
 print 'nessuna risposta da', chi

Ok, funziona ma con le variabili globali è molto facile fare errori logici. Da evitare, salvo casi particolari.
Dato che tutto continua...Il discorso sulle funzioni mica è finito qui...

Juhan

Vi ricordo che l'indice di "Mission Python" lo trovate qui.

Alla prossima!

2 commenti:

  1. su saluti2 se non metti la variabile di nome da errore, infatti non capito azz :)

    RispondiElimina
    Risposte
    1. ma che poi lo puoi fare una volta e non una ripetizione come hai fatto tu non capisco xD

      Elimina