Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! Découvrez la Bibliothèque Numérique ENI. Cliquez ici
Formations en ligne à Excel, Word, Office, Teams... Formez-vous en toute autonomie. Je les découvre !
  1. Livres et vidéos
  2. Python
  3. Structure du langage Python
Extrait - Python Apprenez à développer des projets ludiques (2e édition)
Extraits du livre
Python Apprenez à développer des projets ludiques (2e édition)
4 avis
Revenir à la page d'achat du livre

Structure du langage Python

Introduction

Si vous lisez ce livre, c’est que vous avez un objectif : découvrir la programmation, créer un jeu, apprendre le langage Python, savoir en quoi consiste un langage de programmation, créer une petite application, mettre en place une idée qui vous trotte dans la tête, faire des exercices pour vous entraîner ou acquérir des connaissances supplémentaires !

Tous ces objectifs vont passer par l’écriture de lignes de code constituant la source de votre programme. Ces lignes de code sont stockées dans des fichiers texte ayant l’extension py. Ces fichiers sont modifiables dans tout éditeur de texte, comme Notepad et WordPad sous Windows ou TextEdit sous Mac. Généralement, on préfère utiliser un environnement spécialisé pour plus de confort. Ce type d’environnement permet par exemple de colorer les mots-clés du langage dans une certaine couleur et les variables dans une autre couleur.

L’ordinateur ne sait pas exécuter du code stocké dans un format texte. Pour lancer un programme, l’environnement Python transforme ce que vous avez tapé au clavier pour le traduire dans le langage propre au processeur de l’ordinateur. Gardez en tête que le code est la description d’un programme sous forme de texte. C’est à l’interpréteur Python que revient la tâche de transformer ce texte en programme exécutable par la machine.

Peut-être connaissez-vous un peu les processeurs du marché. Pour les Mac, on trouve principalement des processeurs Intel depuis quelques années, qui ont succédé aux processeurs PowerPC...

Les variables

1. Usage

Une variable sert à représenter une valeur par un nom. Vous retrouvez ici un concept assez proche de ce que vous connaissez en mathématiques ou en physique. Cependant, il y a quelques différences :

  • En informatique, une variable est toujours connue, car elle est associée à une case mémoire qui contient sa valeur. Le concept d’inconnue n’existe pas !

  • En informatique, une variable évolue, sa valeur change au cours du temps suivant les actions effectuées durant l’exécution du programme. Lorsque l’on modifie une variable, la nouvelle valeur écrase la précédente et l’ancienne valeur est oubliée. En mathématiques et en physique, les inconnues ont une unique valeur !

2. Nommage

Si vous deviez retenir une seule consigne de cet ouvrage, ce serait sûrement celle-ci car elle est la plus importante dans la vie d’un informaticien. Nous insistons car elle sera souvent oubliée, maltraitée, contournée par habitude et cela conduira à l’échec. Nous voulons parler du choix du nom d’une variable. Nos cousins les mathématiciens ou les physiciens ont pour usage de choisir des noms d’inconnues les plus courts possible. Ainsi, on voit fleurir sur les pages de nos livres et de nos cahiers des x, des y ou des α et nous y sommes habitués. Pourquoi ce choix ? Pour deux raisons principales : d’une part, ces matières se sont historiquement construites à l’époque du crayon/papier et le premier objectif dans une page de calcul était de limiter la quantité d’informations à...

Les types des variables

Durant l’affectation, le type des variables est choisi automatiquement en fonction de ce qu’on trouve à la droite du symbole =. Nous utilisons la fonction Python type() afin de savoir ce qui a été décidé. La fonction print() permet d’afficher le résultat à l’écran :

a = 1 
print(type(a)) 
a = 1.0 
print(type(a)) 
a = 'Bonjour' 
print(type(a)) 
 
>> <class 'int'> 
>> <class 'float'> 
>> <class 'str'> 

À la première ligne, nous associons le nombre 1 à la variable a. Comme ce nombre est sans virgule, la convention veut qu’il soit stocké comme un nombre entier : integer en anglais ou en abrégé class int. À la troisième ligne, la valeur 1.0 désigne cette fois un nombre à virgule. Automatiquement, l’interpréteur bascule vers ce type dénommé class float. Dans la dernière affectation, on trouve du texte entouré par des guillemets, c’est le code pour désigner une chaîne de caractères, string en anglais ou encore class str.

