Autres expressions

Identification

Infoforall

4 - Types simples


On peut faire bien d'autres choses que d'évaluer et d'afficher des expressions numériques.

Python classe ce qu'il doit évaluer dans plusieurs catégories.

Et nous allons encore voir une bizarrerie qu'on peut obtenir si on ne fait pas attention :

calcul bizarre
Un calcul très bizarre...

Vous imaginez s'il fallait payer 55 euros en achetant deux objets à 5 euros !

Logiciel nécessaire pour l'activité : Python 3

Evaluation

 questions 13-17-19-20

  question 20

Exercices supplémentaires 🏠 : Exercices

Documents de cours PDF : .PDF

Sources latex : .TEX et entete.tex et licence.tex

Résumé : Version HTML ou fond blanc ou ou PDF (couleur ou gris)

1 - Nombres : int et float

Nous allons voir 4 types simples de données permettant de stocker des informations basiques :

  • Le type int pour les entiers
  • Le type float pour les nombres à virgule flottante, dont le stockage en machine n'est pas exacte dans la majorité des cas.
  • Le type str pour les caractères et les chaînes de caractères, string en anglais.
  • Le type bool pour les booléens, qui ne peuvent valoir que True ou False.
1.1 Encoder une information

Encoder une information veut dire qu'on transforme notre information réelle en séquence de 0 et de 1 en respectant une technique d'encodage précise.

Pourquoi 0 et 1 ? Ce sont les deux seules informations réellement mémorisables physiquement.

Information -> ENCODAGE -> 010101011100...

Il est indispensable de connaître la technique utilisée pour encoder notre information car sinon, on ne pourrait pas la décoder sans ambigüité.

010101011100... -> DECODAGE -> Information

C'est dans la partie DONNEES de ce site que se trouvent les activités qui expliquent concrètement comment encoder une information. Ici, nous ne ferons qu'utiliser les techniques d'encodage prédéfinies dans Python.

1.2 Integers

Type : int

Les entiers sont encodés sous forme d'integer.

En Python, ce type est nommé int. On peut trouver le type d'une donnée en utilisant la fonction native type().

>>> type(5) <class 'int'>

On retrouve les opérateurs classiques. Voici les signatures associées :


ADDITION avec +

int + int -> int

Traduction : une addition entre un integer et un integer renvoie une valeur integer.

>>> 4 + 5 9

SOUSTRACTION avec -

int - int -> int

Traduction : une soustraction entre un integer et un integer renvoie une valeur integer.

>>> 4 - 5 -1

MULTIPLICATION avec *

int * int -> int

>>> 4 * 5 20

DIVISION avec /

int / int -> float

float ? C'est le type utilisé pour les nombres à virgule.

>>> 23 / 5 4.6

Notez bien qu'en Python, la virgule (notation française) est représentée par un point (notation anglo-saxonne).


QUOTIENT d'une division euclidienne avec //

int // int -> int

>>> 23 // 5 4

Tout simplement car on peut faire au maximum 4 tas de 5 avec 23.


RESTE d'une division euclidienne avec %

int % int -> int

>>> 23 % 5 3

Si on fait 4 tas de 5 avec 23, cela fait 20. Il reste bien 3 : 23 = 4*5 + 3.


PUISSANCE avec **

int ** int -> int

>>> 3 ** 2 9
1.3 Floats

Type : float

Les nombres à virgule sont encodés sous un type de données nommé float.

Le type des floats est float en Python.

>>> type(5.0) <class 'float'>

Python utilise la notation anglo-saxonne : un point plutôt qu'une virgule.

On retrouve tous les opérateurs arithmétiques classiques.


ADDITION avec +

float + float -> float

float + int -> float

int + float -> float

>>> 1.2 + 0.6 1.8
>>> 1.0 + 5 6.0

SOUSTRACTION avec -

float - float -> float

float - int -> float

int - float -> float

>>> 5 - 4.5 0.5

MULTIPLICATION avec *

float * float -> float

float * int -> float

int * float -> float

>>> 10 * 1.2 12.0

DIVISION avec /

float / float -> float

float / int -> float

int / float -> float

>>> 23.0 / 10.0 2.3 >>> 23.0 / 10 2.3 >>> 23 / 10.0 2.3

QUOTIENT d'une division euclidienne avec //

A partir d'ici, cela va sembler plus étrange : on peut utiliser cet opérateur, il renvoie le bon résultat, mais en utilisant l'encodage du float (avec au besoin 0 derrière la virgule).

