07 Funzioni
07 Funzioni
def is_even( i ):
"""
Input: i, a positive int
Returns True if i is even, otherwise False
"""
print("inside is_even")
return i%2 == 0
is_even(3)
3
Corpo della funzione
def is_even( i ):
"""
Input: i, a positive int
Returns True if i is even, otherwise False
"""
print("inside is_even")
return i%2 == 0
4
Scope
5
Visibilità (scope) di una variabile
§ formal parameter sono legati al valore di un actual parameter quando una funzione
viene invocata
§ Viene creato un nuovo scope/frame/environment quando si entra in una funzione
§ scope è il mapping tra i nomi e gli oggetti
def f( x ):
x = x + 1
print('in f(x): x =', x)
return x
x = 3
z = f( x )
6
Visibilità (scope) di una variabile
7
Visibilità (scope) di una variabile
8
Visibilità (scope) di una variabile
9
Visibilità (scope) di una variabile
10
Istruzione return e il tipo None
def is_even( i ):
"""
Input: i, a positive int
Does not return anything
"""
i%2 == 0
11
Funzioni come argomenti
12
Funzioni come argomenti
13
Funzioni come argomenti
14
Funzioni come argomenti
15
Esempio di scope
§Dentro una funzione, possiamo accedere ad una
variabile definita al di fuori della funzione
§ Dentro una funzione, non possiamo modificare una
variabile definita al di fuori della funzione – possiamo
usare variabili globali, ma non è una buona pratica
16
Esempio di scope
§Dentro una funzione, possiamo accedere ad una
variabile definita al di fuori della funzione
§ Dentro una funzione, non possiamo modificare auna
variabile definita al di fuori della funzione – possiamo
usare variabili globali, ma non è una buona pratica
17
Esempio complesso sullo scope
x = x + 1
print('g: x =', x) x 3
h()
return x z
x = 3
z = g(x)
18
Esempio complesso sullo scope
x = x + 1
print('g: x =', x) x h Some
3
code
h()
return x z
x = 3
z = g(x)
19
Esempo complesso sullo scope
x = x + 1
print('g: x =', x) x h Some
3
code
h()
return x z
x = 3
z = g(x)
20
Esempo complesso sullo scope
x = x + 1
print('g: x =', x) x h Some
3
code
h()
return x
z
returns None
x = 3
z = g(x)
21
Esempo complesso sullo scope
x = x + 1
print('g: x =', x) x h Some
3
code
h()
return x None
z
x = 3 returns 4
z = g(x)
22
Esempo complesso sullo scope
x = x + 1
print('g: x =', x) x 3
h()
return x z 4
x = 3
z = g(x)
23
La funzione main()
24
Esempio di main() \1
# Python program to demonstrate
# main() function
print("Hello")
# Defining main function
def main():
print("hey there")
§ Output
Hello
hey there
25
L’istruzione import
26
L’istruzione import
27
Esempio di main() \2
Output: Output:
File1 __name__ = __main__ File1 __name__ = File1
File1 is being run directly File1 is being imported
File2 __name__ = __main__
File2 is being run directly
28
Passaggio Parametri
Valore del parametron predefinito
my_function("Sweden")
my_function("India")
my_function()
my_function("Brazil")
30
Passaggio strutture dati come argomento
def my_function(food):
for x in food:
print(x)
fruits = ["apple", "banana", "cherry"]
my_function(fruits)
31
Simboli speciali come argomenti
32
*args
33
*args
def myFun(*args):
for arg in args:
print(arg)
34
**kwargs
35
**kwargs
def supporter(**kwargs):
for k, v in kwargs.items():
print(f"{k} tifa per la squadra {v}")
supporter(Alessio="Napoli")
36
**kwargs
37
*args e **kwargs
def somma_numeri(*args):
somma = 0
for numero in args:
somma += numero
return somma
39
Esempio *kwargs
def descrivi_persona(**kwargs):
for chiave, valore in kwargs.items():
print(f"{chiave}: {valore}")
40
Esempio *args e **kwargs
funzione_esempio(1, 2, 3, chiave1="valore1",
chiave2="valore2")
41
Decoratori
43
Definizione
44
Utilizzo
def funzione_decoratore(funzione_parametro):
def wrapper():
""" nome convenzionale - wrapper significa 'incarto, confezione' """
print("... codice da eseguire prima di 'funzione_parametro' ...")
funzione_parametro()
print("... codice da eseguire dopo di 'funzione_parametro' ...")
return wrapper
def mia_funzione():
print("Hello World!")
mia_funzione = funzione_decoratore(mia_funzione)
mia_funzione
# output:
... codice da eseguire prima di funzione_parametro ...
Hello World!
... codice da eseguire dopo di funzione_parametro ...
45
Utilizzo
@funzione_decoratore
def mia_funzione():
print("Hello World!")
mia_funzione()
# output:
... codice da eseguire prima di funzione_parametro ...
hello world!
... codice da eseguire dopo di funzione_parametro ...
46
Esempio
def mia_funzione():
print("Hello World!")
>>> print(mia_funzione.__name__)
# output
mia_funzione
47
Esempio
@funzione_decoratore
def mia_funzione():
print("Hello World!")
>>> print(mia_funzione.__name__)
# output
wrapper
48
Decoratore Wraps
§ Per ovviare al problema e salvaguardare queste informazioni (metadata), possiamo utilizzare un decoratore apposito
incluso con la standard library, il decoratore wraps, in questo modo:
from functools import wraps
def funzione_decoratore(funzione_parametro):
@wraps(funzione_parametro)
def wrapper():
""" nome convenzionale - wrapper significa 'incarto, confezione' """
print("... codice da eseguire prima di 'funzione_parametro' ...")
funzione_parametro()
print("... codice da eseguire dopo di 'funzione_parametro' ...")
return wrapper
@funzione_decoratore
def mia_funzione():
print("Hello World!")
>>> print(mia_funzione.__name__)
# output
mia_funzione
49
Esempio: Trasformare output funzioni
in lettere maiuscole
def caps_lock(funzione_parametro):
@wraps(funzione_parametro)
def wrapper():
""" wrapper significa 'incarto, confezione' """
return funzione_parametro().upper()
return wrapper
@caps_lock
def mia_funzione():
return "hello world!"
>>> print(mia_funzione())
50
Decoratori di funzioni con parametri
def caps_lock(funzione_parametro):
@wraps(funzione_parametro)
def wrapper(*args, **kwargs):
""" wrapper significa 'incarto, confezione' """
return funzione_parametro(*args, **kwargs).upper()
return wrapper
@caps_lock
def echo(msg):
return msg
51