FI05b_Pyhton_funzioni.pdf
Document Details
Uploaded by ArticulateHeather7381
Full Transcript
Funzioni FONDAMENTI DI INFORMATICA Analisi dei Dati per l’Impresa e la Finanza Roberto Cavicchioli [email protected] Le funzioni nei linguaggi di alto livello Tutti i linguaggi di alto livello mettono a disposizione degli utenti, come parte dell’ambiente di programmazione, un...
Funzioni FONDAMENTI DI INFORMATICA Analisi dei Dati per l’Impresa e la Finanza Roberto Cavicchioli [email protected] Le funzioni nei linguaggi di alto livello Tutti i linguaggi di alto livello mettono a disposizione degli utenti, come parte dell’ambiente di programmazione, un insieme di programmi che eseguono operazioni di utilità generale. Per esempio: ◮ calcolo di funzioni trigonometriche e logaritmiche ◮ accesso ai file della memoria secondaria ◮ realizzazione di interfacce grafiche per i propri programmi Tali programmi sono detti funzioni per analogia con il concetto di funzione matematica, poiché sono in grado di elaborare un determinato insieme di valori di ingresso e di produrre un risultato. 349 Funzioni predefinite e definite dall’utente Le funzioni disponibili in un linguaggio di programmazione sono dette predefinite, o built-in. L’insieme di tali funzioni viene detto libreria. Tutti i linguaggi di programmazione consentono inoltre ai programmatori di definire nuove funzioni: tali funzioni sono dette definite dall’utente (user-defined). 350 Utilità delle funzioni La disponibilità di funzioni predefinite evita agli utenti di dover scrivere propri programmi per realizzare operazioni di utilità generale. Inoltre, la possibilità di definire nuove funzioni presenta diversi vantaggi: ◮ consente di semplificare la scrittura di programmi complessi suddividendoli in più parti (funzioni), ciascuna delle quali svolge un compito distinto dalle altre, e può essere sviluppata in modo indipendente da esse ◮ l’esecuzione di una funzione può essere richiesta in diversi punti di uno stesso programma, senza dover scrivere più volte le sue istruzioni ◮ una stessa funzione può essere usata in programmi diversi 351 La libreria del linguaggio Python Il linguaggio Python comprende un vasto insieme di funzioni di libreria, disponibili in qualsiasi ambiente di programmazione. Alcune funzioni predefinite sono direttamente accessibili dalla shell e dai propri programmi. Le altre sono suddivise in diverse categorie, dette a loro volta librerie (per es., la libreria matematica); per poter usare queste ultime è necessaria un’istruzione particolare. La descrizione completa della libreria Python si trova nel documento La libreria di riferimento di Python, di G. van Rossum, disponibile nel sito h t t p : / / d o c s. p y t h o n. i t In questo corso si useranno due librerie: ◮ funzioni matematiche ◮ funzioni per la generazione di numeri casuali 352 Caratteristiche delle funzioni A ogni funzione è associato un nome simbolico (analogo ai nomi delle variabili), detto nome della funzione. Ogni funzione può elaborare un determinato numero di valori di ingresso, detti argomenti per analogia con gli argomenti delle funzioni matematiche. Ogni funzione può infine restituire un valore di un determinato tipo, come risultato dell’elaborazione svolta sugli argomenti. Come caso particolare, esistono anche funzioni che non ricevono nessun argomento. 353 Esecuzione di una funzione: chiamata L’esecuzione di una funzione si ottiene attraverso una specifica espressione, detta chiamata di funzione. Sintassi: nome-funzione ( arg1 , arg2 ,... , argn ) ◮ arg1,... , argn sono espressioni Python, i cui valori costituiranno gli argomenti della funzione ◮ il numero degli argomenti dipende dalla specifica funzione: s e il numero degli argomenti presenti nella chiamata non ◮ corrisponde a quello previsto si otterrà un messaggio d’errore anche il tipo di ciascun argomento deve coincidere con quello ◮ previsto dalla funzione come tutte le espressioni, anche la chiamata di una funzione produce un valore, che costituisce il valore restituito dalla funzione 354 Principali funzioni Python predefinite: input Si è già descritta in precedenza la funzione input. Questa funzione può non ricevere argomenti, oppure può riceverne uno (di norma una stringa, anche sepuò essere un’espressione qualsiasi): ◮ input() ◮ i n p u t (arg) Una chiamata di in p u t produce la stampa nella shell del valore di arg (se presente), l’acquisizione di una sequenza di caratteri che dovranno essere inseriti attraverso la tastiera (fino alla pressione del tasto INVIO), ela restituzione di tale sequenza in un valore di tipo stringa. 355 Principali funzioni Python predefinite: print Come si è già visto, la funzione p r i n t consente di stampare nella shell dell’ambiente di programmazione (o del sistema operativo) i valori di una o più espressioni Python: ◮ print(espressione) ◮ print(espressione1,espressione2,... ) Nel secondo caso i valori delle espressioni vengono stampati su una stessa riga, separati da un carattere di spaziatura. Si noti che p r i n t èuna funzione particolare, in quanto non restituisce nessun valore: il suo unico scopo èstampare valori nells shell. 356 Principali funzioni Python predefinite Altre funzioni predefinite di utilità generale sono le seguenti: ◮ len(stringa) restituisce il numero di caratteri di una stringa ◮ abs(numero) restituisce il valore assoluto di un numero ◮ str(espressione) restituisce una stringa composta dalla sequenza di caratteri corrispondenti alla rappresentazione del valore di espressione (che può essere di un qualsiasi tipo: numero, stringa, valore logico, ecc.) 357 Principali funzioni Python predefinite: esempi 358 Principali funzioni Python predefinite ◮ eval(stringa) sestringa contiene una qualsiasi espressione valida del linguaggio Python, restituisce il valore di tale espressione ◮ int(numero) restituisce la parte intera di un numero ◮ float(numero) restituisce il valore di numero come numero frazionario (floating point) ◮ int(stringa) sestringa contiene la rappresentazione di un numero intero, restituisce il numero corrispondente a tale valore ◮ float(stringa) sestringa contiene la rappresentazione di un numero qualsiasi (sia intero che frazionario), restituisce il suo valore espresso come numero frazionario 359 Principali funzioni Python predefinite: esempi 360 Principali funzioni Python predefinite: split La funzione s p l i t è molto utile per l’elaborazione di stringhe (più avanti si vedrà il suo uso per l’elaborazione di dati acquisiti da file di testo). La sintassi della chiamata è diversa da quella vista in precedenza, per motivi che esulano dagli scopi di questo corso: s tr i n g a.s p l i t () dove stringa indica una variabile avente per valore una stringa. Questa funzione suddivide una stringa in corrispondenza dei caratteri di spaziatura (incluso il newline) erestituisce una lista contenente le corrispondenti sottostringhe, nelle quali non vengono inclusi i caratteri di spaziatura (si noti che la stringa originale non viene modificata). 361 Principali funzioni Python predefinite: split Seuna stringa contiene una sequenza di parole separate da caratteri di spaziatura, s p l i t consente di “separare” le singole parole (più precisamente, restituisce all’interno di una lista le stringhe corrispondenti alle singole parole, senza modificare la stringa originaria). Un esempio: sela variabile t contiene la stringa: "Questa è una f r a s e. " la chiamata: t.split() restituirà la lista: [ " Q u e sta " , " è " , " u n a " , " f r a s e. " ] 362 Principali funzioni Python predefinite: split Sesi desidera suddividere una stringa in corrispondenza di una sequenza di uno o più caratteri qualsiasi, tale sequenza dovrà essere indicata (sotto forma di una stringa) come argomento di s p l i t , con la seguente sintassi: stringa.split(caratteri) Per esempio, se la variabile t contenesse una stringa composta da una sequenza di numeri separati dal punto e virgola (senza spazi), come la seguente: "15;1;25;9;6;21" la chiamata: t.split(";") restituirebbe la lista: [ " 15" , " 1 " , "25", " 9 " , " 6 " , "21"] (notare che i caratteri di separazione non vengono inclusi nel risultato). 363 La funzione split: esempi Dopo i seguenti assegnamenti: a = "Una f r a s e d i cinque p a rol e " b = "Prima riga\nseconda r i g a. " c = "Uno...due...tre" ◮ a. s p l i t ( ) restituisce [ " U n a " , " f r a s e " , " d i " , " c i n q u e " , " p a ro l e " ] ◮ b. s p l i t ( ) restituisce ["Prima r i g a " , "seconda r i g a. " ] ◮ c. s p l i t ( ) restituisce [ " U n o... d u e... t r e " ] (la stringa non viene suddivisa, poiché non contiene caratteri di spaziatura) ◮ c. s p l i t ( "... " ) restituisce ["Uno", "due", " t r e " ] 364 Principali funzioni Python predefinite: esempi 365 Principali funzioni Python predefinite Ulteriori funzioni predefinite, necessarie per l’elaborazione di altri tipi di dato Python (liste edizionari) eper l’accesso ai file della memoria secondaria, verranno presentate più avanti. 366 Ancora sulla sintassi della chiamata di funzione Come si è già detto, dal punto di vista sintattico la chiamata di una funzione è un’espressione, e quindi deve rispettare le stesse regole sintattiche viste in precedenza per le espressioni: ◮ può essere scritta direttamente nella shell (come negli esempi precedenti): in questo caso anche il valore restituito dalla funzione verrà mostrato nella shell ◮ può comparire come operando di una qualsiasi espressione più complessa (aritmetica, logica, o composta da stringhe) ◮ può comparire nell’espressione di un’istruzione di assegnamento ◮ può comparire nelle espressioni condizionali all’interno di istruzioni condizionali e iterative 367 Chiamata di funzione: esempi 368 Chiamata di funzione: sintassi degli argomenti Si èanche detto che gli argomenti di una chiamata di funzione sono a loro volta espressioni. Ciascuno degli argomenti può quindi essere un’espressione Python qualsiasi, purché produca un valore di un tipo previsto dalla funzione (in caso contrario si potrebbe ottenere un messaggio d’errore). Ne consegue come caso particolare che una chiamata di funzione può contenere tra le espressioni dei suoi argomenti altre chiamate di funzione (chiamate nidificate). 369 Argomenti delle chiamate di funzione: esempi 370 Librerie di funzioni del linguaggio Python Molte funzioni predefinite fanno parte di specifiche librerie Python, che a loro volta sono identificate univocamente da un nome simbolico. Per esempio, le funzioni matematiche fanno parte di una libreria di nome math, mentre la libreria random comprende varie funzioni per la generazione di numeri casuali. Le principali funzioni delle librerie math erandom sono descritte di seguito. 371 Principali funzioni della libreria math funzione descrizione cos(x) coseno (x deve essere espresso in radianti) sin(x) seno (come sopra) ta n ( x ) tangente (come sopra) a cos( x) arco-coseno (x deve essere nell’intervallo [−1, 1]) asin(x) arco-seno (come sopra) ata n ( x ) arco-tangente ra d i a n s ( x) converte in radianti un angolo espresso in gradi degrees(x) converte in gradi un angolo espresso in radianti exp(x) ex log(x) ln x l o g ( x, b) logb x log10(x) log10 x pow(x, y) xy sqrt(x) √x Tutte le funzioni di questa libreria restituiscono un numero frazionario. 372 La libreria random Alcune funzioni della libreria random sono le seguenti: funzione descrizione random() genera un numero reale nell’intervallo [0, 1) da una distribuzione di probabilità uniforme (cioè, ogni valore di tale intervallo ha la stessa probabilità di essere “estratto”) uniform( a,b) come sopra, nell’intervallo [a, b) (gli argomenti sono numeri qualsiasi) ra n d i n t ( a, b) genera un numero intero nell’insieme {a,... , b}, da una distribuzione di probabilità uniforme (gli argomenti devono essere numeri interi) Ogni chiamata di tali funzioni produce un numero pseudo- casuale, indipendente (in teoria) dai valori prodotti dalle chiamate precedenti. 373 L’istruzione from-import Prima di chiamare una funzione di librerie come math e random (sia nella shell che in un programma) ènecessaria l’istruzione from-import, che prevede la seguente sintassi: from nome-libreria import nome-funzione ◮ nome-libreria è il nome simbolico di una libreria ◮ nome-funzione può essere: – il nome di una specifica funzione di tale libreria (questo consentirà di usare solo tale funzione) – il simbolo * indicante tutte le funzioni di tale libreria Se tale istruzione non viene usata ogni chiamata produrrà un errore, come mostrato negli esempi seguenti. 374 L’istruzione from-import: esempi 375 L’istruzione from-import: esempi 376 La libreria math: costanti matematiche notevoli Oltre a varie funzioni, nella libreria math sono definite due variabili che contengono il valore (approssimato) delle costanti matematiche π (3,14... ) ed e (la base dei logaritmi naturali: 2,71... ): ◮ pi ◮ e Anche per usare queste variabili è necessaria l’istruzione from-import, in una delle due versioni: ◮ from math import * ◮ from math import nome-variabile dove nome-variabile dovrà essere p i oppure e. Nota: Il valore delle due variabili può essere modificato con istruzioni di assegnamento, anche se ciò non è consigliabile. Il loro valore originale può essere ripristinato eseguendo di nuovo l’istruzione from-import. 377 Le variabili pi ed e: esempi 378 Definizione di nuove funzioni Come si ègià detto, i linguaggi di programmazione di alto livello consentono agli utenti anche la definizione di nuove funzioni. La sintassi della chiamata di tali funzioni èidentica a quella delle funzioni predefinite. La definizione di una nuova funzione è composta dai seguenti elementi: ◮ il nome della funzione ◮ il numero dei suoi argomenti ◮ la sequenza di istruzioni, detta corpo della funzione, che dovranno essere eseguite quando la funzione sarà chiamata La definizione di una nuova funzione avviene attraverso l’istruzione def, che può essere scritta sia nella shell che in un programma (in una finestra dell’editor ). 379 Definizione di nuove funzioni: l’istruzione def Sintassi: def nome-funzione (par 1 ,... , parn) : corpo della funzione ◮ nome-funzione è un nome simbolico scelto dal programmatore, con gli stessi vincoli a cui sono soggetti i nomi delle variabili ◮ par1,... , parn sono nomi (scelti dal programmatore) di variabili, dette parametri della funzione, alle quali l’interprete assegnerà i valori degli argomenti che verranno indicati nella chiamata della funzione ◮ corpo della funzione èuna sequenza di una o più istruzioni qualsiasi, ciascuna scritta in una riga distinta, con un rientro di almeno un carattere, identico per tutte le istruzioni La prima riga della definizione (contenente i nomi della funzione e dei parametri) è detta intestazione della funzione. 380 Definizione di nuove funzioni: l’istruzione return Per concludere l’esecuzione di una funzione e indicare il valore che la funzione dovrà restituire come risultato della sua chiamata si usa l’istruzione return. Sintassi: ret u rn espressione dove espressione è un’espressione Python qualsiasi. Questa istruzione può essere usata solo solo all’interno di una funzione. Se una funzione non deve restituire nessun valore: ◮ l’istruzione ret u rn può essere usata, senza l’indicazione di nessuna espressione, per concludere l’esecuzione della funzione ◮ senon si usa return, l’esecuzione della funzione terminerà dopo l’esecuzione dell’ultima istruzione del suo corpo 381 Definizione e chiamata di una funzione L’esecuzione dell’istruzione def non comporta l’esecuzione delle istruzioni della funzione: tali istruzioni verranno eseguite solo attraverso una chiamata della funzione. L’istruzione def dovrà essere eseguita una sola volta, prima di qualsiasi chiamata della funzione. In caso contrario il nome della funzione non sarà riconosciuto dall’interprete, ela chiamata produrrà un messaggio d’errore. Si noti che il riavvio della shell a seguito dell’esecuzione di un programma comporta la cancellazione delle eventuali funzioni, oltre che delle variabili, definite in precedenza. 382 Chiamata di una funzione: meccanismo di esecuzione Come per le funzioni predefinite, anche per quelle definite dall’utente il numero di argomenti indicati nella chiamata dovrà corrispondere al numero di argomenti previsti nella definizione, cioè al numero dei parametri indicati nell’intestazione. L’interprete esegue la chiamata di una funzione nel modo seguente: ◮ copia il valore di ciascun argomento nel parametro corrispondente (quindi tali variabili possiedono già un valore nel momento in cui inizia l’esecuzione della funzione) ◮ esegue le istruzioni del corpo della funzione, fino a incontrare l’istruzione ret u rn oppure l’ultima istruzione del corpo ◮ sel’eventuale istruzione ret u rn è seguita da un’espressione, restituisce il valore di tale espressione come risultato della chiamata 383 Definizione di funzioni: esempio Si supponga di voler definire una funzione che restituisca il più grande tra due numeri ricevuti come argomenti. Scegliendo massimo come nome della funzione, e a e b come nomi dei suoi parametri, la funzione può essere definita come segue: def massimo( a , b ) : i f a > b: ret u rn a else : ret u rn b 384 Definizione di funzioni: esempio La definizione di una funzione deve essere scritta in una finestra dell’editor, e deve essere salvata in un f i l e : 385 Definizione di funzioni: esempio Dopo il salvataggio del file la funzione che esso contiene non è ancora “nota” all’interprete: una sua chiamata scritta nella shell produrrà un messaggio d’errore: 386 Definizione di funzioni: esempio Prima di chiamare una funzione è necessario eseguire l’istruzione def nel file che contiene la definizione. Si ricordi che l’esecuzione dell’istruzione def non comporta l’esecuzione delle istruzioni della funzione: 387 Definizione di funzioni: esempio Da questo momento è possibile chiamare la funzione dalla shell. 389 Ancora sui parametri di una funzione Come si èdetto in precedenza, quando una funzione viene chiamata, prima di iniziare l’esecuzione delle sue istruzioni l’interprete assegna ai parametri i valori degli argomenti indicati nella chiamata. Nell’esempio precedente le variabili (parametri) a e b della funzione massimo avranno già un valore nel momento in cui inizierà l’esecuzione delle istruzioni del corpo della funzione. Questo significa che i valori delle variabili che costituiscono i parametri della funzione non devono essere definiti per mezzo di istruzioni di assegnamento nel corpo della funzione, ma vengono definiti nella chiamata della stessa funzione. 390 Definizione di funzioni: esempi In precedenza si sono mostrati esempi di programmi per il calcolo del massimo comun divisore tra due numeri naturali con l’algoritmo di Euclide, edella somma dei primi m termini della serie armonica (per un dato valore di m). Di seguito si mostra come gli stessi programmi possano essere scritti sotto forma di funzioni. In entrambi i casi quelli che nei programmi erano i valori d’ingresso (e venivano acquisiti usando la funzione input ) sono ora definiti come argomenti della funzione, mentre il risultato, che nei programmi veniva stampato nella shell, viene restituito dalla funzione mediante l’istruzione return. Le funzioni possono essere definite e chiamate come mostrato nell’esempio precedente. 391 Definizione di funzioni: esempi Calcolo del massimo comun divisore con l’algoritmo di Euclide: def mcd ( a , b ) : while a ! = b : if a < b : b= b - a else : a = a - b ret u rn a 392 Definizione di funzioni: esempi Calcolo della somma dei primi m termini della serie armonica: def serie_armonica (m) : serie = 1 k = 2 while k