28. Variables et fonctions

Les variables, que nous avons vues dans la leçon précédente, sont particulièrement utiles dans les définitions de fonctions. Vous vous rappelez de notre fonction print2 ?

>>> def print2():
... print 2
...
>>> print2()
2

Nous pouvons la rendre plus générale comme ceci :

>>> def print_nombre(n):
... print n
...
>>> print_nombre(2)
2
>>> print_nombre(78)
78

En écrivant une variable en tant que paramètre (ou argument) entre les deux parenthèses quand nous définisssons la fonction, nous disons à Python que, quelle que soit la valeur que nous utilisons quand nous appelons la fonction elle doit être affectée à la variable (n dans ce cas).


Combiner nombres et chaînes

Supposons que nous voulions afficher à la fois des nombres et des chaînes de caractères, c'est-à-dire que nous voulions que la sortie de la fonction print_nombre() soit quelque chose comme :

Le nombre que vous avez choisi est 2.

Il y a plusieurs façons de le faire comme vous le verrez plus tard. Voici une manière qui n'est pas évidente, mais qui est très utile à connaître.

>>> def print_nombre(n):
.... print "Le nombre que vous avez choisi est %s." % n
....
>>> print_nombre(3)
Le nombre que vous avez choisi est 3.

Python remplace la combinaison %s qui est dans la chaîne de caractère par la valeur de la variable qui suit le % après la chaîne. Essayez le vous même, et continuez à lire.


Passons à de plus grandes choses

Revenons à notre fonction plus_grand() et rendons la plus générale. Voici comment nous pouvons le faire :

>>> def plus_grand(premier, second):
... if premier > second:
... print "%s est plus grand que %s" % (premier, second)
... else:
... print "%s est plus grand que %s" % (second, premier)
...
>>> plus_grand(5, 4)
5 est plus grand que 4
>>> plus_grand(0, 10)
10 est plus grand que 0

Notez que nous devons mettre des parenthèses () autour des deux variables qui suivent  le signe pour-cent % pour que Python sache que nous voulons qu'elles remplacent les deux %s qui sont dans la chaîne de caractères.

Essayez !

Remarque : Vous avez essayé et testé la fonction avec plusieurs valeurs ? Vous avez dû remarqué que votre programme avait un petit défaut, non ? Quand vous programmez, attention aux cas particuliers :

>>> plus_grand(10, 10)
10 est plus grand que 10

Vous voyez ce que je veux dire maintenant ? J'ai fait exprès d'oublier le cas où les deux nombres sont égaux pour simplifier, mais maintenant, c'est à vous de corriger cet oubli. Vous pourrez utiliser le mot-clé elif pour cela (vous ne l'avez pas oublié, j'espère ? sinon revenez en arrière de quelques leçons). Vous verrez la solution dans la suite mais comme d'habitude, essayez d'abord !


Passons à des choses encore plus grandes

Nous venons de voir comment, en utilisant des variables, nous pouvons rendre notre fonction plus_grand() plus générale qu'avant, quand elle pouvait seulement comparer les deux mêmes valeurs. Maintenant, telle qu'elle est écrite, elle a toujours besoin de deux paramètres : les deux nombres à comparer. Supposons que nous voulions que Python décide si certains nombres sont plus grands que la valeur particulière 0 (zéro). Nous pourrions écrire une autre fonction pour le faire... ou nous pourrions modifier légèrement notre fonction existante comme suit :

>>> def plus_grand(premier, second=0):
... if premier > second:
... print "%s est plus grand que %s" % (premier, second)
... elif premier < second:
... print "%s est plus grand que %s" % (second, premier)
... else:
... print "%s est égal à lui-même !" % premier
...
>>> plus_grand(5, 4)
5 est plus grand que 4
>>> plus_grand(1, 10)
10 est plus grand que 1
plus_grand(5)
>>> 5 est plus grand que 0
plus_grand(-2)
>>> 0 est plus grand que -2

En écrivant "second=0" entre les parenthèses dans la définition de la fonction, nous demandons à Python d'utiliser cette valeur pour la deuxième variable si nous appelons la fonction avec seulement un paramètre. Quand nous donnons une valeur par défaut comme cela à un paramètre, nous appelons cela un paramètre nommé.

Les paramètres nommés (il peut y en avoir plus d'un) doivent toujours apparaître après les paramètres non nommés. Par conséquent, les définitions suivantes [seule la première ligne est montrée ci-dessous] seraient permises :

>>> def quatre_parametres(a, b, c, d=33):
>>> def quatre_parametres(a, b, c=7, d=2):
>>> def quatre_parametres(a, b=1, c=3, d=56):
>>> def quatre_parametres(a=4, b=1, c=3, d=0):

mais les définitions suivantes ne seraient pas autorisées :

>>> def quatre_parametres(a=1, b, c, d=33):
>>> def quatre_parametres(a, b=2, c=3, d):
>>> def quatre_parametres(a=5, b=1, c=3, d):

Essayez les tout en écrivant vos propres définitions de fonctions.


Dernière mise en garde

Python ne vous permet pas d'utiliser l'un de ses mots-clés comme une variable. Essayez ce qui suit :

>>> def = 2

et voyez ce que vous obtenez !

précédentVariables. - début - Quel est votre nom ?suivant