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]:
'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^'