Types et expressions en Python
Dans ce chapitre, nous allons voir un peu plus en détails 4 types que Python nous permet de manipuler, et les expressions, qui combinent des valeurs.
- Les entiers, int, qui représentent des valeurs entières. (ex :
10
,-30
) - Les flottants, float, qui représentent des valeurs décimales. (ex :
120.3
,0.5
) - Les Chaînes de caractères, str, qui représentent du texte. (ex :
"texte"
) - Les booléens, bool, qui représentent une valeur qui est soit "vrai" (
True
), soit "faux" (Faux
).
Nous allons voir des opérations sur les différents types. Elle seront présentées dans un tableau de cette forme :
Opérateur | Usage | Explication | Exemples |
---|---|---|---|
- Opérateur est l'opérateur utilisé pour effectuer l'opération.
- Usage est une vision schématique de la façon de représenter comment l'opérateur s'utilise, et quelle valeur il produit, du point de vue des types. Par exemple
int + int -> int
veut dire "additionner deux entiers produit un entier". Attention, ce n'est pas du Python ! - Une explication en français de ce que produit l'opération
- Quelques exemples en Python de l'usage et du résultat, par exemple
10 + 2
vaut12
.
N'essayez pas d'apprendre par coeur ce chapite, lisez ce chapitre puis continuez le cours. Revenez ici quand vous aurez besoin de ces info au moment pendant la pratique, vous apprendrez sans vous en rendre compte !
Les entiers
Les entiers sont les nombres entier relatifs. On les désignera par int quand on aura besoin d'être concis. On crée un entier en utilisant uniquement des chiffres :
Voici une partie des opérations supportées par les entiers :
Opérateur | Usage | Explication | Exemples |
---|---|---|---|
+ | int + int -> int |
Addition | 10 + 2 vaut 12 |
- | int - int -> int |
Soustraction | 10 - 2 vaut 8 |
* | int * int -> int |
Multiplication | 10 * 2 vaut 12 |
// | int // int -> int |
Division entière (avec reste) | 11 // 2 vaut 5 |
% | int % int -> int |
Module (reste division entière) | 11 % 2 vaut 1 |
/ | int / int -> float |
Division, produit un flottant | 11 / 2 vaut 5.5` |
** | int ** int -> int |
Elévation à la puissance | 10 ** 2 vaut 100` |
Les flottants
Les flottants représentent des nombres décimaux. On les appelera parfois float pour la concision. On crée un flottant en utilisant des chiffres, séparés par un point, qui représente la virgule décimale .
.
Voici une partie des opérations supportées par les flottants :
Opérateur | Usage | Explication | Exemples |
---|---|---|---|
+ | float + float -> float |
Addition | 10.0 + 2.5 vaut 12.5 |
- | float - float -> float |
Soustraction | 10.0 - 2.5 vaut 7.5 |
* | float * float -> float |
Multiplication | 10.5 * 2.0 vaut 21.0 |
/ | float / float -> float |
Division | 10.5 / 2.0 vaut 5.25 |
** | float ** float -> float |
Elévation à la puissance | 10.0 ** 2.0 vaut 100.0 |
Dans une opération, on peut mixer des flottants et des entiers. Dans ce cas là, le résultat sera flottant :
1.0 + 1
vaut2.0
1.0 * 2
vaut2.0
Les chaînes de caractères
Les chaînes de caractères représentent du texte. On les appelera parfois str ou string pour la concision. On crée une chaîne de caractère en encadrant du texte avec des guillemets ou des apostrophes (en anglais simple quotes et double quotes).
Si on veut une chaîne qui contient des guillemets, on peut utiliser des apostrophes pour encadrer, et vice versa :
guillemet = 'voici un guillement :" '
apostrophe = "voici une apostrophe :' "
print(guillemet)
print(apostrophe)
Alternativement, on peut utiliser le caractère d'échappement, \
, qui permet de dire que le caractère qui le suit fait partie de la chaîne et non du code:
Il existe aussi des caractères spéciaux, qui permettent par exemple de faire des tabulations \t
ou des retours à la ligne \n
:
print("\tCette chaine est tabulée")
print("mais pas celle-ci")
print("retour à la ligne dans 3, 2, 1\nVoilà !")
Finalement, si on doit rentrer du texte très long, on peut utiliser des chaines de caractères multilignes, qui se font en triplant les apostrophes ou les guillements.
Voici une partie des opérations supportées par les chaînes de caractères :
Opérateur | Usage | Explication | Exemples |
---|---|---|---|
+ | str + str -> str |
Concaténation, met deux chaînes bout à bout | "a" + "b" vaut "ab" |
* | str - int -> str |
Répétition | "ab" * 3 vaut "ababab" |
Remarque, on peut créer une chaine vide, sans aucun caractère, avec deux guilemets ou apostrophes successifs :
Booléens
Les booléens, bool par concision, n'ont que deux valeurs possibles, vrai (True
), et faux (False
). On crée un booléen avec une des deux valeurs.
Voici une partie des opérations supportées par les booléens :
Opérateur | Usage | Explication | Exemples |
---|---|---|---|
and | bool and bool -> bool |
ET logique. Vaut True si les deux valeurs vaut True | True and False vaut "False" . True and True vaut True . False and False vaut False |
or | bool or bool -> bool |
OU logique. Vaut True si une des deux valeus vaut True | True or False vaut "True" . True or True vaut True . False and False or False |
Il existe également un opérateur unaire (qui n'agit que sur une seule valeur et pas deux), not
, le NON logique, qui vaut la valeur inverse du booléen. not True
vaut False
. not False
vaut True
.
Comparaisons
En plus d'opérations de calcul, nous pouvons aussi comparer des valeurs entre elles, à l'aide d'opérateurs de comparaison. Tous les opérateurs de comparaison produisent une valeur booléenne, ils sont au nombre de 6.
Opérateur | Description |
---|---|
== |
Egalité |
!= |
Inégalité |
< |
Infériorité stricte |
> |
Supériorité stricte |
<= |
Infériorité |
>= |
Supériorité |
Le résultat de ces opérateurs dépends du type des ses opérandes a
et b
.
A noter qu'il y a de nombreuses autres possibilités, ne sont détaillées ici que celles que nous utiliserons.
Opérateur d'égalité a == b
a et b sont |
Vaut True si |
Exemple |
---|---|---|
int ou float |
a et b ont la même valeur numérique |
1.0 == 1 vaut True . 1.0 == 2 vaut False . 2==3 vaut False . |
str |
a et b sont identiques |
"aa" == "aa" vaut True . "aa" == "ab" vaut False . |
Opérateur d'inégalité a != b
a et b sont |
Vaut True si |
Exemple |
---|---|---|
int ou float |
a et b ont des valeurs numériques différentes |
1.0 != 1 vaut False . 1.0 != 2 vaut True . 2 != 3 vaut True . |
str |
a et b sont différentes |
"aa" != "aa" vaut False . "aa" != "ab" vaut False . |
Opérateur d'infériorité stricte a < b
a et b sont |
Vaut True si |
Exemple |
---|---|---|
int ou float |
a a une valeur numérique strictement inférieure à celle de b |
1.0 < 1 vaut False . 1.0 < 2 vaut True . 3 < 2 vaut False . |
str |
a est avant b dans l'ordre alphabétique |
"aa" < "aa" vaut False . "aac" < "ab" vaut True . "abc" < "aa" vaut False . |
Opérateur de supériorité stricte a > b
a et b sont |
Vaut True si |
Exemple |
---|---|---|
int ou float |
a a une valeur numérique strictement supérieure à celle de b |
1.0 > 1 vaut False . 1 > 2 vaut False . 3 > 2.0 vaut True . |
str |
a est après b dans l'ordre alphabétique |
"aa" > "aa" vaut False . "aac" > "ab" vaut False . "abc" > "aa" vaut True . |
Opérateur d'infériorité a <= b
a et b sont |
Vaut True si |
Exemple |
---|---|---|
int ou float |
a a une valeur numérique inférieure ou égale à celle de b |
1.0 <= 1 vaut True . 1.0 <= 2 vaut True . 3 <= 2 vaut False . |
str |
a est avant b dans l'ordre alphabétique, ou a et b sont identiques |
"aa" <= "aa" vaut True . "aac" <= "ab" vaut True . "abc" <= "aa" vaut False . |
Opérateur de supériorité a >= b
a et b sont |
Vaut True si |
Exemple |
---|---|---|
int ou float |
a a une valeur numérique supérieure ou égale à celle de b |
1.0 >= 1 vaut True . 1 >= 2 vaut False . 3 >= 2.0 vaut True . |
str |
a est après b dans l'ordre alphabétique, ou a et b sont identiques |
"aa" >= "aa" vaut True . "aac" >= "ab" vaut False . "abc" >= "aa" vaut True . |
Transtypage
Parfois, on veut pouvoir convertir une valeur d'un type vers une valeurs equivalente, mais d'un autre type. Par exemple, si on demande à l'utilisateur de rentrer un nombre, input
nous renvoie une chaîne de caractère qui représente le nombre, que l'on voudra transformer en un entier ou un flottant. Cette opération s'appelle le transtypage. Elle est parfois appelé conversion. En anglais, le transtypage est appelé transtyping ou type casting.
En python, d'une manière générale, pour convertir une valeur d'un type vers un autre, on utilise cette syntaxe :
Essayons ça pour transformer la chaîne en entier (int
) dans le programme que nous avions fait. Celui ci, vous vous rappelez ?
Avec la conversion, ça donne ça :
Et ça marche !Remarque : si on rentre une chaîne qui ne représente pas un entier, la conversion échouera et finira en erreur.
a : un
Traceback (most recent call last):
File "/home/felix/erreur.py", line 2, in <module>
res = int(a) + 1
ValueError: invalid literal for int() with base 10: 'un'
Dans quelques chapitres nous verrons comment traiter ce genre de cas.
Parfois Python fais des conversions automatiquement, qu'on appelle conversions implicites. Par exemple, une chaîne est automatiquement convertie en booléen si elle est opérande d'un opérateur booléen.
Ce tableau récapitule quelques unes des conversions automatiques que fait Python :
De | Vers | Résultat |
---|---|---|
int |
bool |
False si l'entier est égal à zéro, True sinon |
str |
bool |
False si la chaîne est vide ("" ), True sinon |
Imprécision des flottants
Il est important de noter que la représentation des flottants dans la mémoire de la machine fait qu'ils sont parfois légèrement différents de la valeur à laquelle on s'attends : ce ne sont que des approximations.
Quand Python affiche un flottant avec print
, il fait un arrondi pour plus de lisibilité, et donc on ne voit pas cette imprécision.
Le code suivant affiche la valeur exacte du flottant 0.1
tel qu'il est stocké dans la mémoire :
Cette erreur de précision peut créer des problèmes quand on fait des calculs et qu'on veut comparer des valeurs.
Le code suivant :
affiche
C'est surprenant, et il faut s'en rappeler : à part pour de très rare cas, tester l'égalité ou l'inégalité entre deux flottants conduira à une erreur, et il vaut mieux tester un encadrement:
a = 0.2 * 0.1
p = 0.001 #la précision que l'on veut avoir dans l'égalité
print(0.02 - p < a < 0.02 + p) #python nous autorise à écrire a < b < c pour tester si a est compris entre b et c.
Connaître le type d'une valeur
L'opérateur type
permet produit une chaîne de caractère qui renvoie le type d'une valeur :
Sauf dans de rare cas, tester le type d'une valeur dans le code est une mauvaise pratique. En revanche, afficher le type d'une valeur peut aider au debogage dans certains cas.
Expressions
Nous l'avons déjà dit, une expression est un bout de code qui est évalué à une valeur. Être évalué veut dire que quand on rencontre notre expression dans le code, elle est substitué par la valeur qu'elle vaut.
Dans le code suivant :
2 + 3
est une expression, qui sera évaluée à 5
. Donc la valeur que recevra la variable a
sera 5. D'ailleurs, 5
est aussi une expression. En fait, tout ce qui peut donner lieu à une valeur est une expression. Par exemple, dans une expression, le nom d'une variable sera évalué à la valeur contenue dans la variable.
Ici, dans l'expression a+2
, Python va d'abord évaluer a
, la valeur stockée dans a
est 5. Donc après une étape, l'expression sera 5 + 2
. L'opération +
sera alors évaluée, et l'expression vaudra 7
. Donc b
recevra la valeur 7.
La précédence des opérateurs
On appelle la précédence des opérateurs l'ordre dans lequel les opérateurs sont évalués dans une expression.
Par exemple, dans l'expression
3 * 4
est évaluée en premier, ce qui donne :
On peut parenthéser, comme en maths, pour choisir quel opérateur sera évalué en premier
Plus la précédence d'un opérateur est élévé, et plus il est évalué en priorité. Voilà la liste des opérateurs que nous avons vus, classés par précédence décroissante1 :
Préc. max |
---|
() |
** |
* / // % |
+ - |
< > >= <= != == <> |
not |
and |
or |
Prec. min |
Quand deux opérateur ont une précédence égale, on considérera que l'odre d'évaluation est arbitraire. En général, ça n'a pas d'importance, parce que ce sont des opérateur qui ont des effets similaires ((2 * 3) / 5
est égal à 2 * (3/ 5)
). Si on veut fixer l'ordre dans ce cas, on utilise des parenthèses.
Nous verrons d'autres opérateurs au long de ce cours.
Exercices
Dans les exercices, quand des nombres de lignes sont données, vous pouvez de faire autant ou moins, mais ce n'est pas obligatoire. N'essayez pas de faire le code le plus court possible, mais du code compréhensible, en particulier pour vous.
Si vous allez voir la solution, pensez bien à CORRIGER votre code (eventuellement sans regarder la solution) à la main jusqu'à ce qu'il marche, ne vous contentez pas de juste lire la solution et de passer à autre chose.
Complétez le code suivant :
pour obtenir exactement cette sortie :- L'opérateur de concaténation est
+
- N'oubliez pas d'ajouter un espace !
Ecrivez un programme (3 lignes) qui :
- Demande un nombre à l'utilisateur (entier ou flottant, vous avez le choix)
- Demande une chaîne à l'utilisateur
- Affiche la chaîne et le nombre + 1 sur la même ligne.
Exemple de sortie possible :
- Il vous faudra convertir le nombre en chaîne à l'aide de
str(nombre)
- Puis concaténer les chaines avant de les afficher
- N'oubliez pas les espaces !
Les essentiels
Au Programme
En Python et dans la plupart des langages de programmation, les valeurs sont typées. Le type d'une valeur définit ce que la valeur réprésente, et les opérations que l'on peut faire dessus.
Par exemple, additionner deux entiers a du sens, mais ajouter un entier et un texte n'a pas de sens.
Les types permettent de faire des vérifications automatiques, et donc de détecter des erreurs d'inatention.
On a pour le moment vu 4 types
- Les entiers,
int
, qui correspondent aux nombres entiers relatifs - Les flottants,
float
, qui correspondent aux nombres réels - Les booléens,
bool
, qui peuvent prendre uniquement deux valeurs,True
etFalse
. - Les chaînes de caractères,
str
, qui correspondent à du texte.
Les types supportent des opérations sous forme d'opérateurs. Voir le cours pour les opérateurs supportés par chaque type. Voici les principaux :
opérateur | types | opération |
---|---|---|
+ |
int , float |
addition |
+ |
str |
concaténation (mise bout à bout) |
- |
int , float |
soustraction |
* |
int , float |
multiplication |
/ |
int , float |
division, resultat type float |
// |
int , int |
division entière |
and |
bool |
ET logique |
or |
bool |
OU logique |
not |
bool |
NON logique |
Combiner les valeur avec des opérateurs donne des expressions. Une expression est évaluée à l'execution pour connaître sa valeur.
Exemple d'expression :
On peut utiliser des variables dans une expression, la variable sera alors remplacée par sa valeur au moment de l'évaluation. En général, partout où on utilise des valeurs, on peut utiliser des expressions.
L'ordre d'évaluation des opérations d'une expression s'effectue dans un ordre précis. L'ordre est d'une manière générale similaire à l'ordre que l'on retrouve en mathématique, c'est à dire d'abord l'addition et la division, puis l'addition et la soustraction.
-
https://pythongeeks.org/python-operator-precedence/ ↩