Le retour des fonctions

Retourner plusieurs valeurs

[1]:
def compte_sur_une_main():
    return 1, 2, 3, 4, 5

result = compte_sur_une_main()

type(result), result
[1]:
(tuple, (1, 2, 3, 4, 5))
[2]:
# on peut utiliser l'unpacking pour nommer directement les résultats

def double_triple(x):
    return 2 * x, 3 * x

a = 'lo'

double_a, triple_a = double_triple(a)

print(double_a)
print(triple_a)
lolo
lololo

Nommer les arguments

[3]:
# Les noms des arguments font partie de l'interface d'une fonction

def divise(numerateur, denominateur):
    "calcul la division de numerateur par denominateur"
    return numerateur / denominateur

help(divise)
Help on function divise in module __main__:

divise(numerateur, denominateur)
    calcul la division de numerateur par denominateur

[4]:
divise(10, 2)
[4]:
5.0
[5]:
divise(numerateur=10, denominateur=2)
[5]:
5.0
[6]:
divise(denominateur=2, numerateur=10)
[6]:
5.0

Arguments avec une valeur par défaut

[7]:
def indente(texte, indentation='    '):
    return indentation + texte

print('toto')
print(indente('toto'))
print(indente('toto', '- - '))
print(indente('toto', indentation='~~~~'))
toto
    toto
- - toto
~~~~toto

Nombre d’arguments variables

[8]:
# En pratique

def somme(*args):
    "calcule la somme de tous les arguments"
    result = 0
    for valeur in args:
        result += valeur
    return result
[9]:
somme(2, 2)
[9]:
4
[10]:
somme(2, 5, 78)
[10]:
85
[11]:
# `args` est un tuple

def test(*args):
    print(type(args), args)

test(2, 2)
test(2, 5, 78)
<class 'tuple'> (2, 2)
<class 'tuple'> (2, 5, 78)

Utiliser un list/tuple pour passer les arguments d’une fonction

[12]:
# une fonction avec plusieurs arguments

def affiche_abc(a, b, c):
    print('voici a :', a)
    print('voici b :', b)
    print('voici c :', c)
[13]:
# 'arguments' contient mes arguments

arguments = ['^ ^', ' o ', '\_/']
[14]:
# si l'on sait comme ici que 'affiche_abc()' prend 3 arguments
# on peut faire ainsi

affiche_abc(arguments[0], arguments[1], arguments[2])
voici a : ^ ^
voici b :  o
voici c : \_/
[15]:
# voici une solution plus courte et robuste

affiche_abc(*arguments)
voici a : ^ ^
voici b :  o
voici c : \_/

Nombre d’arguments “mot-clef” variables

[16]:
# `kwargs` est un dict

def test(**kwargs):
    print(type(kwargs), kwargs)

test(a=2, b=2)
test(toto=2, tata=5, titi=78)
<class 'dict'> {'a': 2, 'b': 2}
<class 'dict'> {'toto': 2, 'tata': 5, 'titi': 78}

Utiliser un dict pour passer les arguments d’une fonction

[17]:
# gardons notre fonction avec plusieurs arguments

def affiche_abc(a, b, c):
    print('voici a :', a)
    print('voici b :', b)
    print('voici c :', c)
[18]:
# cette fois, nos arguments sont stockés dans un dict

keyword_arguments = {
'a' : "* *",
'b' : " ' ",
'c' : " ~ ",
}
[19]:
# si on connait bien les mots-clefs

affiche_abc(a=keyword_arguments['a'], b=keyword_arguments['b'], c=keyword_arguments['c'])
voici a : * *
voici b :  '
voici c :  ~
[20]:
# si on connait la bonne formule

affiche_abc(**keyword_arguments)
voici a : * *
voici b :  '
voici c :  ~

fonction anonyme : lambda

  • Pour définir rapidement une fonction simple.

  • Le traitement des arguments est le même que pour les fonctions.

  • Mais le corps est réduit à une instruction dont le résultat est la valeur retournée.

[21]:
double = lambda x: 2 * x

type(double)
[21]:
function
[22]:
double(3)
[22]:
6
[23]:
double('to')
[23]:
'toto'
[24]:
# Situation la plus courante d'utilisation de lambda:
# définir une fonction sans la nommer

def applique_sur_42(fonction):
    "renvoie fonction(42)"
    return fonction(42)
[25]:
applique_sur_42(lambda x: x / 7)
[25]:
6.0
[26]:
applique_sur_42(lambda x: x * '^')
[26]:
'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^'

Exercices