UKOnline

Fonction prédéfinie

On a déjà pu rencontrer des fonctions prédéfinies à plusieurs reprises. Ces fonctions proviennent de deux sources différentes; ce sont :

  • soit des fonctions faisant partie intégrante du langage Python comme print, len et str, par exemple ;
  • soit des fonctions ayant été écrites par d'autres programmeurs et mises à disposition en important le module qui les contient, comme la fonction sqrt du module cmath, par exemple.

Fonction print

La fonction print permet d'afficher une donnée, peu importe son type. En réalité, la fonction affiche une représentation de la donnée sous forme d'une chaine de caractères. En plus, elle ajoute automatiquement un retour à la ligne, ainsi, deux appels successifs à la fonction print résulteront en l'affichage de deux lignes.

La forme générale de la fonction print permet d'afficher un nombre quelconque de valeurs, que l'on doit séparer par des virgules. Par défaut, les différentes valeurs seront séparées par une espace (lorsqu'il désigne le caractère d'espacement blanc, le nom espace est féminin).

L'exemple suivant affiche la phrase «Né en 1961 j'ai 55 ans.» :

Remarquez l'alternance entre guillemets simples et doubles pour délimiter les chaines de caractères, contrainte par le fait que la deuxième chaine de caractères contient un guillemet simple. On aurait également pu utiliser des guillemets doubles partout, évidemment.

Par défaut, la fonction print ajoute donc un retour à la ligne après ce qu'elle doit afficher, et elle sépare les différentes valeurs à afficher avec une espace. On peut changer cette configuration par défaut à l'aide des paramètres nommés end et sep. Avec ces derniers, on peut spécifier les chaines de caractères à afficher respectivement après le contenu et entre les valeurs.

L'exemple suivant modifie ces deux valeurs par défaut :

Le premier appel à la fonction print va donc afficher la chaine de caractères «Né le :» et terminera par une espace, au lieu d'un retour à la ligne. Le second appel affichera la valeur des trois variables, mais en les séparant par le caractère / au lieu d'une espace :

Né le : 4/8/1961

On peut évidemment spécifier les deux paramètres nommés end et sep dans le même appel à la fonction print.

Sortie formatée

Au lieu de fournir plusieurs valeurs à la fonction print, on aurait également pu construire la chaine de caractères en utilisant la concaténation. Rappelez-vous néanmoins qu'il faudra convertir toutes les valeurs concaténées en chaines de caractères pour que cela fonctionne. L'exemple précédent peut se réécrire comme suit :

En fait, on veut construire une chaine de caractères dans laquelle on incruste, à des endroits précis, les valeurs de variables. Python propose des facilités pour formater une chaine de caractères. Voyons d'abord comment réécrire l'exemple précédent avant de comprendre dans le détail le fonctionnement du formatage d'une chaine de caractères :

On commence donc par construire la chaine de caractères, dans laquelle on place des balises représentées par {}. Il s'agit d'endroits dans la chaine de caractères qui seront remplacés par des valeurs. Après la chaine de caractères, on va devoir indiquer les valeurs à incruster à l'aide de format. Le tout produira une chaine de caractères qui sera affichée par print. Notez qu'on peut également construire une chaine de caractères ainsi, sans nécessairement vouloir l'afficher. De plus, on n'est pas limité à l'incrustation de valeurs de variables, mais on peut insérer n'importe quelle expression. On peut donc, par exemple, écrire :

La figure 7 résume cette construction d'une chaine de caractères formatée. Il suffit (1) de placer des balises dans une chaine de caractères et (2) de fournir autant d'expressions que nécessaire à format afin de les remplacer par les valeurs de ces expressions.

Sortie formatée
On peut construire une chaine de caractères en y incrustant des valeurs à la place de balises en utilisant format.

Fonction input

Alors que la fonction print permet à un programme de produire une sortie, on va pouvoir lire une entrée grâce à la fonction input. Cette fonction, une fois appelée, arrête l'exécution du programme et attend que l'utilisateur saisisse un texte. Ce dernier est ensuite rapatrié et peut, par exemple, être stocké dans une variable. Voici un programme qui vous demande votre nom, puis vous souhaite la bienvenue :

L'exécution de ce programme pourrait, par exemple, produire le résultat suivant, sachant que le mot «Sébastien» a été saisi par l'utilisateur :

Quel est ton prénom ? Sébastien
Bonjour Sébastien et bienvenue !

La fonction input renvoie toujours le texte saisi par l'utilisateur sous forme d'une chaine de caractères. Il faudra donc éventuellement prévoir une conversion, si vous voulez que l'utilisateur saisisse autre chose, comme un nombre entier, par exemple.

La suite du programme d'exemple demande à l'utilisateur quelle est son année de naissance, puis calcule et affiche son âge :

Par contre, si l'utilisateur ne saisit pas un nombre, une erreur se produira lors de l'exécution comme on peut le voir ci-dessous, où l'utilisateur a saisi le texte «deux-mille» :

Quel est ton année de naissance ? deux-mille
Traceback (most recent call last):
  File "program.py", line 4, in <module>
    birthyear = int(s)
ValueError: invalid literal for int() with base 10: 'deux-mille'

On verra plus loin dans le livre comment gérer ce type d'erreur et pouvoir, par exemple, afficher un message à l'utilisateur.

Importation de fonction

Les deux fonctions que l'on vient de voir font partie intégrante du langage. On s'intéresse maintenant aux fonctions mathématiques qui sont essentiellement rassemblées dans les modules math et cmath, le deuxième étant spécialisé pour les nombres complexes.

Pour utiliser des fonctions faisant partie d'un module, il faut avant tout les importer. Comme on a déjà pu le voir, on utilise pour cela l'instruction from/import à qui on indique le nom du module après le from et la liste des fonctions à importer après le import.

Voici un exemple qui utilise les fonctions sqrt (racine carrée) et sin (sinus) faisant partie du module math :

Parfois, il est plus facile d'importer tout le contenu d'un module plutôt que de lister toutes les fonctions dont on a besoin. Pour cela, on utilise un astérisque (*) au lieu de la liste de fonctions. Pour importer toutes les fonctions du module math, il suffit donc d'écrire :

De manière générale, on essaie d'éviter autant que possible de brutalement tout importer, afin d'éviter d'éventuels conflits. Prenons pour cela un exemple qui utilise les deux modules math et cmath :

Les deux modules contiennent une fonction sqrt. Dès lors, laquelle sera utilisée à la troisième instruction ? Python va simplement prendre celle du dernier module importé, c'est-à-dire celle du module math. Par conséquent, une erreur d'exécution se produira puisqu'il faut la version complexe pour calculer la racine carrée de $-4$ :

Traceback (most recent call last):
  File "program.py", line 4, in <module>
    print('Racine carrée de -4 =', sqrt(-4))
ValueError: math domain error

Pour résoudre ce problème, Python permet de juste importer un module avec l'instruction import suivie du nom du module à importer. Ensuite, lorsqu'on voudra utiliser une fonction du module, il faudra faire précéder son nom de celui du module et de l'opérateur d'accès (.) :

Il est maintenant explicite que la fonction sqrt appelée est celle provenant du module cmath, et il n'y aura donc plus d'erreurs d'exécution.