Autres expressions

Identification

Infoforall

3 - Types des expressions


Nous allons continuer à afficher des choses via la Console Python. Nous allons ainsi voir qu'on peut faire bien d'autres choses que d'évaluer et d'afficher des expressions numériques.

Pour cela, il va falloir se rendre compte que Python classe ce qu'il doit évaluer dans plusieurs catégories.

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

Evaluation ✎ : questions 04-09-10-11

Documents de cours : open document ou pdf

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

1 - Types d'expressions

Lorsqu'on fournit des expressions à l'interpréteur Python, celui-ci va les évaluer.

Pour l'instant, ces expressions étaient des expressions mathématiques qui répondaient donc en fournissant un nombre.

Nous avons vu deux types de nombres. Pour connaitre le type d'une réponse, il suffit d'utiliser la fonction native type().

01° Utiliser les lignes de commande ci-dessous pour voir que Python gère les nombres en les classant dans deux catégories :

  • les integers (les entiers) et
  • les floats (les nombres à virgule flottante).
>>> 5*5 25 >>> type(5*5) <class 'int'> >>> 5.0*5.0 25.0 >>> type(5.0*5.0) <class 'float'> >>> 5*5.0 25.0 >>> type(5*5.0) <class 'float'>

Mais il existe d'autres types de réponses possibles.

On peut ainsi demander à l'interpréteur de gérer des chaînes de caractères (strings en anglais).

On doit fournir les strings entourées de guillemets simples ' ' ou doubles " ".

L'interpréteur utilise lui toujours des guillemets simples lorsqu'il présente un string.

>>> "Hello World !" 'Hello World !' >>> 'Hello World !' 'Hello World !' >>> type("Hello World !") <class 'str'>

Sans guillemet, l'interpréteur ne peut pas comprendre que vous voulez lui fournir un string :

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

Il existe également une réponse correspondant aux tests logiques : les réponses booléennes, qui ne peuvent valoir que deux états :

  • True en Python : état HAUT, 1, VRAI ...
  • False en Python : état BAS, 0, FAUX...
>>> 5 > 10 False >>> type(5 > 10) <class 'bool'> >>> 5 < 10 True

Nous allons voir ce que nous pouvons faire avec ces strings et ces booléens.

2 - Strings : afficher des caractères sur la console

Pour l'instant, toutes les expressions contenant des opérations étaient à base de nombres. Regardons comment Python gère les opérations sur les strings.

02° Quelle est la différence d'affichage entre les deux versions ?

>>> "Hello World !" 'Hello World' >>> print("Hello World !") Hello World

...CORRECTION...

On affiche deux fois  Hello World ! , mais pas de façon identique.

La première fois, l'expression est juste évaluée : la console affiche donc le résultat entouré de guillemets simples ( '  et  ' ) pour indiquer qu'il s'agit d'une chaîne de caractères.

La seconde fois, on utilise la fonction print qui permet d'afficher le contenu passé entre parenthèses. La différence ? Uniquement l'absence des guillements simples pour l'instant. Nous verrons néanmoins que lorsque nous réaliserons un programme, il faudra utiliser print de façon à afficher le résultat.

Pour l'instant les deux méthodes fonctionnent mais le print est ici inutile : en mode interactif, la console affiche directement les contenus qu'on lui demande.

03° Et là ?

>>> print( "Hello W" + "orld !" ) >>> "Hello W" + "orld !"

...CORRECTION...

Dans les deux cas, on voit s'afficher  Hello World !  dans la console.


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.

Ce qui apparaît en bleu se nomme un STRING en python : une chaîne de caractères en français.

Mais, comment Python parvient-il à savoir qu'il veut afficher un string et qu'il ne s'agit pas d'instructions ?

Strings

Un string commence avec des guillements doubles  "  et finit par des guillemet doubles  "  :

# Commence et finit par une guillemet double " " "Hello World !"

Mais on peut également utiliser des guillemets simples  '  :

# Commence et finit par une guillemet simple ' ' 'Hello World !'

Par contre, on doit fermer un string avec le même type de guillemets en ouverture et en fermeture.

Le code suivant ne permet pas de créer un string : on ouvre avec un guillement simple mais on tente de fermer avec un guillement double ! Et l'interpréteur Python ne s'y retrouve plus...