Type ou classe ? Vous entendrez l’une ou l’autre désignation. Ne vous inquiétez pas, ces deux termes désignent exactement le même concept. Le terme « type » est apparu en premier avec les variables. Le terme « classe » est plus récent car il est relié à la programmation objet. Dans d’autres langages, comme en Java/C++/C#, on distingue les types primitifs (les nombres essentiellement)...

Les opérations sur les chaînes de caractères

1. Le standard Unicode

Le standard Unicode maintient une table de codes contenant plus de 100 000 caractères et autres symboles, ceci pour environ une centaine de systèmes d’écritures. Les valeurs comprises entre 0 et 128 sont similaires aux valeurs de la table de caractères ASCII apparue dans les années 1960 et encore largement utilisée dans les ordinateurs jusque dans les années 2000. Dans ces tables, la valeur 32 correspond au caractère espace, la plage de valeurs 48 à 57 correspond aux chiffres de 0 à 9, la plage 65 à 90 donne les lettres majuscules de A à Z et la plage 97 à 122 correspond aux lettres minuscules de a à z.

Il existe deux fonctions chr() et ord() qui permettent de convertir un code en caractère, et inversement, en suivant le standard Unicode. Ainsi, si vous faites une recherche rapide sur Internet, vous trouverez que le symbole smiley correspond au code 128512, et que l’écriture de ce code en hexadécimal est 0x1F600. En langage Python, il n’y a pas de type caractère comme dans d’autres langages. Les fonctions retournant un caractère retournent ainsi une chaîne avec ce seul caractère à l’intérieur. Voici un exemple :

A = chr(128512) 
B = chr(0x1F600) 
print(A) 
print(B) 
print(type(A)) 
print(ord("A")) 
print(ord("0")) 
 
>> images/smileysouriant.PNG 
>> images/smileysouriant.PNG 
>> <class 'str'> 
>> 65 
>> 48  

2. Concaténer deux chaînes

Le type chaîne de caractères permet d’utiliser...

Les conditions

1. Les conditions simples

Une condition permet d’effectuer un branchement dans un programme. C’est-à-dire que suivant le résultat d’un test, nous allons décider d’exécuter une partie A du code ou une partie B. Si on compare un programme à une suite d’opérations disposées sur une route, le test correspond à un embranchement où l’on doit choisir de tourner à droite ou à gauche. En Python, le résultat d’un test prend deux valeurs : False pour désigner un résultat faux et True pour désigner un résultat correct. Voici un exemple de la syntaxe :

if age >= 18 : 
     print("majeur") 
else : 
     print("mineur") 

Contrairement aux autres langages, il n’est pas nécessaire de commencer le test par une parenthèse ouvrante et de le terminer par une parenthèse fermante. Le mot-clé if ("si" en français) désigne le début d’une condition. Après le if, nous trouvons le test exprimé sous forme d’une condition : age >= 18. La fin du test est marquée par l’utilisation du symbole : et d’un retour à la ligne. Plus loin, nous trouvons le mot-clé else suivi du symbole : et d’un retour à la ligne indiquant le début de l’autre embranchement.

L’indentation est un point cher à Python. L’indentation correspond à la disposition particulière du code faisant apparaître des décalages depuis la marge gauche. L’indentation imposée par Python s’avère...

Les fonctions natives

Dès son lancement, l’interpréteur Python met à disposition du développeur plusieurs fonctions natives (built-in functions en anglais), comme la fonction print(). Ce ne sont pas des mots-clés du langage. Nous présentons les fonctions les plus couramment utilisées.

1. Les fonctions natives de conversion

Nous les avons déjà rencontrées, il s’agit des fonctions permettant de convertir un type en un autre type : int(), float(), str(), et des fonctions permettant de passer d’un code Unicode au caractère associé : chr() et ord().

Il existe deux fonctions permettant de convertir un nombre entier dans sa représentation binaire (suite de 0 et de 1) ou hexadécimale (nombre écrit en base 16). Il s’agit des fonctions bin() et hex() retournant toutes deux une chaîne de caractères. Ainsi, bin(128) retourne ’0b10000000’ et hex(128) retourne ’0x80’.

2. Les fonctions natives mathématiques

Nous trouvons des fonctions très utiles comme le calcul du maximum ou de la valeur absolue. Nous les présentons ci-après :

  • abs(-3) 3 : calcule la valeur absolue.

  • max(4,5) 5.

  • max(4,5,6) 6 : calcule le maximum entre trois valeurs.

  • min(4,5,6) 4.

  • round(7.2) 7 et round(7.8) -} 8 : arrondit à l’entier le plus proche.

  • round(7.123456,3) 7.123 : arrondit à trois chiffres après la virgule.

