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

9.6. scope des variables

>>> a = 1
>>> def foo():
...     a =2
...     return a
...

>>> foo()
2
>>> a
1

9.6.1. conventions de nommage

  • minuscules

  • attention aux mots-clés et builtins

  • underscore

  • ne pas débuter par un

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