# Commence par une guillemet simple mais finit par une guillemet double donc erreur : ' " 'Hello World !"

Si on utilise un guillemet double en ouverture, on ne peut donc plus l'afficher dans le string : Python va croire qu'on ferme le string !

"On tente souvent d'écrire "Hello World !" pour tester un nouveau langage."

En réalité, on peut afficher des guillemets doubles " et c’est simple : on utilise l’antislash  \  avant le signe lui même.

✎ 04° Expliquer pourquoi on obtient l'affichage visualisé et pas un autre :

>>> "Comme on dit souvent : \"Hello World !\"" 'Comme on dit souvent : "Hello World !"'
Slash ou Antislash ? Comment retenir ?

Le slash 'normal', celui qui monte,  / , se nomme slash ou barre oblique.

L'autre, celui qui descend,  \ , se nomme antislash ou backslash ou barre oblique inversée.

Du coup, l’antislash est un caractère spécial puisqu’il sert à coder des fonctions particulières comme la tabulation. Comment afficher un antislash alors ? C’est simple … on en met deux à la suite.

Caractère d'échappement

L'antislash \ est le caractère d'échappement de Python dans les chaînes de caractères : lorsque l'interpréteur le rencontre, il sait alors que le caractère suivant ne doit pas être interprété "normalement" :

  • \t veut dire de créer une tabulation et pas juste afficher t.
  • \n veut dire de passer à la ligne et pas juste afficher n.
  • \" veut dire d'afficher " et pas de considérer qu'il s'agit de la fin d'un string ouvert avec ".
  • \\ veut dire d'afficher \ : le second antislash n'est pas le caractère d'échappement.

05° Lancer les lignes suivantes et observer le résultat.

>>> print("Nom\tPrenom\tAge") Nom Prenom Age >>> print("Nom\nPrenom\nAge") Nom Prenom Age >>> print("Voilà un antislash \\") Voilà un antislash \

...CORRECTION...

Vous devriez voir que \t permet de créer une tabulation.

Vous devriez voir que \n permet de passer à la ligne.

Vous devriez voir que \\ permet d'afficher l'anti-slash.

Mais pourquoi mettre un print() ici ?

La réponse est simple : sans ça ne fonctionne pas ! Les caractères spéciaux ne sont pas "exécutés".

>>> "Nom\nPrenom\nAge" 'Nom\nPrenom\nAge' >>> print("Nom\nPrenom\nAge") Nom Prenom Age

Sans print(), l'interpréteur donne simplement le contenu. Pour activer l'affichage des caractères de contrôle à l'intérieur de la chaîne, le print() est obligatoire.

Depuis la console interactive de Python, pour afficher 120 en nombre ou en string, il y a donc deux façons de faire :

  1. Demander à Python d'évaluer l'expression : on garde alors son type
  2. Utiliser print() qui va créer un affichage à destination d'un humain : on perd alors l'indication du type réel de la donnée. Attention.

>>> '120' '120' >>> print("120") 120
>>> 120 120 >>> print(120) 120

Comme vous pouvez le voir, le print() a fait disparaitre visuellement le type de "120" ou 120. Sans print, on garde par contre le type et on voit bien que "120" est du même type qu'une chaîne comme "ABC".

Conclusion : la fonction native print() est destinée (en partie) à afficher des informations à destination d'un humain regardant la console. Pour l'instant, sa seule utilité est de permettre d'afficher correctement des strings contenant des caractères d'échappement et de contrôle : passage à la ligne, tabulation...

06° 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

07° 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.

08° 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.

Nous allons voir dans une autre activité qu'on peut faire beaucoup de choses avec les strings. Regardons simplement quelques applications rapides des strings.

Compter les caractères

Pour compter le nombre de caractères, nous pouvons utiliser la fonction native len(), qui vient de length en anglais, longueur en français.

>>> len("bonjour") 7

✎ 09° Combien de caractères dans :

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

✎ 10° Expliquer si le passage à la ligne compte comme un ou deux caractères en analysant les réponses suivantes :

>>> len('\n') 1 >>> len('\n\n\n') 3