float // float -> float

float // int -> float

int // float -> float

>>> 23.0 // 5.0 4.0 >>> 23.0 // 5 4.0 >>> 23 // 5.0 4.0

RESTE d'une division euclidienne avec %

Encore une fois, cela fonctionne mais... on obtiendra toujours un float.

float % float -> float

float % int -> float

int % float -> float

>>> 23.0 % 5.0 3.0

PUISSANCE avec **

float ** float -> float

int ** float -> float

float ** int -> float

>>> 5.0 ** 2.0 25.0 >>> 5.0 ** 2 25.0 >>> 5 ** 2.0 25.0
1.4 - Le problème des flottants

La différence fondamentale entre l'encodage d'un integer et d'un flottant :

  • Integer : Tous les entiers sont toujours exactement enregistrés. On parvient à relire exactement ce qu'on a enregistré.
  • 7 -> ENCODAGE -> 00000111 -> DECODAGE -> 7

  • Float : Certains nombres stockés sous forme d'un float sont enregistrés approximativement. Lorsqu'on décode, on obtient donc parfois presque la valeur qu'on a voulu enregistrée. Presque.
  • 0.1 -> ENCODAGE -> 00..010101.. -> DECODAGE -> 0.10000000000000001

Ce n'est pas un problème lié à Python : c'est juste un problème lié aux nombres flottants. Un informaticien doit donc le savoir :

A SAVOIR IMPERATIVEMENT : l'encodage des nombres réels en float provoque parfois un enregistrement approximatif de la valeur de départ.

Les calculs réalisés à partir d'un float potentiellement approximatif seront potentiellement approximatifs aussi !

Conséquence : Si on peut faire les calculs en se passant des flottants, on privilégie cette solution.

Exemples

Imaginons qu'une banque décide de réaliser ses calculs en utilisant les flottants :

>>> 4.8 - 4.2 0.5999999999999996 >>> 3 * 0.1 0.30000000000000004

Comme vous le voyez, cela provoque des erreurs de calculs : en toute rigueur 4.8 - 4.2 donne exactement 0.6 en mathématique et 3 * 0.1 donne exactement 0.3 en mathématique.

Multipliez ces approximations par plusieurs milliards d'opérations bancaires par seconde dans le monde, et vous imaginerez sans peine qu'il y aurait des erreurs énormes au bout de quelques temps.

Le plus perturbant, c'est que cela fonctionne parfois :

>>> 0.75 - 0.25 0.5 >>> 3 * 0.25 0.75

⚙ 01° Utiliser ces lignes de commande puis fournir les 3 signatures qu'elles illustrent :

>>> 5 * 5 25
>>> 5.0 * 5.0 25.0
>>> 5 * 5.0 25.0

...CORRECTION...

>>> 5 * 5 25 Signature : int * int -> int
>>> 5.0 * 5.0 25.0 Signature : float * float -> float
>>> 5 * 5.0 25.0 Signature : int * float -> float

En math, 25 et 25.0 représentent bien le même nombre.

En informatique, 25 ou 25.0 ne représentent pas le même type de données.

⚙ 02° Un élève décide de se persuader que diviser par 10 revient bien à multiplier par 0,1. Ainsi, en mathématiques :

  • 7 / 10 = 0.7
  • 7 * 0.1 = 0.7

Expliquer pourquoi l'expression ci-dessous est évaluée à False alors qu'elle devrait donner True d'un point de vue mathématique.

>>> n = 7 >>> n * 0.1 == n / 10 False

...CORRECTION...

Le problème vient du fait que Python ne réalise qu'approximativement ces deux calculs.

Lorsqu'il calcule 7 / 10, il ne parvient pas à exactement stocker 0.7.

Lorsqu'il calcule 7 * 0.1, il utilise déjà une approximation de 0.1 et donc obtient une approximation de 0.7.

Or, on lui pose la question de savoir si le premier résultat vaut exactement le deuxième résultat. Pour lui, les deux calculs sont presque identiques mais pas exactement identiques : il répond False.

2 - Texte : string (str)

Heureusement, on peut gérer bien d'autres choses que des informations numériques avec les langages de programmation. Regardons la gestion des informations de type "texte" par exemple.

2.1 STRING : définition

Le type gérant les textes se nomme string. C'est un conteneur formant une collection ordonnée de caractères.

