Liste e Funzioni in Python

Un ultimo argomento che ci rimane da affrontare per completare lo studio delle liste in linguaggio Python è quello della relazione tra liste e funzioni. In particolare, vedremo come passare una lista come parametro di una funzione e come le funzioni possono modificare una lista passata come parametro.

Inoltre vedremo alcune funzioni built-in per le liste che ci permettono di risolvere alcuni problemi comuni, come la somma di tutti gli elementi di una lista numerica e la ricerca del valore minimo e massimo di una lista.

Passaggio di una lista come parametro

In questa lezione introdurremo alcuni concetti riguardanti le funzioni che poi approfondiremo in lezioni successive. In particolare, vedremo come passare una lista come parametro di una funzione.

Una lista in Python non è un tipo di dato primitivo come ad esempio un intero e soprattutto si tratta di un tipo mutabile, ossia modificabile. Questo significa che una lista può essere modificata durante l'esecuzione del programma.

Ora, quando dichiariamo una variabile di tipo lista in questo modo:

x = [1, 2, 3]

Python alloca un certo spazio di memoria per la lista e memorizza in esso i valori che compongono la lista. La variabile x, in realtà, non contiene i valori della lista, ma un riferimento alla lista stessa.

Questo è un dettaglio fondamentale, infatti se proviamo ad eseguire un'assegnazione come questa:

y = x

Si potrebbe pensare che Python crei una copia della lista e la assegna alla variabile y. In realtà, Python non crea una copia, ma semplicemente crea un nuovo riferimento alla lista. Questo significa che se modifichiamo la lista x anche la lista y verrà modificata.

y[2] = 10
print(x)
print(y)

Il risultato sarà:

[1, 2, 10]
[1, 2, 10]

Questo comportamento è molto importante. Infatti, se creiamo una funzione e passiamo una lista come parametro, non stiamo passando una copia ma un riferimento alla lista stessa. In altre parole, una lista viene passata per riferimento. La conseguenza è che una funzione può modificare una lista passata come parametro.

Prendiamo un esempio:

def aggiungi_elemento(lista, elemento):
    lista.append(elemento)

x = [1, 2, 3]
aggiungi_elemento(x, 4)
print(x)

Il risultato sarà:

[1, 2, 3, 4]

Come possiamo vedere, la funzione aggiungi_elemento ha modificato la lista x passata come parametro.

Nelle prossime lezioni vedremo come modificare questo comportamento. Per il momento bisogna tenere a mente che:

Definizione

Una lista viene passata per riferimento ad una funzione

Se una lista viene passata come parametro ad una funzione, essa verrà sempre passata per riferimento. Pertanto la funzione può accedere e modificare la funzione al proprio interno.

Funzioni built-in per le liste

Nel linguaggio Python esistono delle funzioni built-in per le liste. In realtà tali funzioni lavorano su qualsiasi iterabile, ma per il momento ci concentriamo sul caso delle liste.

La prima funzione che vedremo è sum. Questa funzione restituisce la somma di tutti gli elementi di una lista purché quest'ultima contenga valori numerici. Ad esempio:

x = [1, 2, 3, 4, 5]
print(sum(x))

Il risultato sarà:

15

La funzione sum accetta anche un parametro opzionale start che indica il valore iniziale della somma. Ad esempio:

x = [1, 2, 3, 4, 5]
print(sum(x, start=10))

Il risultato sarà:

25
Definizione

Funzione sum per le liste

La funzione sum restituisce la somma di tutti gli elementi di una lista che contiene valori numerici. La funzione accetta un parametro opzionale start che indica il valore iniziale della somma.

La sintassi è la seguente:

sum(iterabile, start=0)

Altre due funzioni built-in per le liste sono min e max. Queste funzioni restituiscono rispettivamente il valore minimo e il valore massimo di una lista. Ad esempio:

x = [1, 2, 3, 4, 5]
print(min(x))
print(max(x))

Il risultato sarà:

1
5

Queste due funzioni possono essere applicate solo su liste che contengono elementi per cui siano definiti gli operatori di confronto < e >. Ad esempio possiamo applicarle su liste che contengono stringhe:

x = ["pippo", "pluto", "paperino"]

print(min(x))
print(max(x))

Il risultato sarà:

paperino
pluto

Ovviamente, non possono essere applicate su liste che contengono elementi di tipo diverso:

x = [1, 2, 3, "pippo"]
print(min(x))

In tal caso verrà sollevata un'eccezione:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'str' and 'int'
Definizione

Funzioni min e max per le liste

Le funzioni min e max restituiscono rispettivamente il valore minimo e il valore massimo di una lista. Queste funzioni possono essere applicate solo su liste che contengono elementi per cui siano definiti gli operatori di confronto < e >. La sintassi è la seguente:

min(iterabile)
max(iterabile)

Esempi

Avendo visto qual è il comportamento del passaggio di una lista come parametro di una funzione, vediamo alcuni esempi.

Media di una lista di numeri

Supponiamo di voler realizzare una funzione che calcoli la media di una lista di numeri in virgola mobile. La funzione avrà come parametro una lista di numeri e restituirà la media.

def media(lista):
    somma = 0.0
    for elemento in lista:
        somma += elemento
    return somma / len(lista)

Possiamo testare la funzione con una lista di numeri:

x = [3.2, 4.5, 6.7, 8.9]

print(media(x))

Il risultato sarà:

5.825

Deviazione standard di una lista di numeri

Supponiamo di voler realizzare una funzione che calcoli la deviazione standard di una lista di numeri in virgola mobile. La funzione avrà come parametro una lista di numeri e restituirà la deviazione standard.

def deviazione_standard(lista):
    m = media(lista)
    somma = 0.0
    for elemento in lista:
        somma += (elemento - m) ** 2
    return (somma / len(lista)) ** 0.5

Possiamo testare la funzione con una lista di numeri:

x = [3.2, 4.5, 6.7, 8.9]

print(deviazione_standard(x))

Il risultato sarà:

2.1718367802392518

In Sintesi

In questa lezione abbiamo analizzato la relazione tra liste e funzioni in linguaggio Python.

Abbiamo visto che una lista passata come parametro ad una funzione viene sempre passata per riferimento. Pertanto la funzione può accedere e modificare la lista al proprio interno.

Abbiamo visto anche che esistono delle funzioni built-in per le liste che possono essere utili per risolvere alcuni problemi: sum, min, max.

Infine abbiamo visto alcuni esempi di funzioni che utilizzano liste come parametri.

Nella prossima lezione combineremo liste e funzioni per implementare delle interessanti applicazioni delle liste in linguaggio Python.