Estratto del documento

Fondamenti di informatica (2° parte)

Funzioni

Un modo per affrontare un problema difficile è quello di scomporlo in sottoproblemi e risolvere ciascuno di essi separatamente (divide et impera). Così nei programmi, visti come soluzioni a problemi complessi, è spesso utile avere sottoprogrammi che risolvono sottoproblemi. I sottoproblemi possono essere a loro volta scomposti in altri più semplici in un procedimento di semplificazione che può essere reiterato più volte. Questa strategia permette di:

  • Non perdere di vista la strategia globale
  • Concentrarsi su un sottoproblema indipendentemente dagli altri

In Python i sottoprogrammi corrispondono alle funzioni e sono sequenze di istruzioni dotate di un nome. Per invocazione di una funzione si intende il suo richiamo (tramite il nome) a cui corrisponde l’esecuzione delle istruzioni della funzione stessa. Alcune di queste funzioni fanno parte del linguaggio, altre possono essere utilizzate solo dopo aver dichiarato l’uso delle rispettive librerie. In Python si definisce una funzione utilizzando la parola chiave def e specificando il corpo, cioè le istruzioni che la compongono.

ES. def righe(): # intestazione

print("-" * 20) # inizio del corpo della funzione

print("-" * 20)

Molte funzioni operano in modo parametrico, cioè sulla base di valori che vengono forniti in ingresso alla funzione. Questi valori vengono detti argomenti della funzione. Gli argomenti, cioè i valori forniti alla funzione nel momento dell’invocazione, vengono anche detti parametri attuali. Per memorizzare i valori degli argomenti prima dell'esecuzione delle istruzioni di una funzione si utilizzano delle variabili dette parametri della funzione (o parametri formali o anche variabili parametro). Queste variabili sono utilizzate dalle istruzioni nel corpo delle funzioni.

ES. def righe(car): # car è la variabile parametro

print(car * 20) # stampa car 20 volte

print(car * 20) # idem

#programma

righe("#") # stampa due righe con "#"

print("ciao") # stampa ciao

righe("+") # stampa due righe con "+"

È possibile definire dei parametri formali con valori predefiniti. In questo caso l’argomento è facoltativo e se non viene specificato assume il valore predefinito. I sottoprogrammi, oltre che per compiere delle azioni, sono spesso utilizzati per calcolare dei valori. Una funzione può terminare restituendo un valore. A questo scopo in Python si usa l’enunciato return. L’enunciato return può essere utilizzato solo all’interno del corpo di una funzione e ha l’effetto di bloccare immediatamente l’esecuzione della funzione e di restituire il valore dell’espressione che segue. In Python è possibile restituire più di un valore in uscita utilizzando le tuple.

In alcuni linguaggi di programmazione (es. il Pascal), si fa differenza fra sottoprogrammi che ritornano un valore e quelli che non ritornano nessun valore. Questi ultimi vengono chiamati procedure mentre i primi funzioni. In Python, tutti i sottoprogrammi sono funzioni. Infatti, anche quando un sottoprogramma non termina con l’enunciato return, comunque viene restituito un valore. Questo valore è None, che vuol dire "niente", "nessun valore". None può anche essere assegnato ad una variabile per dire che questa, al momento, non si riferisce a nulla: è il valore per un riferimento nullo.

Le variabili definite all’interno di una funzione si chiamano variabili locali. Quando una variabile è definita all’interno di un corpo di una funzione rimane visibile solo fino alla fine della funzione. La visibilità di una variabile locale non si estende al di fuori della funzione. Le variabili parametro (cioè i parametri formali) sono variabili locali della funzione.

Le variabili definite al di fuori di una funzione si chiamano variabili globali. Queste sono visibili a tutte le funzioni definite successivamente. Ma se all’interno di una funzione si tenta di assegnare un valore ad una variabile globale, in realtà si crea una nuova variabile locale con lo stesso nome della globale. Come si può modificare il valore di una variabile globale? In Python si deve dichiararlo con l’enunciato global.

L’invocazione di una funzione con parametri prevede:

  • Valutazione delle espressioni che determinano il valore degli argomenti
  • Assegnazione dei valori ottenuti ai rispettivi parametri formali
  • Esecuzione delle istruzioni del corpo della funzione

A meno di non usare global, una funzione non può cambiare il valore di variabili esterne, perché opera solo su variabili locali e variabili parametro che sono comunque variabili locali.

Nel caso di invocazione di una funzione con un argomento che sia un riferimento, il valore assegnato al parametro formale è il valore del riferimento:

voti = [18, 26, 30, 24, 27]
def magari(l):
    l[0] = 30
print(voti) # [18, 26, 30, 24, 27]
magari(voti) # cambia l[0] !!!
print(voti) # [30, 26, 30, 24, 27]

Il valore di voti, cioè il riferimento alla lista, non può essere cambiato all’interno della funzione, ma tramite questo riferimento si può cambiare il valore degli elementi della lista!

Funzioni ricorsive