String est un mot anglais qui signifie "chaîne" en français ; un texte est une chaîne de caractères qui se suivent. Exemple avec le mot Bonjour :

Indice 0 1 2 3 4 5 6
Elément 'B' 'o' 'n' 'j' 'o' 'u' 'r'

Indice se traduit par index en anglais.

flowchart LR D([Variable]) --> M([conteneur-string]) M -- indice 0 --> A([caractère 0]) M -- indice 1 --> B([caractère 1]) M -- indice 2 --> C([caractère 2])

Notez bien que la première case est la case d'indice 0, pas celle d'indice 1. Les indices disponibles dans un string de 7 caractères vont donc de 0 à 6.

2.2 STRING : déclaration avec Python

Type str

En Python, les strings sont gérés par le type nommé str.

Déclaration (avec des guillemets)

Un string Python est délimité par deux délimitateirs signalant son début et sa fin.

  • soit un guillemet simple : 'Bonjour' (touche du 4)
  • soit un guillemet double : "Bonjour" (touche du 3)
  • soit trois guillemets simples : '''Bonjour'''
  • soit trois guillemets doubles : """Bonjour"""
  • mais jamais de mélange pour un même string : si on mélange sur un même string, Python perd le fil : c'est une erreur de syntaxe.
  • >>> "Hello World !' File "<pyshell>", line 1 "Hello World !' ^ SyntaxError: EOL while scanning string literal

    La phrase d'erreur peut se traduire par "Je suis arrivé à la fin de la ligne sans rencontrer le caractère de fermeture pendant que j'étais en train de lire le string".

Exemples
  • Un guillemet simple pour l'ouverture et la fermeture.
  • >>> 'Hello World !' 'Hello World !' >>> type('Hello World !') <class 'str'>
  • Un guillemet double pour l'ouverture et la fermeture.
  • >>> "Hello World !" 'Hello World !' >>> type("Hello World !") <class 'str'>

    Python répond toujours avec des guillemets simples lorsqu'il le peut.

Déclaration d'un string multi-ligne

On peut déclarer un string intégrant des passages à la ligne (celles intégrant des appuis sur ENTREE) en utilisant 3 guillemets :

1 2 3 4 5 6 7 8
s = """Voici une liste : - premier truc - deuxième truc - troisième truc En ici, c'est fini""" print(s)

Voici l'affichage obtenu dans la console :

Voici une liste : - premier truc - deuxième truc - troisième truc En ici, c'est fini
Déclaration d'un string vide

Deux solutions

>>> s = "" >>> s '' >>> s = str() >>> s ''
Guillemet simple ou apostrophe ?

Dans certaines polices de caractères, il n'y a pas de différence visuelle mais il existe plusieurs apostrophes différentes, dont l'apostrophe droite : guillemet simple simple.

' ’ ʾ ′ ˊ ˈ ꞌ ‘ ʿ ‵ ˋ

Mais attention, Python nécessite bien la présence de guillemet simple, et pas d'une apostrophe (le trait est légérement courbé normalement). C'est d'ailleurs pour cela qu'il ne faut pas écrire de code à l'aide d'un traitement de texte : il utilise le plus souvent une apostrophe (courbée) lorsqu'on tape sur la touche 4.

2.3 STRING : opérateurs Python

Même syntaxe, sémantique différente

On retrouve une partie des symboles d'opérateurs applicables aux valeurs numériques mais la signification (ou sémantique) ne va pas être la même.


CONCATÉNATION avec +

str + str -> str

>>> "bon" + "jour" 'bonjour'
>>> '5' + '5' '55'

La concaténation correspond à une juxtaposition. D'où l'utilisation d'un autre terme qu'addition.

Le deuxième exemple peut être perturbant pour un humain ! Mais il suffit de le lire correctement pour comprendre la réponse '55' que fournit l'interpréteur : Que donne la concaténation du caractère '5' et du caractère '5' ?

Il n'existe pas de signature liée à des entrées de type str + int ou int + str. C'est normal, quel sens pourrait-on donner à cette opération ?

>>> 'Bonj' + 5 TypeError: can only concatenate str (not "int") to str

Concaténation (str) : coût LINÉAIRE par rapport au nombre n de caractères.


RÉPÉTITION avec *

str * int -> str

int * str -> str

La répétition correspond à une sorte de copier-coller d'un string.

