Introduction à python Fonctions ========= Comme dans les autres langages : réutiliser un block de code. Anatomie -------- :: >>> def add_5(n): ... ''' ... add 5 to a given number ... ''' ... result = n + 5 ... return result ... >>> add_5(10) 15 >>> add_5 Afficher l'aide (docstring) ``help(add_5)`` 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 "", line 1 SyntaxError: non-keyword arg after keyword arg 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* 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 []`` arguments positionnels (nb variable) ------------------------------------ :: >>> def aff(*args): ... for i in args: ... print i ... >>> aff (1, 2, 3, 'a', 'b') 1 2 3 a b 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 scope des variables ------------------- :: >>> a = 1 >>> def foo(): ... a =2 ... return a ... >>> foo() 2 >>> a 1 conventions de nommage ~~~~~~~~~~~~~~~~~~~~~~ - minuscules - attention aux mots-clés et builtins - underscore - ne pas débuter par un assigner des fonctions a des variables ====================================== :: >>> def aff(x): ... print x ... ... >>> a=aff >>> a(5) 5 retourner une fonction ====================== :: >>> aff >>> def get_aff(): ... return aff >>> get_aff() >>> get_aff()('Joe') Joe les fonctions sont des objets ============================= :: >>> dir(aff) ['__call__', '__class__', '__closure__',... fonctions imbriquées ==================== :: >>> def multiplier(): ... def multiply(a, b): ... return a * b ... return multiply >>> multiplier()(2, 5) 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 les closures ------------ :: >>> def add_x(x): ... def adder(n): ... return x + n ... return adder ... ... ... >>> add5 = add_x(5) >>> add5(10) 15 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): .... 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