020 Python 3 – Metodi e Funzioni di Python

20 Marzo, 2023 (20:40) | Python | By: sargonsei

020-Python 3 – Metodi e Funzioni di Python

01) Cose da sapere prima di procedere.
Basta fare una ricerca per capire cosa sia una Funzione e cosa sia un Metodo quando si programma in Python, per rendersi conto che la confusione regna sovrana. La confusione nasce dal fatto che parole come FUNZIONE e METODO, nella lingua parlata hanno un significato che non coincide esattamente con quello che hanno nel linguaggio di programmazione Python.
Analizziamo le definizioni più comuni proposte dai vari autori di libri di testo (anche autorevoli) e siti internet.
FUNZIONE (function): sequenza di codice eseguibile che descrive il metodo per svolgere uno o più compiti precisi.
METODO (method): è una funzione inclusa all’interno di una classe e volta ad eseguire un particolare compito elaborazione.
Come dire: la FUNZIONE è quella parte del codice che costituisce un metodo per fare qualcosa, e il METODO è quella parte del codice che, quando eseguita, assolve una funzione.
Scrivendo questi appunti, mi sono riproposto di trattare FUNZIONI e METODI rispondenti alle definizioni seguenti:
Una FUNZIONE (function), per essere una funzione di Python, deve essere una sequenza di codice eseguibile, deve essere scritta dall’utente, deve avere una riga iniziale detta “Intestazione” contenente il nome della funzione, deve poter essere “lanciata” usando il nome della funzione come se fosse un comando.
Un METODO (method), per essere un metodo di Python, deve essere costituito da un blocco di istruzioni messo a disposizione da Python (quindi non è scritto dall’utente), e deve poter essere “lanciato” usando il nome del metodo come se fosse un comando.
In pratica, la FUNZIONE è una parte di codice scritto dall’utente al fine di assolvere una funzione, e il METODO è un metodo messo a disposizione dal linguaggio di programmazione al fine di assolvere una funzione. In ogni caso, il lettore deve tener conto del fatto che, in questi appunti, le parole METODO e FUNZIONE potrebbero essere state invertite.
Per capire cos’è e come si scrive una FUNZIONE, si consulti il contenuto di questi appunti denominato
“011 Python3 – Le funzioni definite dall’utente – http://sargonsei.altervista.org/011-Python3/” .
Da qui in poi, gli appunti di questa pagina web tratteranno l’argomento “METODI di Python” e “FUNZIONI proprie di Python” come se fossero la stessa cosa, e le funzioni come se fossero metodi scritti dall’utente.

02) Importare ed eseguire un METODO contenuto in un MODULO, oppure ogni METODO contenuto in un MODULO.
L’utilizzo di un METODO, deve essere preceduto dall’importazione del MODULO che la contiene. ATTENZIONE!!! La sintassi del comando, cambia a seconda che si decida di importare l’intero MODULO o il solo METODO! Se è stato importato l’intero MODULO, la sintassi del comando è qualcosa tipo MODULO.METODO(PARAMETRO), mentre se è stato importato il solo METODO, la sintassi del comando è qualcosa tipo METODO(PARAMETRO).Quindi, volendo calcolare la radice quadrata di 81, possiamo utilizzare il metodo [sqrt()] contenuto nel modulo [math] ma, per farlo, dobbiamo prima importare il METODO [sqrt()] contenuto nel MODULO [math], oppure ogni singolo METODO contenuto nel MODULO [math]. Per esempio:

>>> sqrt(81) # Tenta di calcolare la radice quadrata di 81
Traceback (most recent call last):
File ““, line 1, in
sqrt(81)
NameError: name ‘sqrt’ is not defined
>>> from math import sqrt # Importa il METODO sqrt dal MODULO math
>>> sqrt(81) # Calcola la radice quadrata di 81
9.0
>>> math.sqrt(81) # Tenta di calcolare la radice quadrata di 81
Traceback (most recent call last):
File ““, line 1, in
math.sqrt(81) # Tenta di calcolare la radice quadrata di 81
NameError: name ‘math’ is not defined
>>> import math # Importa ogni METODO contenuto nel MODULO math
>>> math.sqrt(81) # Calcola la radice quadrata di 81
9.0
>>>

03) Ottenere l’elenco dei METODI contenuti in un MODULO.
Per ottenere un elenco dei METODI contenuti in un dato MODULO, occorre impartire il comando [dir(MODULO)]; segue un esempio per conoscere l’elenco dei METODI contenuti nel MODULO [math]

