Autres expressions

Identification

Infoforall

4 - Types simples


Nous allons ainsi voir qu'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 : 6 questions.

 questions 07-09-13-17-19

  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.

Pour connaître le type attribuée à une expression, il suffit d'utiliser la fonction native type().

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

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

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'>

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

On retrouve tous les opérateurs 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 (même si on aura toujours 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 même s'il s'agit en réalité d'un entier d'un point de vue purement mathématique.

    float % float -> float

    float % int -> float

    int % float -> float

    >>> 23.0 // 5.0 3.0 >>> 23.0 // 5 3.0 >>> 23 // 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 nombres 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 à 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 les lignes de commande puis donner le nom des différents types de valeurs obtenues sur les 3 exemples :

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

...CORRECTION...

>>> 5 * 5 25

Entier donc integer

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

Nombre à virgule (même si c'est zéro derrière) donc flottant.

Attention, en math le nombre 25 et le nombre 25.0 représente bien le même nombre.

En informatique, l'information 25 ou l'information 25.0 ne représente 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. Expliquer pourquoi l'évaluation de la comparaison entre les deux termes de l'égalité donne Faux en Python alors qu'elle devrait donner Vrai.

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

Si vous n'avez jamais vu cet opérateur ==, il signifie simplement 'Est-ce que les deux termes sont identiques ?'. Ainsi a == b revient à demander à Python, "a est-il identique à b ?".

...CORRECTION...

Mathématiquement cela devrait fonctionner.

7 / 10 donne 0,7 et 7 * 0.1 donne 0.7.

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.

On lui pose alors la question de savoir si le premier résultat vaut exactement le deuxième résultat pour lui. Et comme les deux calculs sont presque identiques pour lui mais pas 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 permettant de gérer les textes se nomme souvent string. Il s'agit d'un conteneur formant une collection ordonnée d'éléments qui sont tous des caractères.

String est un mot anglais qui signifie "chaîne" en français. Or, un texte est une chaîne de caractères : un ensemble 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

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

Déclaration

Un string Python est délimité par deux indicateurs signalant le début et la fin du string.

Cet indicateur peut être :

  • 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 commence avec un double, on finit avec un double. Si on mélange, l'interpréteur Python perd le fil : c'est une erreur de syntaxe.
  • >>> "Hello World !' File "", 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 ''
2.3 STRING : opérateurs Python

On va retrouver une partie des symboles de opérateurs applicables sur les valeurs numériques mais leur signification n'est pas exactement la même.


  • concaténation avec +
  • str + str -> str

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

    La concaténation correspond à une sorte d'addition, mais la mécanique utilisée est celle d'un juxtaposition. D'où l'utilisation d'un autre terme.

    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' ?

    Avec Python, on notera qu'on ne peut pas concaténer ou additionner un string et un nombre. C'est un peu logique d'ailleurs. Que répondriez-vous en tant qu'humain à ceci :?

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

  • 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 '####################'

  • 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° Deux questions :

  • Quel est le type de données sur l'exemple 1 ?
  • Pourquoi l'interpréteur ne parvient-il pas à comprendre qu'on veut sur l'exemple 2 ?

Exemple 1

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

Exemple 2

>>> Hello World ! File "<stdin>", line 1 Hello World ! ^ SyntaxError: invalid syntax

...CORRECTION...

Il s'agit d'un string.

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° Répondre à ces questions 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 semble coder un guillemet d'ouverture suivi immédiatement qu'un guillemet de fermeture ?
  6. >>> "" * 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. 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° Tenter de deviner ce que vont afficher les codes suivants. Tapez et exécutez le code une fois que vous pensez avoir la réponse.

>>> 120 * 2 >>> "120" * 2 >>> "120" + 2

QUESTION : A votre avis, pourquoi le dernier cas ne donne-t-il rien d’interprétable ?

...CORRECTION...

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.

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.

✎ 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.

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

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.

>>> "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.

✎ 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° Etudier les résultats des évaluations suivantes. Définir alors la priorité des opérateurs logiques (> < == in) par rapport aux opérateurs arithmétiques classiques :

  • plus prioritaires (on commence par l'évaluation des opérateurs logiques)
  • moins prioritaires (on finit par l'évaluation des opérateurs logiques).
>>> 40*2 + 10 == 50 + 40 True >>> 10*2 + 10 > 50 + 40 False

...CORRECTION...

Les opérateurs logiques ont une priorité plus basse que les opérateurs arithmétiques.

On commencera donc par les opérateurs "classiques", et on finit par les opérateurs booléens. C'est comme si nous avions tapé ceci :

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

15° Un élève propose ceci :

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

Que peut-on dire de son expression ?

  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

...CORRECTION...

Réponse B.

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

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équentielle.

...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 = "2022" >>> age = maintenant - naissance TypeError: unsupported operand type(s) for -: 'str' and 'str'
4.1 Variable "vide" mais du bon type

Python intègre plusieurs fonctions natives permettant de créer un contenu "vide" ayant néanmoins le bon type voulu. Regardons ce que sont les contenus par défaut d'un type simple qu'on n'a pas encore "rempli".

Création d'un contenu vide
  • 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) False >>> bool(5) True >>> bool(5.2) True >>> bool(0.0) False >>> bool("5") True >>> bool("5.2") True >>> bool("bonjour") True >>> bool("") 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° 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

Modifiez alors le programme pour qu'il 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 (sur l'exemple, on répond Bonjour).

>>> reponse = input() 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'

Si vous voulez récupérer un integer, il suffit de le demander poliment à Python :

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

✎ 19° Modifier le programme malbouffe.py : il doit calculer la somme à payer pour acheter le bon nombre de paquets de chips.

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)

Il faut modifier notamment la ligne 5 et utiliser des fonctions pour convertir les entrées-clavier.

✌ 20° Réaliser un programme

  • qui demande le nom d'un utilisateur
  • qui demande la note de votre première spé
  • qui demande la note de votre deuxième spé
  • qui demande la note de votre troisième spé
  • qui affiche un message contenant le nom de l'utilisateur
  • qui affiche sa moyenne de spé et
  • qui affiche un message du style "Va falloir bosser" uniquement si la moyenne est inférieure à 10.

🏠 TRAVAIL PERSONNEL° Réaliser les exercices supplémentaires Maison (voir le lien) en rédigeant correctement vos réponses.

Exercices

5 - FAQ

Rien pour le moment

---

L'activité suivante va se concentrer sur la notion de variables.

La blague du jour : Le problème de la logique des informaticiens :

Ma mère : « Mon chéri, peux-tu aller au supermarché et me ramener une bouteille de lait. Si ils ont des œufs, prends en 6 ».

Je suis revenu avec 6 bouteilles de lait.

Ma mère a dit : « Pourquoi as-tu pris 6 bouteilles de lait ?»

J’ai répondu : « Car ils avaient des œuf … »

conclusion Logique ou pas ?

Pour comprendre cela, il faut bien entendu suivre ces instructions à la lettre :

  • Si il n'y a d'oeuf, prendre 1 bouteille de lait.
  • Si il y a des oeufs, prendre 6 bouteilles de lait

L'air de rien comprendre cela permet de comprendre qu'un ordinateur ne fait que suivre séquentiellement les instructions qu'on lui impose. Il ne tente jamais d'y mettre du sens et de tenter de comprendre ce que vous voulez réellement. Il exécute. Point.

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