Deuxième question : un fichier texte ne contenant que 2000 passages à la ligne pèse-t-il plus lourd qu'un fichier vide ?

On peut également trouver assez facilement si une chaîne de caractères se trouve dans une autre chaîne de caractères.

Imaginons que vous vouliez savoir si la chaîne "soja" apparaît dans la composition d'un produit car vous êtes allergique au soja. Par contre, vous n'avez pas envie de vous taper toutes les compositions des différentes choses que vous achetez. L'informatique peut automatiser la tâche.

Voici la composition d'un des gateaux :

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

Mot-clé in

Le mot-clé in permet de savoir si un élément a est présent dans un élément b.

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

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

Et si vous étiez allergique 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

✎ 11° ACAT est-il présent dans la séquence ADN suivante ?

TACAGTGTGCCACATCCGGTTGTTAGAGATTCCCGATCAGTAGAAACCCATGGCCCACGGTGTACTTGCCATATATTCTACACTATGGACGCATAGGATAGCCTATGTAACCAAGGTTACGCCTGACATACGAACCAGGTTTAGTTCGTCACCAGATTTGGGGCCCAGTGCTATGGTAACTTTACGCACATTTCGCGAGC

3 - Expressions Booléennes

Booléens

Les booléens sont des données ne peuvent prendre que deux valeurs : True ou False en Python.

Ce nom provient de mathématicien Georges Boole qui est parvenu à créer un algébre permettant à la logique de s'exprimer sous forme mathématique.

Attention en réalité, il s'agit simplement d'avoir deux valeurs possibles, elles peuvent valoir ce qu'on veut :

  • 1 ou 0
  • True ou False
  • Vrai ou Faux
  • Haut ou Bas
Expressions booléennes

Ce sont des expressions qui seront évaluées à True ou False en Python.

La plupart du temps, il s'agit d'utiliser un opérateur spécifique entre deux contenus.

  • "Supérieur" à est encodé avec > (et inférieur à avec <)
  • >>> 5 > 12 False >>> 12 > 5 True

    A lire comme "Est-ce que 5 est supérieur à 12 ?" et "Est-ce que 12 est supérieur à 5 ?".

  • Supérieur ou égal est encodé avec >= (et inférieur ou égal avec <=)
  • >>> 5 >= 6 False >>> 5 >= 5 True
  • Tester une égalité entre deux contenus est possible avec ==
  • >>> 5 == 6 False >>> 5 == 5 True
  • Tester une différence entre deux contenus est possible avec !=
  • >>> 5 != 6 True >>> 5 != 5 False
  • Tester l'appartenance est possible avec in
  • >>> 'bon' in 'bonjour' True >>> 5 in [1, 5, 10, 12] True

12° Que faut-il taper pour savoir si 12 au carré 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

13° Que faut-il taper pour savoir 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

14° Comment pourriez-vous justifier cette réponse ? 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" arrive après "Hello" dans un dictionnaire.

4 - FAQ

Pourquoi ce nom, "fonction native" pour type ou print ?

Nous verrons les fonctions un peu plus tard mais puisque vous en parlez, autant répondre à la question...

Une fonction est un ensemble d'instructions qui ont été prédéfinies à l'avance pour réaliser une tâche.

Lorsqu'on utilise type ou print, on remarquera la présence systématique des parenthèses () : c'est entre les parenthèses qu'on place les données qu'on veut voir traiter.

Cette manière de faire est celle qui a été choisie dans les langages de programmation. C'est juste une codification pour que l'ordinateur comprenne ce que vous voulez.

Exemple 1 :

type(5 > 10)

Lorsqu'on tape cela, l'interpréteur Python comprend qu'on lui demande de faire appel au code de type en la faisant travailler avec 5 > 10.

Exemple 2 :

print("BON" * 2)

Lorsqu'on tape cela, l'interpréteur Python comprend qu'on lui demande de faire appel au code de print en la faisant travailler avec "BON" * 2.

Pourquoi "native" ?

C'est le nom qu'on donne aux fonctions qui sont utilisables de base, sans avoir à la créer ou les activer d'une quelconque façon.

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 … »

15 Logique ou pas ?

...CORRECTION...

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 : 12 06 2021
Auteur : ows. h.