Image default
Corsi Programmazione Python

Moduli e Funzioni – Corso Python per principianti – Lezione 9

Abbiamo sin qui affrontato i mattoni elementari portanti della programmazione Python, tuttavia usando ancora quello che era l’interprete. Da qui in poi analizzeremo il codice non più dall’interprete interattivo del nostro IDLE, ma analizzeremo e scriveremo del codice sui file .py, ovvero file Python sotto forma di moduli.

Un modulo sostanzialmente ci permette di scrivere codice in maniera più sicura e controllata, in modo tale da non perdere eventuali variabili già istanziate, anche se modificate, ed inoltre permette la scrittura delle funzioni.

Cos’è una funzione?

Una funzione è un blocco di codice orientato a sviluppare un risultato a partire da un certo ingresso (input), ovvero i parametri che si passano alla funzione stessa.

Ti sembra troppo complesso? Stai tranquillo/a, continua la lettura… non saltare assolutamente nulla! Presto capirai questo importante concetto che nel mondo della programmazione è molto usato, quindi devi conoscerlo assolutamente.

Analizziamo adesso la struttura di una funzione e studiamo alcune istruzioni necessarie.

La sintassi di una funzione

Ogni nuova definizione di una particolare funzione, prevede l’uso di una particolare sintassi, molto rigida ma semplice da ricordare:

def <nome della funzione> (parametri di ingresso):

<istruzione 1>

<istruzione 2>

<istruzione n di ritorno (return)>

Prima di parlare dell’istruzione return e dei parametri di ingresso, che avrai notato nella struttura della funzione, parliamo di un concetto molto importante quando si programma in Python, ovvero l’indentazione. Questa regola sintattica, molto ma molto rigida, è utilizzata sia per le funzione e sia, per eventuali istruzioni condizionali, che per cicli iterativi che vedremo nelle prossime lezioni.

Indentare significa sostanzialmente lasciare uno spazio, preferibilmente ampio e ben definito, prima di ogni istruzione all’interno della nostra funzione, delle istruzioni condizionali e cicli iterativi.

Come ampiezza della nostra indentazione, possiamo lasciare:

  • un singolo spazio (sconsigliato)
  • due o più spazi (meno sconsigliato)
  • una tabulazione <tasto tab> (consigliato)

Ma stai tranquillo/a, se usi l’IDLE di Python ti basterà fare invio a fine riga ed in automatico viene gestita l’indentazione, ovvero  il cursore si sposta già nella posizione corretta.

La struttura di una qualsiasi funzione è composta quindi da clausole particolari (def e return) e dai parametri di ingresso.

La clausola def (define), che dall’inglese vuol dire definire, è molto importante per realizzare e far capire a Python che da quel punto in poi, fino alla clausola return (ritorno) il blocco di codice contenuto fa parte della funzione.

Come sfruttiamo le funzioni per ritornare un qualcosa?

La clausola return ci permette di realizzare tutto ciò, seguendo dei semplici passaggi. La quantità di dati che possono essere ritornati sono “infiniti”, l’unica accortezza sta nel ritornare i dati nel modo più opportuno.

Infatti puoi usare la clausola di return in diversi modi:

  • return: senza nessun parametro per bloccare l’esecuzione del programma e ritornare un Null.
  • return variabile: ritorna una variabile semplice come singolo dato (variabile booleana, intera etc…).
  • return (variabile1, variabile2): con o senza parentesi, ritorna una tupla che contiene le due variabili.
  • return [variabile1, variabile2]: ritorna una lista che contiene le due variabili.

Sui parametri di ingresso, invece, c’è da dire che sono un insieme di dati (separati da virgola l’uno dall’altro), di qualsiasi tipo, utilizzabili dalla funzione e passate dal codice principale del modulo, o da un eventuale chiamata da parte di un’ulteriore funzione.

Facciamo un piccolo esempio attraverso l’uso di una funzione, sfruttando il ritorno come lista:

def sommaeprodotto (numero1, numero2):

somma = numero1 + numero2

prodotto = numero1 * numero2

return [somma, prodotto]

lista = sommaeprodotto(2, 3)
print(lista)   # print(dato) ti permette di stampare su console, ricordi?

L’output sarà la seguente lista: [5, 6].

Hai capito perchè? Ragiona su questo blocco di codice ed arriva alla soluzione.

Per quanto riguarda il passaggio dei dati però è importante chiarire per bene la questione in quanto alcuni di essi (dati) funzionano solamente all’interno del blocco funzione (variabili locali), anche se alcuni dati, per effetto della loro struttura (imparerai a capirlo col tempo), sono comunque visibili nel modulo se modificati nella funzione, mentre altri sono visibili nel modulo principale (variabili globali).

Il motivo per il quale alcune variabili locali, una volta modificate, sono visibili comunque all’esterno della funzione dipende dalla tipologia di passaggio dei dati come parametri di ingresso alla funzione.

Esistono due tipologie di passaggio di parametri all’interno dell’odierna programmazione:

  • Passaggio per valore: tipologia di trasferimento del dato come intera copia del dato stesso. Viene quindi creata una copia in modo tale che la variabile in questione sia solamente visibile all’interno della funzione.
  • Passaggio per riferimento: tipologia di trasferimento del dato non come copia di se stesso, ma come copia del puntatore del dato, quindi rendendo modifiche visibili all’esterno della funzione.

