Introduction à python
9. Fonctions¶
Comme dans les autres langages : réutiliser un block de code.
9.1. Anatomie¶
>>> def add_5(n):
... '''
... add 5 to a given number
... '''
... result = n + 5
... return result
...
>>> add_5(10)
15
>>> add_5
<function add_5 at 0x102ff0410>
Afficher l’aide (docstring) help(add_5)
9.2. Paramètres multiples¶
>>> def multiply(x, y):
... return x * y
...
Appel par argument positionnels (args)
>>> multiply(12, 4)
48
ou par keywords (kwargs)
>>> multiply(x=3, y=9)
27
>>> multiply(y=9, x=3)
27
argument et keyword
>>> multiply(3, y=9)
27
mais les args avant kwargs
>>> multiply(x=3, 9)
File "<stdin>", line 1
SyntaxError: non-keyword arg after keyword arg
9.3. Paramètres par defaut¶
>>> def multiply(x, y=2):
... return x * y
...
>>> multiply(12)
24
Tip:Déclarer param avec défaut après les paramètres sans défaut
9.3.1. Attention avec les mutables en défaut¶
>>> def to_list(value, l=[]):# danger
... l.append(value)
... return l
...
>>> to_list(2)
[2]
>>> to_list(9)
[2, 9]
Correct
>>> def to_list(value, l=None):# bon
... if l is None:
... l = []
... l.append(value)
... return l
...
>>> to_list(2)
[2]
>>> to_list(9)
[9]
Idiomatique: l = l or []
9.4. arguments positionnels (nb variable)¶
>>> def aff(*args):
... for i in args:
... print i
...
>>> aff (1, 2, 3, 'a', 'b')
1
2
3
a
b
9.5. keyword arguments (nb variable)¶
>>> def aff(**kwargs):
... for kw in kwargs:
... print ("%s:%s "% (kw, kwargs[kw]))
...
>>> aff (a=1, b=2, foo='bar', l=['x', 'y', 'z'])
a:1
b:2
foo:bar
10. assigner des fonctions a des variables¶
>>> def aff(x):
... print x
...
...
>>> a=aff
>>> a(5)
5
11. retourner une fonction¶
>>> aff
<function aff at 0x105405d70>
>>> def get_aff():
... return aff
>>> get_aff()
<function aff at 0x105405d70>
>>> get_aff()('Joe')
Joe
12. les fonctions sont des objets¶
>>> dir(aff)
['__call__', '__class__', '__closure__',...
13. fonctions imbriquées¶
>>> def multiplier():
... def multiply(a, b):
... return a * b
... return multiply
>>> multiplier()(2, 5)
14. unpacking de kw¶
>>> def rectangle_perimeter(h, w):
... return 2 * (w+h)
...
...
>>> rectangle_perimeter(w=10, h=3)
26
>>> dimensions = {'w' : 10, 'h': 3}
>>> rectangle_perimeter(**dimensions)
26
14.1. les closures¶
>>> def add_x(x):
... def adder(n):
... return x + n
... return adder
...
...
...
>>> add5 = add_x(5)
>>> add5(10)
15
14.2. les decorators¶
Permet d’emballer une fonction et de modifier ce qui y rentre et ce qui en sort
ex sous django protéger une vue:
@login_required
def entry_view(request):
....
14.3. ecriture¶
>>> def limit(func):
... def wrapper(*args, **kwargs):
... result = func(*args, **kwargs)
... return result[:5]
... return wrapper
>>> @limit
... def hello():
... return ('hello world')
>>> hello()
'hello'
Licence: CC-BY Providenz