Accès rapide :
La vidéo
Définition d'un bloc d'instruction
Imbrication de blocs d'instructions
Les blocs d'instructions et la PEP 8
Les variables et la notion de blocs d'instructions
Cette vidéo revient plus en détails sur la notion de blocs d'instructions et l'utilisation de l'indentation en Python. Les aspects relatifs à la PEP 8 sont aussi abordés.
Nous commençons à bien nous débrouiller en Python et nous avons déjà utilisé quelques instructions telles que le if
, la boucle while
ou encore la boucle for
. Dans les trois cas, l'instruction va s'appliquer à un ensemble de lignes de code, couramment appelé un bloc d'instruction.
Dans certains autres langages de programmation, pour définir un bloc d'instructions, on utilise un marqueur de début (par exemple {
, en C/C++/Java)
et un marqueur de fin (souvent }
). En Python, il nous faut procéder autrement. Il y aura bien un marqueur de début de bloc : c'est le
caractère :
. Mais il n'y aura pas de marqueur de fin. A la place, toutes les instructions faisant partie d'un bloc devront y être indentées d'un
cran vers la droite. Dès qu'une ligne de code revient sur le retrait précédent, le bloc sera terminé. Revoici un exemple de code que nous avions déjà
présenté : il y a bien un bloc associé à l'instruction while
.
1 2 3 4 5 6 7 |
counter = 10 while counter > 0: # A ce niveau, on introduit le bloc d'instructions. print(counter) # Notez la présence d'un retrait équivalent à quatre blancs. counter -= 1 print("Boooummmmmmm !!!") # Cette ligne, n'est plus dans le bloc précédent, car revenue en colonne 1. |
Si à la suite du caractère :
, nous n'avions pas introduit de retrait, le code aurait été en erreur et vous n'auriez pas
pu l'exécuter. Imaginons ce cas:
1 2 3 4 5 6 7 |
counter = 10 while counter > 0: print(counter) # L'absence de retrait vaut pour erreur : le programme ne s'exécutera pas ! counter -= 1 print("Boooummmmmmm !!!") |
Et voici le résultat affiché sur la console si vous cherchez tout de même à exécuter ce code : je pense que le message est suffisamment clair !
File "/home/dominique/Desktop/test.py", line 4 print(counter) # L'absence de retrait vaut pour erreur : le programme ne s'exécutera pas ! ^ IndentationError: expected an indented block after 'while' statement on line 3
Bien entendu, un bloc d'instructions peut contenir un ou plusieurs sous-bloc(s) d'instructions : c'est récursif. Du coup les niveaux de retraits doivent se cumuler. Voici un exemple de code permettant d'afficher une table (à deux dimensions) de valeurs aléatoires.
1 2 3 4 5 6 7 8 |
from random import random for line in range(10): for column in range(10): print(f"{random():.3f}", end=" ") # On retire le retour à la ligne à la fin du print print() # Pour forcer un retour à la ligne print("Matrice générée") |
:
.
Et voici le résultat produit par cet exemple de code.
0.184 0.160 0.226 0.043 0.997 0.831 0.040 0.932 0.825 0.160 0.417 0.126 0.099 0.166 0.944 0.877 0.682 0.607 0.851 0.809 0.057 0.418 0.548 0.787 0.079 0.772 0.703 0.773 0.686 0.369 0.073 0.806 0.109 0.534 0.783 0.179 0.091 0.757 0.568 0.660 0.911 0.515 0.096 0.457 0.997 0.363 0.451 0.382 0.746 0.051 0.848 0.162 0.772 0.080 0.075 0.410 0.629 0.586 0.807 0.633 0.720 0.962 0.220 0.689 0.942 0.671 0.149 0.422 0.586 0.626 0.426 0.053 0.534 0.794 0.895 0.968 0.178 0.997 0.097 0.327 0.586 0.639 0.494 0.502 0.681 0.902 0.216 0.939 0.662 0.222 0.299 0.693 0.810 0.681 0.236 0.610 0.927 0.150 0.227 0.792 Matrice générée
Ca faisait un petit moment que j'en avais plus parlé, mais n'oubliez pas la PEP 8 : « Style Guide for Python Code ». Sur le sujet de l'indentation, la PEP 8 préconise qu'un niveau de retrait corresponde à quatre espaces. Voici un lien direct vers la section de la PEP 8 dédiée à ce sujet. En termes de lisibilité, c'est ni trop peu, ni trop d'espaces. Au cas où, c'est bien la préconisation que j'ai utilisé dans tous les exemples de code depuis le début de ce tuto.
Certains ateliers de développement surveillent de point et c'est notamment le cas de PyCharm : si vous ne respectez pas la convention, des warnings pourront être produits, comme en atteste la capture d'écran ci-dessous.
Pour clore ce chapitre, j'aimerais attirer votre attention sur un dernier point. Dans de nombreux langages de programmations (par exemple, C++ ou Java) la durée de vie de vos variables est très fortement liée à la notion de bloc d'instructions. En Python, il n'en est rien !!!
Il y a deux types de variables en Python : les variables globales visibles dans tous les scripts et les variables locales visibles dans la fonction
(ou la méthode) qui déclare cette variable. Nous parlerons des fonctions et de méthodes dans de prochains chapitres. Pour ce qui est de l'exemple
suivant, il déclare une variable globale dans un bloc associé à l'instruction if
. Pour autant, on peut continuer à utiliser cette variable
en dehors du bloc, comme en atteste ce code.
1 2 3 4 5 6 7 8 |
value = 5.4 if value > 5.0: message = "On déclare la variable message" print(message, "et on l'utilise dans le bloc d'instructions") if 'message' in globals(): print("Mais on a encore accès à message ici :", message) |
globals
permet de produire la liste des variables globales
existantes. Via l'opérateur in
, on vérifie que la variable message
est bien définie.
Le nom de la variable pour laquelle tester la présence, doit être passé sous forme d'une chaîne de caractères.
Son homologue, locals
, permet de récupérer la liste des variables locales
accessible à partir d'une fonction (ou une méthode).
Et voici l'affichage produit par l'exemple précédent.
On déclare la variable message et on l'utilise dans le bloc d'instructions Mais on a encore accès à message ici : On déclare la variable message
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :