Funzioni 1 - introduzione

Scarica zip esercizi

Naviga file online

Una funzione prende dei parametri e li usa per produrre o riportare qualche risultato.

ATTENZIONE

Questi esercizi sulle funzioni sono integrativi a quelli già indicati nella pagina riferimenti, in particolare vedere quelli qui sotto.

Riferimenti

Che fare

  • scompatta lo zip in una cartella, dovresti ottenere qualcosa del genere:

functions
    functions1.ipynb
    functions1-sol.ipynb
    functions2-chal.ipynb
    jupman.py

ATTENZIONE: Per essere visualizzato correttamente, il file del notebook DEVE essere nella cartella szippata.

  • apri il Jupyter Notebook da quella cartella. Due cose dovrebbero aprirsi, prima una console e poi un browser. Il browser dovrebbe mostrare una lista di file: naviga la lista e apri il notebook functions.ipynb

  • Prosegui leggendo il file degli esercizi, ogni tanto al suo interno troverai delle scritte ESERCIZIO, che ti chiederanno di scrivere dei comandi Python nelle celle successive. Gli esercizi sono graduati per difficoltà, da una stellina ✪ a quattro ✪✪✪✪

Scorciatoie da tastiera:

  • Per eseguire il codice Python dentro una cella di Jupyter, premi Control+Invio

  • Per eseguire il codice Python dentro una cella di Jupyter E selezionare la cella seguente, premi Shift+Invio

  • Per eseguire il codice Python dentro una cella di Jupyter E creare una nuova cella subito dopo, premi Alt+Invio

  • Se per caso il Notebook sembra inchiodato, prova a selezionare Kernel -> Restart

DOMANDE: Per ciascuna delle espressioni seguenti, prova a indovinare che risultato produce (o se da errore)

  1. def f():
    print('car')
    f()
    
  2. def f():
        print('car')
    f()
    
  3. def f():
    return 3
    f()
    
  4. def f():
        return 3
    f()
    
  5. def f()
        return 3
    f()
    
  6. def f():
        return 3
    f()f()
    
  7. def f():
        return 3
    f()*f()
    
  8. def f():
        pass
    
  9. def f(x):
        return x
    f()
    
  10. def f(x):
        return x
    f(5)
    
  11. def f():
        print('fire')
    x = f()
    print(x)
    
  12. def f():
        return(print('fire'))
    print(f())
    
  13. def f(x):
        return 'x'
    print(f(5))
    
  14. def f(x):
        return 'x'
    print(f(5))
    
  15. def etc():
        print('etc...')
        return etc()
    etc()
    
  16. def gu():
        print('GU')
        ru()
    def ru():
        print('RU')
        gu()
    gu()
    

Modificare parameteri

DOMANDE: Per ciascuna delle espressioni seguenti, prova a indovinare che risultato produce (o se da errore)

  1. def zam(bal):
        bal = 4
    x = 8
    zam(x)
    print(x)
    
  2. def zom(y):
        y = 4
    y = 8
    zom(y)
    print(y)
    
  3. def per(la):
        la.append('è')
    per(la)
    print(la)
    
  4. def zeb(la):
        la.append('d')
    lista = ['a','b','c']
    zeb(lista)
    print(lista)
    
  5. def ocio(la):
        la = ['?','?']
    lb = ['o','r','p','o']
    ocio(lb)
    print(lb)
    
  6. def umpa(stringa):
        stringa = "lompa"
    parola = "gnappa"
    umpa(parola)
    print(parola)
    
  7. def sportiva(diz):
        diz['scarpe'] = 2
    armadio = {'racchette':4,
               'palline': 7}
    sportiva(armadio)
    print(armadio)
    
  8. def numma(lista):
        lista + [4,5]
    la = [1,2,3]
    print(numma(la))
    print(la)
    
  9. def giara(lista):
        return lista + [4,5]
    lb = [1,2,3]
    print(giara(lb))
    print(lb)
    

Saper distinguere le funzioni

All’incirca puoi trovare 5 categorie di funzioni nel mondo là fuori:

  1. fa solo una STAMPA/SCRITTURA (produce i cosiddetti side effects modificando l’ambiente in qualche mode, come mostrando caratteri sullo schermo o scrivendo in un file)

  2. RITORNA un valore

  3. MODIFICA l’input

  4. MODIFICA l’input e lo RITORNA (permette la concatenazione di chiamate, detto chaining)

  5. MODIFICA l’input e RITORNA qualcosa derivato dall’input

Proviamo ora a capire le differenze con diversi esempi.

Esempio - pirintola