Hormis la fonction round(), les autres fonctions s’adaptent automatiquement au type des données en entrée pour ’’choisir" leur type de retour. Par exemple, lorsque la fonction max() reçoit deux...

La boucle for avec indice

La condition if permet d’effectuer un branchement en choisissant d’exécuter une certaine partie du code ou non. Une boucle for consiste à exécuter plusieurs fois une même partie du code. Cette partie, que nous appelons le corps de boucle, correspond aux lignes qui suivent l’instruction for. Le corps de boucle doit avoir une indentation plus importante que l’instruction for associée. Lorsque l’indentation revient au même niveau que celui de l’instruction for, cela signifie que le corps de boucle s’est achevé. La boucle for avec indice nécessite de spécifier le nom de la variable stockant l’indice. Juste après le mot-clé in, on précise la plage de valeurs que va parcourir l’indice. Par exemple, la fonction native range(4) définit une plage de valeurs allant de 0 à 3 : 0, 1, 2 et 3. En résumé, nous identifions le corps de boucle ainsi :

……… 
for i in range(4) :        # Démarrage boucle for - indice : i 
   ………                     #  || Corps de boucle 
   ………                     #  || 
   ………                     #  || 
   ………                     #  \/ Fin du corps de boucle 
………   

Si on choisit comme plage de valeurs :...

La structure lexicale d’un langage

Nous allons vous montrer qu’un langage informatique, y compris Python, dispose de sa propre grammaire interne. Lorsque l’interpréteur Python parcourt le code, il cherche à catégoriser tout ce qu’il rencontre. Nous avons suffisamment présenté de concepts dans ce chapitre pour lister les catégories principales :

  • Commentaires

# Bonjour

  • Indentations

  • Délimiteurs

: (   )

  • Mots-clés

    • Instruction

    • Opérateurs logiques

if then else  
and or not 
  • Constantes 

"Bonjour", 17, 3.14

  • Opérateurs

    • Calcul

    • Affectation 

+ - / * 
= 
  • Identificateurs

    • Variable 

    • Fonction native

    • Fonction

 

créée par le développeur

print abs 

créée par le développeur

Nous détaillons chaque point ci-après :

  • Les commentaires consistent à écrire des informations utiles pour le programmeur, mais ne produisant aucune action lors de l’exécution.

  • L’indentation permet à l’interpréteur d’identifier les sous-parties du code associées à certaines instructions comme l’instruction if.

  • Les délimiteurs sont importants pour structurer le code, on oublie souvent leur existence tellement ils passent inaperçus. Par exemple, vous trouvez le symbole : à la fin d’une condition if, les parenthèses (  ) qui délimitent une expression, le symbole ’ qui marque le début et la fin d’une chaîne… On peut dire que les délimiteurs correspondent à la ponctuation dans un langage naturel. 

  • Les mots-clés représentent une liste...

Les messages d’erreur

Il existe deux grands types d’erreurs : les erreurs détectables lors de la traduction du source en programme et les erreurs apparaissant lors de l’exécution. Les premières correspondent généralement à des erreurs de syntaxe : faute de frappe, terme inconnu, structure incorrecte… Les secondes correspondent à des erreurs durant le déroulement du programme : tentative de division par zéro (c’est interdit), ouverture d’un fichier non existant ou encore utilisation d’un élément non initialisé...

Python, par la simplicité de son langage, permet de gagner beaucoup de temps de développement en réduisant les erreurs de syntaxe, ce qui reste très appréciable pour les développeurs débutants comme pour les plus confirmés.

Vous vous sentez fin prêt pour taper vos premières lignes de code ! Il faut néanmoins prendre le temps d’étudier la gestion des erreurs. En effet, depuis le plus jeune âge de l’informatique, les messages d’erreur sont peu compréhensibles. Ceci pour plusieurs raisons. D’une part, ils sont rédigés dans la langue de Shakespeare et il s’agit souvent de termes techniques que vous ne trouverez pas dans un dictionnaire. Ensuite, ils sont donnés dans un certain contexte, le contexte où l’interpréteur Python pensait être avant "le déraillement". Ainsi, si l’interpréteur pense qu’il est en train de lire une condition alors que ce n’est pas du tout le cas, vous obtiendrez un message d’erreur...

Exercices d’application

Les exercices d’application vous permettent d’utiliser et d’appliquer les connaissances présentées dans ce chapitre. Ils sont guidés et très encadrés.

