À quoi a-t-on accès lorsqu’on utilise un langage de programmation ?
Un langage de programmation doit :
- fournir des objets (ou types) primitifs ;
- posséder une bibliothèque de fonctions prédéfinies ;
- permettre la manipulation des objets primitifs et des fonctions prédéfinies ;
- établir des règles qui permettent de construire de nouveaux objets (ou types) ou de nouvelles fonctions par combinaison des types primitifs et des fonctions prédéfinies.
Nous allons aborder chacun de ces points.
Quelques objets primitifs en Python
Le langage Python possède un grand nombre d’objets primitifs. Parmi eux, on utilisera lors des premiers chapitres :
- Les constantes entières (« Integer »,
int
)
|
|
- Les constantes « flottantes » (type
float
). Il s’agit d’une approximations des nombres non entiers1.
|
|
- Les valeurs booléennes (type
bool
)True
etFalse
.
|
|
- Les chaînes de caractères (« String », type
str
).
|
|
Syntaxe et évaluation d’une expression en Python
Ambigüité de l’écriture traditionnelle des expressions
En mathématique on écrit l’expression qui permet de calculer la valeur du polynôme du second degrés, pour toute valeur de la variable $x$ : $3 x^2 + 2 x + 4$. En programmation, peut-on se contenter d’utiliser la syntaxe des mathématiques ?
Si on se penche un peu plus attentivement sur l’écriture du polynôme, on remarque :
-
qu’il faut savoir que $2 x$ signifie la multiplication du nombre 2 par $x$ ;
-
que pour $3 x^2$ il faut d’abord élever $x$ à la puissance 2 avant de multiplier le résultat par 3 ;
-
que $2 x + 4$ n’est pas 2 multiplié par le résultat du calcul de $x + 4$ ;
-
que cette écriture est une écriture à deux dimensions (élévation à la puissance 2 est indiquée en augmentant l’espace depuis la ligne de base).
De même, en mathématique, on écrit :
-
$a + b$ : l’opérateur $+$ est entre les deux opérandes ;
-
$\sin (x)$ : la fonction est placée avant son argument ;
-
$f’$ pour indiquer la fonction dérivée de la fonction $f$ (le symbole de la dérivée est placé après le nom de la fonction).
En conclusion, l’écriture mathématique traditionnelle nous parait claire car on l’utilise depuis les plus petites classes et parce qu’on a appris des règles telles que celles de la priorité des opérateurs. En informatique, la syntaxe devra être plus rigoureuse, moins ambiguë car la machine effectuera une vérification pointilleuse de tout ce qui sera écrit.
L’écriture la plus rigoureuse du polynôme est : $\left( \left( 3 \times \left( x^2 \right) \right) + \left( \left( 2 \times x \right) + 4 \right) \right)$, heureusement le langage Python a intégré la règle de priorité des opérateurs et on pourra écrire : 3 * x** 2 + 2 * x + 4
.
Remarque : Les expressions en informatique ne se limitent bien évidemment pas au domaine des mathématiques.
Opérateurs arithmétiques en Python
Les opérateurs en Python se répartissent en trois catégories :
-
les opérateurs arithmétiques, utilisés pour calculer des expressions ;
-
les opérateurs de comparaison et les opérateurs logiques, utilisés dans l’alternative ;
-
les opérateurs d’affectation, utilisés pour modifier la « valeur » d’une variable.
Dans ce chapitre nous allons nous contenter d’utiliser les opérateurs arithmétiques.
Opérateur | Expression | Description |
---|---|---|
+ |
op1 + op2 |
renvoie le résultat de l’addition de op1 et op2 |
- |
op1 - op2 |
renvoie le résultat de la soustraction de op1 et op2 |
- |
-op |
renvoie la valeur opposée de op |
* |
op1 * op2 |
renvoie le résultat de la multiplication de op1 et op2 |
/ |
op1 / op2 |
renvoie le résultat de la division de op1 et op2 |
// |
op1 // op2 |
renvoie le résultat de la division euclidienne (le quotient donc) de op1 et op2 |
% |
op1 % op2 |
renvoie le reste de la division euclidienne de op1 et op2 |
** |
op**exp |
renvoie le résultat de op à la puissance exp |
-
Le résultat de la division de deux nombres est toujours un
float
, même s’il s’agit de la division de deux nombres entiers. -
Le résultat de la division euclidienne de deux nombres est un
float
si l’un des nombres est unfloat
, unint
si les deux nombres sont des entiers.
Exercice 1.
Utiliser l’éditeur de texte Thonny pour visualiser toutes les étapes de l’évaluation de l’expression $2 \times (3 + 4, 3)^3 + 5 \times 6^2$.
Solution 1
-
Écrire dans la fenêtre principale :
2 * (3 + 4.3)**3 + 5 * 6**2
. -
Lancer la commande : Run $\rightarrow$ Debug current script (touches Ctrl + F5). Un rectangle jaune doit apparaître à l’écran. Il indique la partie de l’expression que Python va évaluer au « pas » suivant.
-
Progresser pas à pas grâce à la commande Run $\rightarrow$ Step into (touche F7) en notant à chaque fois ce qui est évalué et le résultat de l’évaluation.
Application d’une fonction
Schéma-bloc d’une fonction
Par exemple, le schéma-bloc de la fonction « mise au carré » est le suivant :
Ce schéma indique que la fonction attend un argument (le nombre 2), effectue un traitement (élévation à la puissance 2) et retourne une valeur (le nombre 4).
Fonctions intégrées du langage Python
Le langage Python possède de nombreuses fonctions prédéfinies. Les fonctions intégrées dir
et help
permettent de les découvrir.
|
|
L’exemple ci-dessus pourrait laisser penser que le nombre de fonctions n’est pas aussi grand qu’annoncé. Elles sont en fait organisées au sein de modules : math
, random
, time
qu’il faut importer au préalable pour pouvoir les utiliser.
|
|
Remarque : On constate que pour utiliser une fonction contenue dans le module de nom module
, on doit utiliser la syntaxe module.nom_de_la_fonction
.
dir
et help
sont très importantes. Il faut apprendre à les utiliser le plus rapidement possible.
Syntaxe de l’application d’une fonction
L’appel (ou l’application) d’une fonction obéit à une syntaxe bien particulière, semblable à celle utilisée en math. Par exemple, l’appel de la fonction abs
avec l’argument -3
s’écrit abs(-3)
.
f
, le nom de la fonction, avec f(x)
, l’appel (ou application) de la fonction.
Évaluation de l’argument d’une fonction
Il n’est pas nécessaire de fournir une constante comme argument à une fonction, on peut lui fournir une expression comme argument. Par exemple l’appel suivant abs(3 + 4 / 2 + 7 // 3)
est tout à fait valide.
L’interpréteur Python procède ainsi :
- Évaluation de l’expression
3 + 4 / 2 + 7 // 3
. Le résultat est le nombre 7.0 ; - Appel de la fonction
abs
avec comme argument le nombre 7.0.
Définition d’une fonction
Malgré leur grand nombre, les fonctions prédéfinies du langage peuvent ne pas être suffisantes. Il faut alors définir soi-même une nouvelle fonction.
Type et signature d’une fonction
En mathématique, on définie la fonction $f$ qui calcule le carré d’un nombre réel de la sorte :
$$ \begin{array}{l|rcl} f: & \mathbb{R} & \longrightarrow & \mathbb{R} \cr & x & \longmapsto & f(x) \cr \end{array} $$
En informatique, on s’appuie sur cette écriture, en la précisant un peu, on dit que la fonction possède un nom, un type et une signature.
- Le type d’une fonction est constitué par les types de ses paramètres et par le type de la valeur qu’elle retourne.
- La signature d’une fonction est l’association du nom de cette fonction et de son type.
La connaissance de la signature d’une fonction est fondamentale, ce n’est pas parce qu’une fonction se nomme sum
qu’elle est capable de faire la somme de deux nombres (cf. exercice 2 plus bas) ! Le type de la fonction indique quels sont les types des arguments qu’elle accepte et donne une première (mais insuffisante !) indication sur la façon de l’utiliser.
Remarque : En informatique, on aura très souvent à utiliser des fonctions plus complexes que celle présentée ici, en particulier, des fonctions à plusieurs paramètres. Sans explication supplémentaire, il vous faudra admettre qu’une fonction nommée surface
qui calcule la surface d’un rectangle de côtés $a$ et $b$ a pour définition
$$ \begin{array}{l|rcl} \text{surface} : & \Bbb{R} \times \Bbb{R} \longrightarrow \Bbb{R}\cr & (a, b) \longmapsto a \times b \end{array} $$
Définition d’une fonction en Python
La syntaxe utilisée pour définir une fonction en Python est assez proche de celle des mathématiques :
|
|
On reconnaît tout de suite la signature de la fonction def f(x: float) -> float
qui indique bien que la fonction possède un paramètre x
de type float
et retourne une valeur de type float
. Chaque paramètre peut donc être accompagné de son type !
- Les deux points
:
à la fin de la ligne servent à indiquer que le bloc d’instructions qui suit la signature constitue le corps de la fonction, c’est à dire l’ensemble des étapes qui sont réalisées lorsqu’on appelle la fonction.
- L’instruction
return
indique à la fonction de retourner la valeur qu’elle vient de calculer.
La définition de la fonction surface
définie plus haut est la suivante :
|
|
: float
, qui sert à indiquer le type de l’argument attendu et -> float
, qui permet d’indiquer le type de la valeur retournée par la fonction, sont des annotations.L’interpréteur Python ne les prend pas en compte, leur présence est utile aux programmeurs et simplifie la lecture du code.
Spécification d’une fonction
L’utilisation d’une fonction nécessite la description précise :
-
des conditions dans lesquelles elle peut être utilisée : c’est le rôle de la signature.
-
de la valeur qu’elle retourne : c’est le rôle de la documentation.
Il est donc indispensable d’établir un contrat entre le concepteur de la fonction et son utilisateur.
Remarque : Une spécification ne s’intéresse pas au « comment » !
L’utilisateur d’une fonction n’a pas besoin de connaître en détail toutes les étapes du traitement du problème par la fonction, il doit juste savoir quelle valeur elle retourne et comment il faut l’utiliser.
Exemple : Spécification d’une fonction qui élève au carré :
|
|
En fait, la spécification est la seule contrainte qu’est tenu de respecter le concepteur d’une fonction. Il faut donc être capable de faire la distinction entre toutes les spécifications suivantes :
- Le programmeur ne s’occupe pas vraiment des conditions d’utilisation de la fonction. Il présuppose que tous les utilisateurs penseront à vérifier que l’argument est bien positif lors de l’appel de la fonction.
Dans ce cas de figure, l’utilisateur doit faire l’effort de bien comprendre le fonctionnement de la fonction.
|
|
- Le programmeur avertit l’utilisateur qu’il existe une bonne utilisation de la fonction (l’argument doit être positif ou nul) mais n’empêche pas l’utilisateur d’appeler la fonction avec un mauvais argument.
Ici aussi, il incombe à l’utilisateur de bien utiliser la fonction.
|
|
- Le programmeur prend en charge la bonne utilisation de la fonction.
|
|
Exercices du chapitre
Exercice 2. Découverte de fonctions
Les deux fonctions intégrées dir
et help
sont fondamentales. Les utiliser dans la console du logiciel Thonny afin de répondre aux questions ci-dessous.
- La fonction
sum
intégrée au langage calcule-t-elle la somme de deux nombres ? - Que réalisent les fonctions intégrées
int
,float
,str
,bool
? - Quel traitement réalise la fonction
pow
du modulemath
? Quel opérateur étudié dans ce chapitre réalise la même opération ? Donner un exemple d’utilisation de la fonctionpow
. - Rechercher comment se nomme la fonction du module
math
qui calcule la racine carrée d’un nombre passé en argument.
Solution 2.
- Pour afficher la spécification d’une fonction utiliser la fonction
help
|
|
D’après la documentation, la fonction sum
attend une séquence de nombres et non pas deux nombres.
- La fonction
int
convertit n’importe quel nombre ou une chaîne de caractères en nombre entier (si possible).
|
|
De même les fonctions float
, str
et bool
convertissent, si possible, un nombre, une chaîne de caractères en approximation des nombres réels, chaîne de caractères, nombre booléen.
- L’application de la fonction
pow
à deux nombres $x$ et $y$ donne le nombre $x^y$.
|
|
- Pour rechercher une fonction appartenant au module
math
:- Importer le module
math
; - Lister, avec la fonction
dir
, toutes les fonctions de ce module et rechercher celle qui semble réaliser l’opération souhaitée ; - Utiliser la fonction
help
pour confirmer le choix.
- Importer le module
|
|
Exercice 3. Utilisation d’une fonction
Utiliser la console du logiciel Thonny pour répondre aux questions suivantes :
-
Peut-on appeler la fonction
randint
du modulerandom
sans argument ?
Rappel : La fonction intégréehelp
permet d’obtenir la documentation de n’importe quelle fonction. -
Que retourne l’appel de la fonction
randint
du modulerandom
? -
Appeler cette fonction
randint
de façon à obtenir un nombre entier aléatoire compris entre 1 et 10. -
Est-il possible que l’appel précédent retourne 1 ou 10 ?
Solution 3.
|
|
-
La documentation nous apprend que la fonction attend deux arguments.
-
La fonction retourne un entier compris entre les deux bornes passées en argument.
-
>>> random.randint(1, 10)
permet d’obtenir un nombre entier aléatoire entre 1 et 10 inclus. -
La fonction retourne un entier compris entre 1 et 10 inclus.
Exercice 4. Définition d’une fonction
- La fonction définie ci-dessous est-elle syntaxiquement correcte ?
|
|
- La spécification est la suivante :
|
|
La fonction telle qu'elle est définie à la question 1 correspond-elle à cette spécification ?
- Corriger le corps de la fonction
retire_un
de façon à ce que le calcul effectué corresponde à ce qu’annonce la spécification.
Solution 4.
-
Du point de vue syntaxique la fonction est correcte.
-
La fonction telle qu’elle est définie retourne la valeur de $1 - n$ et ne correspond donc pas à la spécification.
|
|
Exercice 5. Calcul de fonctions polynomiales
- Définir et tester une fonction écrite en Python, nommée
polynomiale
, telle quepolynomiale(a, b, c, d, x)
retourne la valeur de la fonction qui à $x$ associe $a x^3 + b x^2 + c x + d$.
La documentation complète de cette fonction est la suivante :
|
|
- Définir et tester une fonction écrite en Python, nommée
polynomiale_carre
qui retourne la valeur de la fonction $a x^4 + b x^2 + c$.
La documentation complète de cette fonction est la suivante :
|
|
Solution 5.
|
|
Exercice 6. Calcul de la moyenne de trois nombres
- Définir et tester la fonction nommée
somme
, écrite en Python, dont la spécification est :
|
|
- Définir et tester une fonction écrite en Python, nommée
moyenne
, qui détermine la moyenne arithmétique de trois nombres.
Remarque : La fonctionmoyenne
doit utiliser la fonctionsomme
définie à la questions précédente pour effectuer son traitement.
La spécification de la fonction est la suivante :
|
|
- Définir et tester une fonction écrite en Python, nommée
moyenne_ponderee
, qui détermine la moyenne pondérée de trois nombres avec des coefficients variables. Les paramètres devront être écrits dans l’ordre suivant : d’abord les trois nombres, puis les trois coefficients.
Remarque : La fonctionmoyenne_ponderee
doit effectuer deux appels à la fonctionsomme
pour effectuer son traitement.
La spécification de la fonction est la suivante :
|
|
Solution 6.
|
|
Exercice 7. Calculs de surfaces et de volumes
-
Définir et tester une fonction écrite en Python, nommée
surface_rectangle
, qui détermine la surface d’un rectangle de longueur $a$ et de largeur $b$.
Préciser la spécification de la fonction. -
Définir et tester une fonction écrite en Python, nommée
volume_parallelepipede
, qui détermine le volume d’un parallélépipède rectangle de longueur $a$, de largeur $b$ et de hauteur $h$.
Préciser la spécification de la fonction.
Cette fonction devra utiliser la fonctionsurface_rectangle
pour effectuer son traitement son traitement. -
Définir et tester une fonction écrite en Python, nommée
surface_disque
, qui détermine la surface d’un disque de rayon $r$.
Rappel : Le modulemath
possède une variablepi
.
Préciser la spécification de la fonction. -
Définir et tester une fonction écrite en Python, nommée
surface_couronne
, qui détermine la surface d’une couronne de rayon intérieur $r_1$ et de rayon extérieur $r_2$.
Préciser la spécification de la fonction.
Cette fonction devra utiliser la fonctionsurface_disque
pour effectuer son traitement. -
Définir et tester une fonction écrite en Python, nommée
volume_tube
, qui détermine le volume de la partie pleine d’un tube de longueur $l$, dont la section est une couronne de rayon intérieur $r_1$ et de rayon extérieur $r_2$.
Préciser la spécification de la fonction.
Cette fonction devra utiliser la fonctionsurface_couronne
pour effectuer son traitement.
Solution 7.
|
|
Exercice 8. Calcul d’une distance
Définir et tester une fonction écrite en Python, nommée distance
qui détermine la distance séparant deux points de coordonnées $(x_1, y_1)$ et $(x_2, y_2)$ d’un plan.
La documentation complète de la fonction est la suivante :
|
|
Solution 8.
|
|
Exercice 9. Reprise de l’exercice 1 (difficile )
L’objectif de cet exercice est de retrouver une partie du comportement de la fonction randint
du module random
à partir de la fonction random
de ce même module.
Définir et tester une fonction écrite en Python, nommée tirage_entier
, telle que tirage_entier(a)
retourne un nombre entier compris entre 1 et $a$ (inclus), au hasard. La fonction tirage_entier
doit utiliser la fonction random
du module random
.
Remarque : Lire attentivement la documentation de la fonction random
afin de comprendre ce qu’elle retourne.
Rappel : La fonction intégrée int
permet de convertir n’importe quel nombre en nombre entier.
Solution 9.
|
|
-
Nous reviendrons sur ce point plus tard dans l’année. ↩︎