Un problema può essere risolto da una funzione che svolge una parte del compito e poi richiama se stessa per la restante parte. Una funzione ricorsiva è una funzione che invoca se stessa. Per evitare che una funzione richiami se stessa all’infinito, è necessario che termini almeno in un caso, detto caso base, mentre per gli altri casi può richiamare se stessa nel passo ricorsivo.

Fattoriale

Il fattoriale di un numero naturale n > 0 (denotato con n!) è il prodotto dei naturali da 1 fino ad n. Per definizione 0! = 1. Il fattoriale si presta ad una definizione ricorsiva:

n! = (1 n = 0 (n · (n - 1)! n > 0)

a cui immediatamente corrisponde la seguente funzione Python:

def fatt(n):
    if n == 0:
        return 1 # caso base
    else:
        return n * fatt(n-1) # passo ricorsivo

Numeri di Fibonacci

I numeri di Fibonacci sono i numeri della successione: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, . . . L’ennesimo numero di Fibonacci Fn è la somma dei due precedenti e, per definizione, F0 = 1 e F1 = 1.

Fn = (1 n=0 (1 n=1 (Fn-1 + Fn-2 n>1)

def F(n):

if n == 0 or n == 1:

return 1 # caso base

else:

return F(n-1) + F(n-2) # passo ricorsivo

Si possono svolgere anche delle operazioni pensando in modo ricorsivo. Supponiamo di voler sommare gli elementi di una lista di numeri reali. Si può dire che la somma è 0 se la lista è vuota, altrimenti è il primo numero della lista più la somma dei restanti.

Tipi strutturati

Nella programmazione è spesso necessario utilizzare combinazioni di dati da trattare in modo unitario. Per questo è stato introdotto il concetto di “struttura dati” (struttura per la memorizzazione dei dati) che combina alcuni dati in un’entità unitaria, in modo tale da poterli considerare un oggetto unico. Una stringa può essere considerata una struttura dati che rappresenta un testo sotto forma di sequenza di caratteri. Il Python offre strutture dati molto avanzate come le liste, le tuple, gli insiemi, le tabelle, le matrici, i file e i dizionari.

Liste

Una lista è una sequenza di elementi, ciascuno dei quali è associato ad un indice che ne specifica la posizione. In Python si denota una lista (tipo list) con una sequenza di valori separati di virgole e delimitati da una coppia di parentesi quadre, le liste possono essere memorizzate in variabili per potervi accedere in seguito.

Per accedere ad un elemento di una lista si specifica l’indice dell’elemento facendo uso dell’operatore di indicizzazione [ ]. Gli indici sono valori interi che numerano gli elementi partendo da 0. Al contrario delle stringhe, che sono immutabili, cioè non è possibile modificarne i caratteri, le liste sono mutabili: si può sostituire un elemento con un altro.

Il numero degli elementi di una lista è fornito dalla funzione len. Per fare una scansione della lista (cioè accedere a tutti gli elementi) si possono usare gli indici:

for i in range(len(temperature)):
    print(i, temperature[i])

oppure senza indice:

for elemento in temperature:
    print(elemento)

Gli elementi di una lista sono numerati a partire dall’ultimo con indici negativi da -1 a -n. Una variabile di tipo list come voti in realtà non memorizza nessuno dei valori della lista, ma contiene un riferimento alla posizione in memoria della lista. In Python questo aspetto diventa rilevante quando si copiano i riferimenti alle liste. In Python in generale non è necessario pensare che una variabile sia un riferimento ad una lista e non una lista in sé, ma questo aspetto diventa rilevante quando si copiano variabili di tipo list. Quindi in caso di assegnazione vengono copiati i riferimenti e non i valori presenti nella lista.

In Python le liste sono oggetti, e quindi, come le stringhe, hanno un comportamento definito da metodi. Alcuni sono:

  • lista.append(elemento) ==== aggiunge elementi alla lista
  • lista.insert(indice, elemento) ==== inserisce l’elemento all’indice indicato
Anteprima
Vedrai una selezione di 6 pagine su 24
Fondamenti di informatica 2 Pag. 1 Fondamenti di informatica 2 Pag. 2
Anteprima di 6 pagg. su 24.
Scarica il documento per vederlo tutto.
Fondamenti di informatica 2 Pag. 6
Anteprima di 6 pagg. su 24.
Scarica il documento per vederlo tutto.
Fondamenti di informatica 2 Pag. 11
Anteprima di 6 pagg. su 24.
Scarica il documento per vederlo tutto.
Fondamenti di informatica 2 Pag. 16
Anteprima di 6 pagg. su 24.
Scarica il documento per vederlo tutto.
Fondamenti di informatica 2 Pag. 21
1 su 24
D/illustrazione/soddisfatti o rimborsati
Acquista con carta o PayPal
Scarica i documenti tutte le volte che vuoi
Dettagli
SSD
Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher jacopolore03 di informazioni apprese con la frequenza delle lezioni di Fondamenti di informatica e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli studi di L'Aquila o del prof Di Stefano Gabriele.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community