1. Série de calculs

L’objectif de cet exercice est d’indiquer la valeur d’initialisation de chaque variable. Vous allez travailler avec www.pythontutor.com. Le simulateur se trouve à la page : http://www.pythontutor.com/visualize.html.

A = 3 
B = 10 * 2 
C = A * B + 5 
D = 40 
E = C + D 

Correction guidée :

La première ligne a initialisé la variable A à la valeur 3.

images/03RI01.png

À la deuxième ligne, nous trouvons à droite de l’affectation une expression. Nous devons donc évaluer ce calcul avant d’initialiser la variable B. Ainsi, une fois le résultat obtenu, soit 20, nous nous en servons pour initialiser la variable B.

images/03RI02.png

À la troisième ligne, nous avons une expression à droite de l’affectation. Cette expression dépend des variables A et B. Nous lisons leurs valeurs et effectuons le calcul pour obtenir 65. Cette valeur sert à initialiser la variable C.

images/03RI03.png

La quatrième ligne initialise la variable D à la valeur 40. À la dernière ligne, nous devons lire les valeurs des variables C et D pour évaluer l’expression valant 105. Cette valeur sert à initialiser la variable E.

images/03RI04.png

2. Série de calculs imbriqués

L’exercice suivant reprend la démarche du précédent. Cette fois cependant, la variable A change de valeur au cours de l’exécution :

A = 3 
A = A * A 
A = 10 - A 
A = A + 1 ...

Exercices d’entraînement

Dans les exercices d’application précédents, vous deviez comprendre le fonctionnement d’un morceau de code. Maintenant, nous allons pour chaque exercice décrire les objectifs devant être remplis par votre programme. C’est à vous que revient la lourde tâche d’organiser le code. Génial ! Vous avez enfin les mains sur le volant. Attention, pensez à retirer le frein à main !

1. Afficher un mot à l’envers images/etoile.png

La correction de cet exercice est disponible en téléchargement sur le site de l’éditeur. Demandez à l’utilisateur d’entrer un mot au clavier. Ensuite, écrivez-le à l’envers, c’est-à-dire de droite à gauche. Voici quelques conseils :

  • Utilisez une boucle for avec indice, le nombre de lettres correspond aux nombres d’itérations.

  • L’écriture mot[i] parcourt les caractères de gauche à droite. Ce n’est pas ce que nous voulons. Calculez à partir de la valeur de l’indice, et éventuellement de la longueur du mot, un autre indice partant de la droite et se déplaçant vers la gauche. Deux approches sont possibles, en utilisant une valeur d’indice positive ou négative.

  • Affichez les caractères un à un en utilisant la fonction print(...,end=’’’’) pour éviter les retours à la ligne.

  • Pensez à faire des tests.

2. Calculer la valeur du polynôme 3x² + 5x + 1 images/etoile.png

La correction de cet exercice est disponible en téléchargement sur le site de l’éditeur. Demandez à l’utilisateur...

Projets

Les projets sont des exercices longs. Pour éviter un énoncé complexe, nous prenons des exemples amusants de la vie courante que vous devriez déjà connaître. L’organisation du programme devient un peu plus difficile. Vous devrez peut-être utiliser des fonctions hors programme ou des astuces. Mais dans ce cas, toutes les informations vous seront données dans l’énoncé. L’objectif est d’arriver à un programme fonctionnel, amusant et de qualité.  

1. Le jeu du pendu images/etoile.pngimages/etoile.png

La correction de ce projet est disponible en téléchargement sur le site de l’éditeur. Le jeu du pendu consiste à trouver un mot en devinant les lettres qui le composent. Nous vous proposons de mettre en place une version simplifiée, mais relativement complète. Pour rendre le code plus simple, vous ne traiterez que des mots avec des lettres différentes. Cela permet d’éviter la gestion des doublons.

Voici vos objectifs :

  • Au démarrage du jeu, affichez : "Jeu du pendu !!".

  • Demandez au joueur d’entrer une lettre suivie d’un appui sur la touche [Entrée]. 

  • L’utilisateur doit faire six propositions de lettre, ni plus, ni moins.

  • Si la lettre n’est pas présente dans le mot, affichez "#˽# ... #˽#" avec autant de symboles # que de lettres à deviner.

  • Si la lettre est présente dans le mot, il faut indiquer sa position. Par exemple, s’il s’agit de la "X" à la troisième position en partant de la gauche pour un mot de six lettres, l’affichage sera...