>>> dir(math) # Mostea l’elenco dei METODI contenuti nel MODULO math
[‘__doc__’, ‘__loader__’, ‘__name__’, ‘__package__’, ‘__spec__’, ‘acos’, ‘acosh’, ‘asin’, ‘asinh’, ‘atan’, ‘atan2’, ‘atanh’, ‘ceil’, ‘comb’, ‘copysign’, ‘cos’, ‘cosh’, ‘degrees’, ‘dist’, ‘e’, ‘erf’, ‘erfc’, ‘exp’, ‘expm1’, ‘fabs’, ‘factorial’, ‘floor’, ‘fmod’, ‘frexp’, ‘fsum’, ‘gamma’, ‘gcd’, ‘hypot’, ‘inf’, ‘isclose’, ‘isfinite’, ‘isinf’, ‘isnan’, ‘isqrt’, ‘lcm’, ‘ldexp’, ‘lgamma’, ‘log’, ‘log10’, ‘log1p’, ‘log2’, ‘modf’, ‘nan’, ‘nextafter’, ‘perm’, ‘pi’, ‘pow’, ‘prod’, ‘radians’, ‘remainder’, ‘sin’, ‘sinh’, ‘sqrt’, ‘tan’, ‘tanh’, ‘tau’, ‘trunc’, ‘ulp’]
>>>

04) Utilizzare FUNZIONI contenute in un MODULI creati dall’utente.
Le istruzioni utilizzate per lanciare un METODO contenuto in un MODULO, possono essere utilizzate anche per lanciare una FUNZIONE creata dall’utente, e salvata in apposito script; in questo caso, il nome dello script che contiene la FUNZIONE, sarà anche il nome del MODULO. Segue un esempio.
Nella cartella di lavoro salviamo sia lo script [giochidiparole.py], avente il contenuto seguente:

# 
from random import shuffle # Importa il metodo [shuffle] contenuto nel modulo [random]

def anagramma(PAROLA):     # Riga di intestazione della funzione chiamata [anagramma]
    PAROLA = list(PAROLA)  # Trasforma la variabile PAROLA in una lista, in cui ogni singola lettera è un elemento della lista
    shuffle(PAROLA)        # Mescola gli elementi della lista PAROLA
    return ''.join(PAROLA) # La funzione termina riunendo gli elementi della lista PAROLA in un'unica stringa alfanumerica che costituisce il ritorno della funzione.

def frasecontrario(FRASE):    # Riga di intestazione della funzione chiamata [frasecontrario]
    PAROLE = FRASE.split(" ") # Trasforma la variabile PAROLE in una lista, in cui ogni singola parola è un elemento della lista
    PAROLE = PAROLE[-1::-1]   # 
    FRASEINVERTITA = ' '.join(PAROLE) # Riunisce gli elementi della lista PAROLE in un'unica variabile alfanumerica FRASEINVERTITA.
    return FRASEINVERTITA     # La funzione termina ritornando il contenuto della variabile alfanumerica FRASEINVERTITA.
# 

sia lo script [lancia_anagramma.py], avente il contenuto seguente:

# 
import giochidiparole                        # Importa il modulo [giochidiparole]
ANAGRAMMARE = input("Digita la parola da anagrammare. ")
ANAGRAMMATO = giochidiparole.anagramma(ANAGRAMMARE) # Lancia la funzione [anagramma] contenuta nel modulo [giochidiparole]
# passando il contenuto della variabile ANAGRAMMARE; il ritorno, è messo nella variabile ANAGRAMMATO
print(ANAGRAMMATO) # stampa il contenuto della variabile ANAGRAMMATO
# 

il quale, una volta lanciato:
A) importa lo script [giochidiparole] come se fosse un modulo;
B) chiede all’utente di digitare una parola da anagrammare;
C) lancia la funzione [anagramma] contenuta nel modulo [giochidiparole] previo passaggio del contenuto della variabile ANAGRAMMARE; il valore di ritorno, verrà posto nella variabile ANAGRAMMATO
D) Stampa il contenuto della variabile ANAGRAMMATO

sia lo script [lancia_frasecontrario.py], avente il contenuto seguente:

# 
from giochidiparole import frasecontrario                    # Importa la FUNZIONE [frasecontrario] contenuta nel MODULO [giochidiparole]
FRASECONTRARIO = input("Digita la frase di cui si desidera invertire l’ordine delle parole. ")
FRASEINVERSA = frasecontrario(FRASECONTRARIO) # Lancia la funzione [frasecontrario] contenuta nel modulo [giochidiparole]
# passando il contenuto della variabile FRASECONTRARIO; il ritorno, è messo nella variabile FRASEINVERSA
print(FRASEINVERSA) # stampa il contenuto della variabile FRASEINVERSA
# 

il quale, una volta lanciato:
A) importa la FUNZIONE [frasecontrario] contenuta nel MODULO [giochidiparole];
B) chiede all’utente di digitare la frase di cui si desidera invertire l’ordine delle parole;
C) lancia la funzione [frasecontrario] contenuta nel modulo [giochidiparole] previo passaggio del contenuto della variabile FRASECONTRARIO; il valore di ritorno, verrà posto nella variabile FRASEINVERSA
D) Stampa il contenuto della variabile FRASEINVERSA

Si noti che, come per i metodi messi a disposizione da Python, è possibile importare sia l’intero MODULO creato dall’utente, sia la singola FUNZIONE creata dall’utente.