Fa solo una STAMPA / SCRITTURA

  • NON modifica l’input!

  • NON ritorna niente!

[1]:
def pirintola(lista):
    """STAMPA i primi due elementi della lista data
    """
    print(lista[0], lista[1])

la = [8,5,6,2]

pirintola(la)
8 5

Esempio - ritornola

RITORNA valori

  • NON modifica l’input

  • NON stampa niente!

[2]:
def ritornola(lista):
    """RITORNA una NUOVA lista che ha tutti i numeri di lista raddoppiati
    """
    ret = []
    for el in lista:
        ret.append(el*2)
    return ret

la = [5,2,6,3]
ritornola(la)
[2]:
[10, 4, 12, 6]

Esempio - modifanta

MODIFICA l’input

  • NON ritorna niente!

  • NON stampa niente!

[3]:
def modifanta(lista):
    """MODIFICA lista in modo che sia ordinata in-place
    """
    lista.sort()

la = [7,4,9,8]

modifanta(la)

print(la)
[4, 7, 8, 9]

Esempio - modritut

  • MODIFICA l’input e lo RITORNA

  • NON STAMPA niente!

[4]:
def modritut(lista):
    """MODIFICA lista raddoppiando tutti i suoi elementi,
       e infine RITORNA la lista di input
    """
    for i in range(len(lista)):
        lista[i] = lista[i] * 2
    return lista

la = [8,7,5]
print(modritut(la))   # [16,14,10]  ha RITORNATO l'input modificato
print(la)             # [16,14,10]  l'input la è stato MODIFICATO !!

lb = [7,5,6]
modritut(lb).reverse()   # NOTA CHE POSSIAMO CONCATENARE
print(lb)                # [12,10,14]  l'input lb è stato MODIFICATO !!
#modritut(lb).reverse().append(16)  # ... ma questo non funzionerebbe. Perchè?

print(la)
[16, 14, 10]
[16, 14, 10]
[12, 10, 14]
[16, 14, 10]

Esempio - modritpar

MODIFICA l’input e RITORNA una parte di esso

  • NON STAMPA niente!

[5]:
def modritpar(lista):
    """MODIFICA lista affinchè diventi ordinata e l'elemento più grande sia rimosso,
       infine RITORNA l'elemento rimosso
    """
    lista.sort()
    ret = lista[-1]
    lista.pop()
    return ret

la = ['b','c','a']
print(modritpar(la))  # 'c'        # ha RITORNATO un pezzo di input
print(la)             # ['a','b']  # la è stata MODIFICATA!!

c
['a', 'b']

Esercizi

somma

✪ Scrivere una funzione somma che dati due numeri x e y RITORNA la loro somma

Mostra soluzione
[6]:
# scrivi qui


[7]:
s = somma(3,6)
print(s)
9
[8]:
s = somma(-1,3)
print(s)
2

comparap

✪ Scrivere una funzione comparap che dati due numeri x e y, STAMPA x è maggiore di y, x è minore di y o x è uguale a y

NOTA: nella stampa, mettere i numeri veri. Per es comparap(10,5) dovrebbe stampare:

10 è maggiore di 5

SUGGERIMENTO: per stampare numeri e testo, usare le virgole nella print:

print(x, " è maggiore di ")
Mostra soluzione
[9]:
# scrivi qui


[10]:
comparap(10,5)
10  è maggiore di  5
[11]:
comparap(3,8)
3  è minore di  8
[12]:
comparap(3,3)
3  è uguale a  3

comparar

✪ Scrivere una funzione comparar che dati due numeri x e y, RITORNA la STRINGA '>' se x è maggiore di y, la STRINGA '<' se x è minore di y oppure la STRINGA '==' se x è uguale a y

Mostra soluzione
[13]:
# scrivi qui


[14]:
c = comparar(10,5)
print(c)
>
[15]:
c = comparar(3,7)
print(c)
<
[16]:
c = comparar(3,3)
print(c)
==

pari

✪ Scrivere una funzione pari che dato un numero x RITORNA True se il numero x in ingresso è pari, altrimenti ritorna False

SUGGERIMENTO: un numero è pari quando il resto della divisione per due è zero. Per ottenere il resto della divisione, scrivere x % 2.

[17]:
# Esempio:
2 % 2
[17]:
0
[18]:
3 % 2
[18]:
1
[19]:
4 % 2
[19]:
0
[20]:
5 % 2
[20]:
1
Mostra soluzione
[21]:
# scrivi qui


[22]:
p = pari(2)
print(p)
True
[23]:
p = pari(3)
print(p)
False
[24]:
p = pari(4)
print(p)
True
[25]:
p = pari(5)
print(p)
False
[26]:
p = pari(0)
print(p)
True

