User Tools

Site Tools


appunti3s:funzioni_in_python

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
appunti3s:funzioni_in_python [2018/10/18 21:49]
profpro
appunti3s:funzioni_in_python [2020/06/08 22:19] (current)
Line 1: Line 1:
 +====== Le funzioni in Python ======
 +>> indice: [[appunti3s:linguaggio_python]]
 +
 +  * **Quiz**: Avete mai usato una funzione matematica? Per che cosa sono utili le funzioni matematiche? 
 +  * **Quiz**: In che modo si può rappresentare una funzione matematica per descriverla agli altri?
 +
 +===== Prerequisiti =====
 +
 +
 +===== Cosa faremo? =====
 +
 +===== Introduzione =====
 +
 +Per capire cosa sia una funzione in un programma basta pensare ad una funzione matematica, dove c'è la variabile indipendente //x// e quella dipendente //y//. Quest'ultima variabile di solito è il risultato che si trova elaborando la prima variabile, come //y=f(x)//. Ad esempio, la funzione //y=x<sup>2</sup>// calcola il quadrato dei valori forniti tramite //x//. Come accade nelle funzioni matematiche, anche le funzioni del programma hanno le parentesi tonde dove possono essere contenuti gli argomenti da utilizzare. Alcune funzioni possono essere prive di argomenti, ma le parentesi si devono scrivere lo stesso.
 +
 +In informatica, chi scrive programmi, quando vuole, può chiedere aiuto alle funzioni per eseguire automaticamente un elaborazione, evitando di dover scrivere il diagramma di flusso e di tradurlo in codice. Questo perché il codice è già stato scritto in passato da qualcun altro (o da lui stesso) e può essere __riutilizzato__ in diversi programmi.
 + 
 +Ad ogni funzione viene affidata l'esecuzione di un compito specifico e ogni volta che si deve svolgere quel compito il programmatore chiama in esecuzione quella funzione. 
 +  * **Quiz**: Per inserire dati dalla tastiera si è già usata una funzione, quale?
 +
 +===== Funzioni built-in =====
 +==== len() ====
 +
 +La funzione //raw_input()// è una funzione che è sempre disponibile per l'uso, in questo caso si dice che è  una funzione integrata (built-in). Un'altra funzione built-in è //len()//, che misura la lunghezza di una variabile. 
 +
 +<file python 10.py>
 +parola = raw_input("inserire una parola\n")
 +numero = len(parola) # assegnazione che contenente una chiamata di funzione
 +print "I caratteri che compongono la parola che hai inserito sono", numero
 +</file>
 +
 +  * elenco delle funzioni built-in http://docs.python.org/library/functions.html 
 +
 +Quando nel programma si incontra il nome di una funzione, è come se si trova un comando. Scrivere il nome di una funzione serve a chiedere di eseguire quella funzione, perciò la presenza del nome della funzione viene definita **chiamata** della funzione.
 +In quel momento, l'esecuzione del programma viene __sospesa__ per eseguire la funzione, poi, quando la funzione termina, si riprende il programma.
 +Nell'ultimo esempio, prima di effettuare l'assegnazione deve essere eseguita la funzione //len()//. Al termine //len()// produce un risultato che viene memorizzato dentro la variabile //numero//
 +In termini tecnici si dice che len() //restituisce// un risultato.
 +
 +  * A chi viene restituito questo risultato? (Chi ne aveva bisogno?)
 +==== round() ====
 +
 +Nel prossimo esempio si vuole calcolare la media di due voti e arrotondare il valore se c'e' la virgola.
 +In questo esempio il risultato prodotto dalla funzione //round()// non viene memorizzato ma solo mostrato con //print//.
 +
 +<file python 11.py>
 +numero1 = input("inserire un primo voto\n")
 +numero2 = input("inserire un secondo voto\n")
 +media=(numero1+numero2)/2.0  # divisione in virgola mobile
 +print "la media vale", media
 +print "arrotondato a", round(media)
 +</file>
 +
 +==== type() ====
 +
 +Un altro esempio dimostra l'uso di //type()//, usata per conoscere il tipo di dato (numerico o testuale) contenuto in una variabile. Per creare una variabile che contiene testo (alfanumerico) useremo raw_input(). Non importa il contenuto. Può essere testuale, numerico o misto...
 +
 +<file python 12.py>
 +numero1 = raw_input("inserire un primo numero\n")
 +numero2 = input("inserire un secondo numero\n")
 +print "Le variabili usate si chiamano: numero1 numero2"
 +print "I VALORI contenuti nelle variabili sono:", numero1, numero2
 +print "I TIPI DI DATO delle variabili sono:", type(numero1), type(numero2)
 +</file>
 +
 +Dal risultato si capisce che usando //raw_input()// si ottiene sempre un tipo 'str' (stringa di testo) che non è adatto ad effettuare calcoli con i numeri. Basta ricordare che per leggere i numeri eravamo costretti ad usare //input()//. Il motivo è che //raw_input()// restituisce un tipo 'str' mentre //input()// un valore numerico (tipo 'float' oppure 'int').
 +
 +==== int() ====
 +
 +Nel prossimo esempio risolveremo il problema che avevamo precedentemente incontrato nella lettura dei numeri dalla tastiera, usando una funzione che **trasforma** le variabili di tipo 'str' in variabili di tipo 'int'. Grazie ad una funzione del genere si può usare //raw_input()// sia per leggere testo che per leggere i numeri.
 +La funzione si chiama //int()// e restituisce sempre una variabile intera
 +
 +<file python 13.py>
 +numero1 = raw_input("inserire un numero\n")
 +numero2 = int(numero1)  # trasformazione del tipo
 +print "Le variabili usate si chiamano: numero1 numero2"
 +print "I VALORI contenuti nelle variabili sono:", numero1, numero2
 +print "I TIPI DI DATO delle variabili sono:", type(numero1), type(numero2)
 +</file>
 +
 +Dal risultato si capisce che numero1 e numero2 appaiono simili nel contenuto, ma diverse nel tipo di dato: numero1 non è una variabile adatta a fare i calcoli mentre numero2 lo è.
 +
 +==== Programmatori e sviluppatori ====
 +
 +I professionisti della programmazione potrebbero essere divisi in due grandi categorie:
 +  * **gli sviluppatori di nuove funzioni**, che creano funzioni o librerie di funzioni;
 +  * **i programmatori di applicazioni**, che usano le funzioni create da qualcun altro (cioé dagli sviluppatori).
 +
 +  * **Quiz:** Tu a quale categoria pensi di appartenere?
 +
 +>> Ovviamente questa suddivisione non va presa alla lettera perché esiste anche chi fa entrambe le cose, ma probabilmente, per iniziare a programmare, è  più semplice cercare di capire prima come si usa una funzione già pronta e solo dopo di provare a crearne una da soli.
 +
 +===== Funzione di funzione =====
 +La funzione len() potrebbe essere chiamata anche in un altro modo.
 +
 +<file python 10bis.py>
 +numero = len(raw_input("inserire una parola\n"))
 +print "I caratteri che compongono la parola che hai inserito sono", numero
 +</file>
 +
 +Confrontare questa versione con la precedente versione (file 10.py).
 +
 +Nella seconda versione le parentesi sono all'interno di altre parentesi: %%((...))%%. Significa che una funzione si trova dentro un'altra funzione. Quale viene eseguita per prima? Come in matematica, anche qui si esegue prima tutto quello che si trova dentro le parentesi più interne...
 +
 +In quest'ultimo caso è molto più difficile leggere il codice del programma, ma c'è un vantaggio: per capirlo provare a contare quante sono le variabili usate nella prima versione e quante nella seconda. Se uso meno variabili significa che ho risparmiato un po' di memoria...
 +
 +  * **Esercizio**: provare a modificare il codice del programma 13.py in modo che non sia necessario usare la variabile numero2.
 +===== Altre funzioni =====
 +
 +Non tutte le funzioni sono sempre disponibili. Se la funzione non è bulti-in vuol dire che si trova in un **modulo** esterno che, prima di poter essere usato, deve essere "importato" nel programma.  Il seguente esempio usa la funzione radice quadrata (square root) che deve essere importata dal modulo "math".
 +
 +==== math.sqrt() ====
 +
 +Attenzione a: 
 +  - aggiungere //import//,
 +  - aggiungere il nome del modulo davanti al nome della funzione. 
 +
 +<file python 14.py>
 +import math
 +numero = int(raw_input("inserire un numero positivo per calcolarne la radice quadrata\n"))
 +print math.sqrt(numero)
 +</file>
 +  * **Esercizio** tradurre con le proprie parole il significato dell'istruzione //int(raw_input(ecc...))//
 +  * **Esercizio**: togliere "math." per provare che non funziona.
 +  * **Esercizio**: eseguire questo codice da LINEA DI COMANDO (terminale) e spiegare a cosa serve
 +    * <code>>>> import math
 +>>> dir(math)</code>
 +
 +==== math.pow() ====
 +
 +Le funzioni possono avere anche più di un argomento tra parentesi. Ad esempio, la funzione che calcola l'elevamento a potenza x<sup>y</sup>deve necessariamente conoscere sia la base (il numero da elevare) che l'esponente (la potenza).
 +
 +<file python 15.py>
 +import math
 +base = int(raw_input("inserire un numero positivo\n"))
 +esponente = int(raw_input("inserire ora l'esponente a cui deve essere elevato\n"))
 +print "il risultato di", base, "elevato", esponente, "vale", math.pow(base, esponente)
 +</file>
 +
 +  * **Esercizio**: modificare il programma per consentire l'inserimento di numeri in virgola mobile. 
 +===== Vantaggi =====
 +Perché il programmatore usa le funzioni?
 +
 +Sarebbe più facile scrivere da soli un programma che calcola l'elevamento a potenza, oppure è più semplice usare la funzione math.pow()? 
 +==== Application Programming Interface ====
 +Come può un programmatore di applicazioni imparare ad usare funzioni che non conosce?
 +
 +Ogni volta che si desidera imparare ad usare un nuovo gruppo di funzioni si deve cercare la cosiddetta API (Application Programming Interface) che descrive le funzioni utilizzabili da un programmatore. In particolare, l'API non spiega come è stata costruito una funzione, ma solo come va usata. 
 +
 +  * **Quiz:** Per usare un nuovo strumento, come un motorino, devo sapere come funziona oppure come l'hanno costruito?
 +
 +
 +===== Convenzioni =====
 +
 +D'ora in avanti gli identificatori delle funzioni e delle variabili costituiti da più parole si riconosceranno dall'iniziale minuscola ed eventuali altre parole separate con un _ //underscore//.
 +
 +una_variabile=3
 +
 +una_funzione()
 +
 +===== Esercizi =====
 +
 +riepilogare i nomi delle funzioni usate in questo capitolo in una tabella e spiegare a cosa servono
 +
 +esempi con
 +
 +math.pow() 
 +
 +math.floor() 
 +