>>> "Bon" * 2 'BonBon' >>> 4 * "Pom ! " 'Pom ! Pom ! Pom ! Pom ! ' >>> '#' * 20 '####################'

Il n'existe pas de signature liée à des entrées de type str * float ou float * str.

Répétition (str) : coût LINÉAIRE par rapport au nombre n de caractères.


Et les autres ?

Les autres opérateurs (- / // % **">) ne sont pas implémentés sur les strings. Leur utilisation sur un string provoque donc une erreur.

En espérant que vous compreniez maintenant beaucoup mieux ceci :

logique
Une évaluation plutôt logique, non ?

⚙ 03° Observer ces deux exemples puis répondre aux deux questions :

Exemple 1

>>> "Hello World !" 'Hello World !'

Exemple 2

>>> Hello World ! File "<stdin>", line 1 Hello World ! ^ SyntaxError: invalid syntax
  • Comment se nomme en Python le type de la donnée de l'exemple 1 ?
  • Pourquoi l'interpréteur ne parvient-il pas à comprendre qu'on veut sur l'exemple 2 ?

...CORRECTION...

Il s'agit d'un string : str en Python.

Le problème sur l'exemple 2 vient du fait qu'il n'y a pas de guillemets d'ouverture signalant le début d'un string !.

⚙ 04°Quelques questions générales sur les strings :

  1. Comment cette expression va-elle être évaluée ?
  2. >>> "Hello W" + "orld !"
  3. Comment se nomme cette utilisation de l'opérateur + ?
  4. L'espace est-il un caractère ou une non-information ?
  5. Que code un guillemet d'ouverture suivi immédiatement qu'un guillemet de fermeture (c'est à dire le string '' ou "") ?
  6. Que donnera cette évaluation ?
  7. >>> "" * 20

...CORRECTION...

  1. On voit s'afficher 'Hello World !'' dans la console.
  2. Python sait évaluer l'"addition deux strings". On nomme cela la concaténation. On obtient un string qui est la juxtaposition des deux strings initiaux.
  3. L'espace est bien un caractère comme un autre, il existe le caractère 'A' et le caractère ' '.
  4. Il s'agit du string vide, rien même pas un espace.
  5. Le caractère "" dupliqué 20 fois ne donne rien de plus que le caractère de base : toujours "", même si Python préfère le noter ''. Il s'agit donc d'une chaîne de caractères vide.

⚙ 05° Répondre à ces questions :

  1. Donner les signatures associées aux opérateurs + et * sur les strings.
  2. Evaluer de tête les deux expressions fournies. Exécuter pour vérifier votre réponse.
  3. >>> 120 * 2 >>> "120" * 2
  4. Pourquoi ce dernier cas ne donne-t-il rien d’interprétable ?
  5. >>> "120" + 2

...CORRECTION...

Les seules signatures possibles sont :

  • str + str -> str
  • str * int -> str
  • int * int -> str

Si on veut deux fois le nombre 120, on obtient 240.

Si on veut deux fois la chaîne "120", on obtient '120120'.

Par contre, Python ne sait absolument pas additionner une chaîne de caractères et un nombre ... En même temps, que feriez-vous si on vous demandait de faire la somme de "ABC" et du nombre 2.

⚙ 06° Comment est évalué "Cou" * 2 ?

  1. 'Cou2'
  2. 'CouCou'
  3. 'Coucou'
  4. 'Cou*2'

...CORRECTION...

La réponse est 'CouCou', il faut garder la Majuscule deux fois.

'Cou' * 2 revient à copier-coller 'Cou' et donc à concatener 'Cou' + 'Cou'

2.4 STRING : déterminer sa longueur

La longueur d'un string correspond au nombre de "cases-caractères" du string.

Cette longueur est importante pour ne pas déborder hors du string lors d'une lecture par indice : si le string est de longueur 45, vous savez que les indices valides vont de 0 à 44.

On utilise la fonction native len().

Indice 0123456 >>> mot = "Bonjour" >>> len(mot) 7

Comme on voit qu'il y a 7 caractères, on sait alors qu'on peut demander des indices allant de 0 à ...6.

Longueur (str) : coût CONSTANT par rapport au nombre n de caractères (on stocke cette valeur dans l'objet)

⚙ 07° Comment demander à l'interpréteur Python de fournir le nombre de caractères dans le string suivant :

"Bon, alors, vous allez mettre combien de temps pour trouver le nombre de caractères qui se trouvent dans cette phrase, longue, inutile et pas franchement littéraire."

Rappel : l'espace est bien un caractère comme un autre.

...CORRECTION...

>>> len("Bon, alors, vous allez mettre combien de temps pour trouver le nombre de caractères qui se trouvent dans cette phrase, longue, inutile et pas franchement littéraire.") 165

3 - Propriété : bool

Une propriété est une affirmation (textuelle ou mathématique) qui peut être vraie ou fausse.
3 Booléen : vrai ou faux

Booléens

Lorsqu'on utilise certains opérateurs booléens, l'interpréteur évalue votre expression en répondant :

  • True si c'est vrai ou
  • False sinon.

Pas de réponse de type "peut être". Néanmoins, la demande peut provoquer une erreur.

Opérateurs renvoyant une valeur booléenne

  • relation strictement supérieur avec >
  • int|float > int|float -> bool

    Le signe | veut dire OU. On peut donc placer un entier ou un flottant.

    >>> 40 > 30 True

    On pose la question suivante à l'interpréteur Python : "40 est-il strictement supérieur à 30 ?".

    str > str -> bool

    >>> "crocodile" > "tortue" False

    On pose la question suivante à l'interpréteur Python : "Le mot "crocodile" est-il derrière le mot "tortue" dans le dictionnaire ?".

    On voit qu'on utilise ici l'ordre lexicographique, l'ordre du dictionnaire (si tout est en minuscule).

    Dans une autre activité, nous détaillerons un peu plus comment cela fonctionne, notamment la gestion des majuscules ou des autres caractères.


  • opérateur d'égalité avec ==
  • Puisque = est déjà utilisé pour l'affectation des variables (a = 50 par exemple), les concepteurs de Python ont choisi la syntaxe d'un double signe égal pour le test d'égalité.

    >>> 40 == 3 * 10 False

    On pose la question suivante à l'interpréteur Python : "40 est-il identique à 3 * 10 ?".

    >>> 40 == 4 * 10 True

    On pose la question suivante à l'interpréteur Python : "40 est-il identique à 4 * 10 ?".

    >>> 0.3 == 3 * 0.1 False

    On pose la question suivante à l'interpréteur Python : "0.3 est-il identique à 3 * 0.1 ?". Pourquoi obtient-on False ? Simplement car 0.1 n'a pas été mémorisé de façon exacte, et donc 3 * presque 0.1, ca ne donne pas presque 0.3 !


  • opérateur de différence avec !=
  • Puisque n'est pas facilement accessible sur un clavier, les concepteurs de Python ont choisi la syntaxe != pour le test de différence. Dans d'autres langages, c'est parfois <>.

    >>> 40 != 3 * 10 True

    On pose la question suivante à l'interpréteur Python : "40 est-il différent de 3 * 10 ?".

    >>> 40 != 4 * 10 False

    On pose la question suivante à l'interpréteur Python : "40 est-il différent de 4 * 10 ?".


  • autres opérateurs de comparaison :
  • >>> 40 < 30 False

    On pose la question suivante à l'interpréteur Python : "40 est-il strictement inférieur à 30 ?".

    >>> 40 <= 30 False

    On pose la question suivante à l'interpréteur Python : "40 est-il inférieur ou égal à 30 ?".

    >>> 40 >= 30 False

    On pose la question suivante à l'interpréteur Python : "40 est-il supérieur ou égal à 30 ?".


  • appartenance avec in
  • Le mot-clé in permet de savoir si un élément a est présent dans un élément b : a in b

    Si la réponse est True, c'est que a apparaît dans b. Sinon, la réponse sera False.

    Voici un moyen de tester facilement si quelqu'un d'allergique au soja peut manger un produit dont on connaît la composition :

    >>> "soja" in "Sucre ; huile de colza ; eau ; chocolat en poudre 15 % (sucre, pâte de cacao) ; farine de blé ; poudre d’œuf ; stabilisants : glycérol, gomme xanthane ; cacao en poudre 2,5 % ; poudre à lever : E450, E500 ; amidon de blé ; conservateur : E202 ; sel. Traces de lait." False

    La question posée est Le mot "soja" apparaît-il dans la composition fournie" ?

    Et si vous étiez intolérant au blé ?

    >>> "blé" in "Sucre ; huile de colza ; eau ; chocolat en poudre 15 % (sucre, pâte de cacao) ; farine de blé ; poudre d’œuf ; stabilisants : glycérol, gomme xanthane ; cacao en poudre 2,5 % ; poudre à lever : E450, E500 ; amidon de blé ; conservateur : E202 ; sel. Traces de lait." True

    La question posée est Le mot "blé" apparaît-il dans la composition fournie" ?

⚙ 08° Comment cette expression va-elle être évaluée  ?

>>> "jo" in "Bonjour" ???
  1. False
  2. 'False'
  3. false
  4. True
  5. 'True'
  6. true

...CORRECTION...

La réponse est la valeur booléenne True, avec une Majuscule.

Pourquoi ? Simplement car le mot-clé in teste sur le premier string "jo" est présent dans le second string "Bonjour".

⚙ 09° ACAT est-il présent dans la séquence ADN suivante ? Comment poser cette question en Python ?

TACAGTGTGCCACATCCGGTTGTTAGAGATTCCCGATCAGTAGAAACCCATGGCCCACGGTGTACTTGCCATATATTCTACACTATGGACGCATAGGATAGCCTATGTAACCAAGGTTACGCCTGACATACGAACCAGGTTTAGTTCGTCACCAGATTTGGGGCCCAGTGCTATGGTAACTTTACGCACATTTCGCGAGC

...CORRECTION...

>>> "ACAT" in "TACAGTGTGCCACATCCGGTTGTTAGAGATTCCCGATCAGTAGAAACCCATGGCCCACGGTGTACTTGCCATATATTCTACACTATGGACGCATAGGATAGCCTATGTAACCAAGGTTACGCCTGACATACGAACCAGGTTTAGTTCGTCACCAGATTTGGGGCCCAGTGCTATGGTAACTTTACGCACATTTCGCGAGC" True

⚙ 10° Comment demander à Python si 12 au carré (122) est supérieur à 175 ? Que va répondre l'interpréteur Python ?

  1. 12*2 > 175
  2. 12**2 > 175
  3. 2**12 > 175
  4. 2**12 >= 175

...CORRECTION...

>>> 12**2 > 175 False

⚙ 11° Que faut-il taper pour savoir si Bonjour contient plus de lettres que Hello ?

  1. Bonjour > Hello
  2. "Bonjour" > "Hello"
  3. len(Bonjour) > len(Hello)
  4. len("Bonjour") > len("Hello")

...CORRECTION...

>>> len("Bonjour") > len("Hello") True

⚙ 12° Quelle question pose-t-on avec cette expression ? Répondre en vous demandant ce que fait l'interpréteur de votre demande. Comment se nomme l'ordre utilisé par Python pour comparer les strings entre eux ?

>>> "Bonjour" > "Hello" False

...CORRECTION...

Python compare la première lettre, comme dans l'alphabet.

Puisque H arrive après B, il dit que "Bonjour" n'arrive pas après "Hello" dans un dictionnaire.

Python utilise l'ordre lexicographique.

✎ 13° Expliquer les réponses fournies par la console en fournissant les énoncés des questions qu'on a posé à Python :

>>> 4*10 + 2 == 42 True >>> "Bo" * 2 != "Outch" True

⚙ 14° Observer les résultats des évaluations suivantes :

>>> 40*2 + 10 == 50 + 40 True >>> 10*2 + 10 > 50 + 40 False

Répondre alors à cette question : les opérateurs arithmétiques sont-ils prioritaires sur les opérateurs de comparaisons ?

...CORRECTION...

Les opérateurs arithmétiques sont bien prioritaires sur les opérateurs logiques. Voici comment Python a évalué les expressions fournies :

>>> (40*2 + 10) == (50 + 40) True >>> (10*2 + 10) > (50 + 40) False

On commencera donc par les opérateurs arithmétiques, et on finit par les opérateurs booléens.

Les opérateurs arithmétiques sont donc prioritaires.

⚙ 15° Un élève propose ceci :

>>> (40*2 + 10) == (50 + 40)

Que peut-on dire de son expression (plusieurs choix possibles) ?

  1. Elle va provoquer une erreur de syntaxe;
  2. Elle est bonne mais les parenthèses sont superflues;
  3. Elle est bonne et les parenthèses sont nécessaires;
  4. Elle est bonne et il fait bien de favoriser l'explicite plutôt que l'implicite.

...CORRECTION...

Réponses B et D.

Les parenthèses ne sont pas nécessaires puisque les opérateurs arithmétiques ont une plus grande priorité que les opérateurs logiques.

Elles sont donc superflues.

Néanmoins, rajouter les parenthèses rend l'opérateur explicite même pour quelqu'un qui ne le sait plus.

⚙ 16° Fournir les étapes successives réalisées par l'interpréteur Python pour évaluer cette expression :

>>> 40*2 + 10 == 50 + 40

Ne réalisez qu'une étape à la fois, on doit retrouver l'aspect séquentiel.

...CORRECTION...

40*2 + 10 == 50 + 40 80 + 10 == 50 + 40 90 == 50 + 40 90 == 90 True

✎ 17° Expliquer pourquoi Python répond faux alors qu'on aurait pu croire qu'il allait répondre vrai :

>>> 0.3 / 0.1 == 3.0 False

4 - Convertir : passer d'un type à un autre

En conclusion, voyons comment régler ce problème :

>>> naissance = "2007" >>> maintenant = "2024" >>> age = maintenant - naissance TypeError: unsupported operand type(s) for -: 'str' and 'str'

Mais pourquoi fournir les années sous forme de string ? C'est stupide...

Oui mais une donnée en provenance du clavier ou d'un fichier texte est toujours transmise sous forme d'un string. Si on demande à l'utilisateur de taper son année de naissance au clavier, on aura donc bien ce type de problème.

4.1 Variable "vide" mais du bon type

On peut créer un contenu "vide" mais "typé".

Créer un contenu vide typé
  • int() pour une donnée de type int
  • >>> i = int() >>> i 0
  • float() pour une donnée de type float
  • >>> f = float() >>> f 0.0
  • str() pour une donnée de type str
  • >>> s = str() >>> s ''
  • bool() pour une donnée de type bool
  • >>> b = bool() >>> b False
Déclaration directe

Avec Python, vous verrez beaucoup plus souvent cette façon de déclarer les contenus vides ayant le bon type :

    >>> i = 0 # pour un integer "vide" >>> f = 0.0 # pour un float "vide" >>> s = "" # pour un string "vide" >>> b = False # pour un booléen "vide"
4.2 - Créer un booléen avec bool()

La fonction native bool() reçoit une donnée quelconque et renvoie True ou False.

!!! A SAVOIR PAR COEUR !!!

En Python, un contenu VIDE ou NUL est évalué à False si on demande un résulat booléen.

Dans tous les autres cas, le résultat est True.

D'où l'intérêt de savoir ce que veut dire nul ou vide pour les différents types de base.

Voici quelques exemples d'évaluation en booléen :

>>> bool(0) # 0 est associé à "vide" False >>> bool(5) # 5 n'est pas "vide" True >>> bool(5.2) # 5.2 n'est pas associé à "vide" True >>> bool(0.0) # 0.0 est associé à "vide" False >>> bool("5") # 0 est associé à "vide" True >>> bool("5.2") # "5.2" n'est pas associé à "vide" True >>> bool("bonjour") # "bonjour" n'est pas associé à "vide" True >>> bool("") # "" est associé à "vide" False
4.3 Créer un integer avec int()

La fonction native int() reçoit une donnée quelconque et renvoie un integer si c'est possible.

    >>> int(5.2) 5 >>> int("5") 5 >>> int(False) 0 >>> int(True) 1

    On notera que les concepteurs de Python ont choisi de représenter

    • False par 0
    • True par 1

Parfois, cela ne fonctionne pas :

>>> int("5.2") ValueError: invalid literal for int() with base 10: '5.2' >>> int("bonjour") ValueError: invalid literal for int() with base 10: 'bonjour' >>> int("") ValueError: invalid literal for int() with base 10: ''
4.4 - Créer un flottant avec float()

La fonction native float() reçoit une donnée quelconque et renvoie un float si c'est possible.

Quelques exemples avec des conversions qui fonctionnent et d'autres qui déclenchent une erreur.

    >>> float(5) 5.0 >>> float(5.2) 5.2 >>> float("5") 5.0 >>> float("5.2") 5.2 >>> float(False) 0.0 >>> float(True) 1.0 >>> float("bonjour") ValueError: could not convert string to float: 'bonjour' >>> float("") ValueError: could not convert string to float:

    On notera surtout que les concepteurs de Python ont choisi de représenter False par 0.0 et True par 1.0.

4.5 - Créer un string avec str()

La fonction native str() reçoit une donnée quelconque et renvoie un string si c'est possible, ce qui est toujours le cas.

    >>> str(5) '5' >>> str(5.2) '5.2' >>> str(False) 'False' >>> str(True) 'True'

    Bref, ça fonctionne toujours. On transforme juste la représentation normale en string.

⚙ 18° En utilisant les fonctions len() et str(), déterminer le nombre de chiffres qui compose le nombre 424242.

...CORRECTION...

>>> 4242**42 228017350815626147035721372501376992688059058886268080724063295596366483941668042744418226174719940986772511387287759161404869263495964915948287231524864 >>> s = str(4242**42) >>> s '228017350815626147035721372501376992688059058886268080724063295596366483941668042744418226174719940986772511387287759161404869263495964915948287231524864' >>> len(s) 139

⚙ 19-A° Placer le programme ci-dessous dans la zone programme de Thonny. Enregistrer ce programme sous un nom comme trois.py.

Tester pour vérifier que cela ne fonctionne pas...

1 2 3
naissance = "2007" maintenant = "2022" age = maintenant - naissance
File "/home/rv/Documents/trois.py", line 3, in <module> age = maintenant - naissance TypeError: unsupported operand type(s) for -: 'str' and 'str'

Question

Modifier uniquement la ligne 3 pour que le programme fonctionne correctement.

...CORRECTION...

1 2 3
naissance = "2007" maintenant = "2022" age = int(maintenant) - int(naissance)
>>> age 15
Introduction très rapide à input()

Vous connaissez la fonction native print() qui permet d'afficher un contenu sur la console.

Voyons maintenant la fonction native input() qui récupère la réponse reçue au clavier sous forme d'un string. Pour valider la réponse, il faut appuyer sur entrée .

>>> reponse = input() Bonjour >>> reponse 'Bonjour' >>> reponse * 3 'BonjourBonjourBonjour'

Le problème vient du fait que TOUT ce qu'on récupère depuis le clavier est interprété comme un sting. D'où cette situation bizarre si on ne fait pas attention :

>>> note = input() 18 >>> note * 2 '1818'

Pour récupérer un integer, il suffit de le demander poliment à Python avec int() :

>>> note = int(input()) 18 >>> note * 2 36

⚙ 19-B° Modifier uniquement les lignes 2 et 5 de ce programme : il doit parvenir à calculer l'age d'une personne connaissant son année de naissance et l'année actuelle.

1 2 3 4 5 6 7 8 9
print("Quelle est votre année de naissance ? ") naissance = input() print("Quelle est l'année actuelle ? ") actuellement = input() age = maintenant - naissance print("Vous avez : ") print(age)

...CORRECTION...

1 2 3 4 5 6 7 8 9
print("Quelle est votre année de naissance ? ") naissance = int( input() ) print("Quelle est l'année actuelle ? ") actuellement = int( input() ) age = maintenant - naissance print("Vous avez : ") print(age)

⚙ 19-C° Modifier le programme : il doit calculer la somme à payer pour acheter le bon nombre de paquets de chips. Le prix d'un paquet peut inclure des centimes attention.

1 2 3 4 5 6 7
print("Combien coûte un paquet ? ") prix_paquet = input() print("Combien de paquets ? ") nombre_paquets = input() somme = 0 print("Somme à fournir : ") print(somme)

...CORRECTION...

1 2 3 4 5 6 7
print("Combien coûte un paquet ? ") prix_paquet = float( input() ) print("Combien de paquets ? ") nombre_paquets = int( input() ) somme = 0 print("Somme à fournir : ") print(somme)

✎ ✌ 20° Réaliser (puis faire vérifier) un programme qui réalise ceci  :

  1. qui demande le nom d'un utilisateur
  2. qui demande la moyenne de votre première spé
  3. qui demande la moyenne de votre deuxième spé
  4. qui demande la moyenne de votre troisième spé
  5. qui affiche un message contenant le nom de l'utilisateur
  6. qui affiche la moyenne globale en tenant compte des 3 valeurs précédentes
  7. qui affiche un message du style "Va falloir bosser" si la moyenne globale est inférieure à 10.

🏠 TRAVAIL PERSONNEL° Réaliser les exercices supplémentaires en rédigeant correctement vos réponses.

Exercices

5 - FAQ

Rien pour le moment

---

L'activité suivante va se concentrer sur les types construits qui permettent de stocker, non pas une, mais plusieurs données à la fois.

Activité publiée le 28 08 2019
Dernière modification : 26 11 2023
Auteur : ows. h.