mag

✪ Scrivere una funzione che dati due numeri x e y RITORNA il numero maggiore.

Se sono uguali, RITORNA un numero qualsiasi.

Mostra soluzione
[27]:
# scrivi qui


[28]:
m = mag(3,5)
print(m)
5
[29]:
m = mag(6,2)
print(m)
6
[30]:
m = mag(4,4)
print(m)
4
[31]:
m = mag(-5,2)
print(m)
2
[32]:
m = mag(-5, -3)
print(m)
-3

is_vocale

✪ Scrivi una funzione is_vocale a cui viene passato un carattere car come parametro, e STAMPA 'sì' se il carattere è una vocale, altrimenti STAMPA 'no' (usando le print).

>>> is_vocale("a")
'si'

>>> is_vocale("c")
'no'
Mostra soluzione
[33]:
# scrivi qui


volume_sfera

✪ Il volume di una sfera di raggio r è \(4/3 π r^3\)

Scrivere una funzione volume_sfera(raggio) che dato un raggio di una sfera, STAMPA un messaggio il volume è

NB: assumi pi_greco = 3.14

>>> x = volume_sfera(4)
il volume è 267.94666666666666
>>> x  # non ritorna nulla
None
Mostra soluzione
[34]:

# scrivi qui


ciri

✪ Scrivi una funzione ciri(nome) che prende come parametro la stringa nome e RITORNA True se è uguale al nome ‘Cirillo’

>>> r = ciri("Cirillo")
>>> r
True

>>> r = ciri("Cirillo")
>>> r
False
Mostra soluzione
[35]:
# scrivi qui


age

✪ Scrivi una funzione age che prende come parametro anno di nascita e RITORNA l’eta’ della persona

Supponi che l’anno corrente sia noto, quindi per rappresentarlo nel corpo della funzione usa una costante come 2019

>>> a = age(2003)
>>> print(a)
16
Mostra soluzione
[36]:
# scrivi qui


Verifica comprensione

ATTENZIONE

Gli esercizi che segueno contengono dei test con gli assert. Per capire come svolgerli, leggi prima Gestione errori e testing

mag_tre

✪✪ Scrivi una funzione mag_tre(a,b,c) che prende stavolta tre numeri come parametro e RESTITUISCE il più grande tra loro

Esempi:

>>> mag_tre(1,2,4)
4

>>> mag_tre(5,7,3)
7

>>> mag_tre(4,4,4)
4
Mostra soluzione
[37]:
# scrivi qui


prezzo_finale

✪✪ Il prezzo di copertina di un libro è € 24,95, ma una libreria ottiene il 40% di sconto. I costi di spedizione sono € 3 per la prima copia e 75 centesimi per ogni copia aggiuntiva. Quanto costano n copie? Scrivi una funzione prezzo_finale(n) che RITORNA il prezzo.

ATTENZIONE 1: Python per i numeri vuole il punto, NON la virgola !

ATTENZIONE 2: Se ordinassi zero libri, quanto dovrei pagare ?

SUGGERIMENTO: il 40% di 24,95 si può calcolare moltiplicando il prezzo per 0.40

>>> p = prezzo_finale(10)
>>> print(p)

159.45

>>> p = prezzo_finale(0)
>>> print(p)

0
Mostra soluzione
[38]:
def prezzo_finale(n):
    raise Exception('TODO IMPLEMENT ME !')

assert prezzo_finale(10) == 159.45
assert prezzo_finale(0) == 0

ora_arrivo

✪✪✪ Correndo a ritmo blando ci mettete 8 minuti e 15 secondi al miglio, e correndo a ritmo moderato ci impiegate 7 minuti e 12 secondi al miglio.

Scrivi una funzione ora_arrivo(n,m) che supponendo una partenza alle ore 6 e 52 minuti, date n miglia percorse con ritmo blando e m con ritmo moderato, STAMPA l’ora di arrivo.

  • SUGGERIMENTO 1: per calcare una divisione intera, usate //

  • SUGGERIMENTO 2: per calcolare il resto di una divisione intera, usate l’operatore modulo %

>>> ora_arrivo(2,2)
7:22
Mostra soluzione
[39]:
def ora_arrivo(n,m):
    raise Exception('TODO IMPLEMENT ME !')

assert ora_arrivo(0,0) == '6:52'
assert ora_arrivo(2,2) == '7:22'
assert ora_arrivo(2,5) == '7:44'
assert ora_arrivo(8,5) == '9:34'

Prosegui

Continua con le challenges