Il puntatore è sostanzialmente un dato che contiene l’indirizzo di memoria dove realmente si trova l’elemento richiesto. Esso è utilizzato quando la grandezza del dato è molto grande, e quindi non può essere visto come singola variabile.

Le stringhe, le liste, le tuple, come anche gli oggetti in generale, sono strutture che occupano molto spazio in memoria, quindi quando si dichiara e si istanzia una variabile di questo tipo, viene caricato nella variabile il puntatore, che punterà alla cella di memoria dove è posizionato realmente il dato. Tutti gli altri tipi di dati, come gli interi, i booleani, ecc…, non sfruttano invece il puntatore ma la grandezza della variabile stessa.

Vediamo nel particolare che attraverso una funzione che utilizza le liste come parametro di ingresso non c’è bisogno di ritornare la lista come parametro di ritorno, perché opereremo direttamente con l’uso del puntatore:

def quadrato(listadinumeri):

# Supponiamo che la lista contenga due numeri

 

lista[0] = lista[0] * lista[0]

lista[1] = lista[1] * lista[1]

lista = [2, 3]
quadrato(lista)
print(lista)

L’output della funzione sarà [4, 9].

Hai visto l’output? Anche se non si ritorna la lista, essa viene comunque modificata.

Moduli

I moduli ti permettono di definire varie funzioni in file differenti, dando a ciascun modulo la possibilità di includere ed usare funzioni definite su moduli differenti. La definizione di una funzione su un modulo, piuttosto che nel complesso di un tuo progetto, ti permette di includere questa funzione all’interno di più moduli.

Supponiamo di voler creare due diversi progetti, su due moduli differenti, che hanno bisogno di usare la stessa funzione. Se usiamo un modulo possiamo creare una funzione che può essere utilizzata, da entrambi i tuoi progetti, senza andare a ricopiare nei due file dei progetti il medesimo codice.

Come usiamo un modulo e le sue funzioni?

Supponi di avere un file nominato fileconfunzioni.py contenente diverse funzioni da te scritte.
Se vuoi usare una di queste funzioni, posiziona il file “fileconfunzioni.py” nella cartella del tuo nuovo modulo (N.B. se non sono nella stessa cartella il tuo programma non funzionerà) , e all’interno del tuo modulo, all’inizio del file, scrivi la seguente riga di codice:

import fileconfunzioni
#NB. puoi anche scrivere:
from fileconfunzioni import * #L’asterisco (*) ti permette di importare TUTTE le funzioni.
#Volendo puoi decidere di importarne anche solo una digitando il nome al posto dell’asterisco.

Adesso hai a disposizione tutto il set di funzioni che hai già creato e puoi quindi usarle sin da subito. Facciamo un esempio più concreto ed usiamo due moduli seperati: modulo principale (main.py) e modulo con una funzione (funzione.py).

Il progetto in questione prevede una funzione che riceve un numero e somma a questo numero i suoi due numeri successivi. Supponiamo di avere come nostro numero il 6, avremo come risultato:

6 + 7 + 8 = 21

Inseriamo i due file in una cartella e iniziamo a scrivere la nostra funzione posta sul file funzione.py:

def sommaDueSuccessivi(numero):

risultato = (numero * 3) + 3

return risultato

Analizziamo adesso il file main.py:

import funzione

numero = 4
ris = funzione.sommaduesuccessivi(numero)
print(ris)   #Avrai come risultato 4+4+4+3 = 4+5+6 = 15

Hai capito l’esempio? Bene, adesso continuiamo…

Sai che Python mette a disposizione già diverse funzioni all’interno di alcuni suoi moduli?

Python ha dei suoi moduli già pronti. A noi ci basterà conoscere le funzioni di cui abbiamo bisogno e le possiamo utilizzare ad ogni evenienza (ricordandoci sempre di importare il modulo).

Uno dei moduli più importanti su Python è senza dubbio math che mette a disposizione varie funzioni per svolgere operazioni matematiche.

abs(x) #Restituisce il valore assoluto di x.
sin(x) #Restituisce il seno di x.
cos(x) #Restituisce il coseno di x.
sqrt(x) #Restituisce la radice quadrata di x.
#ecc…

Le restanti funzioni del modulo math le puoi trovare sulla documentazione ufficiale.

Esistono anche altri moduli standard di Python, ma è inutile che te li elenco tutti, diventerebbe solo noioso.

In base ai programmi che dovrai fare con Python ti basterà cercare trai moduli di Python e vedere quale potrebbe tornarti più utile per la buona riuscita del tuo algoritmo.

C’è qualcosa che non è molto chiara? Lascia un commento, sono a tua completa disposizione.

Sei soddisfatto/a di questa lezione ed hai imparato nuove cose? Ringraziaci con un +1,  per te è solo un click, per noi è molto importante, grazie ancora. 🙂

Lezione 8: Tuple<—> Lezione 10: Algebra di Boole e Operatori Logici

Prima di andar via, se ti siamo stati d'aiuto, che ne dici di lasciarci un like su Facebook? Per noi è importante 🙂

Related posts

Grafica Python: usa la libreria Turtle

Andrea Chiera

Stringhe – Corso Python per principianti – Lezione 7

Andrea Chiera

Linguaggi a basso livello: l’alfabeto dei computer

Andrea Chiera