Participer au site avec un Tip
Rechercher
 

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 :

Définition de blocs d'instructions et l'indentation en Python

Cloner une collection Les mots clés if, elif et else


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

La vidéo

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.


Dupliquer une collection en Python.

Définition d'un bloc d'instruction

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.
Exemple de définition d'un bloc d'instructions
la ligne 6, qui est vide, ne sert pas à terminer le bloc. Elle est juste là pour aérer le code et le rendre plus lisible. Mais en fait, elle ne sert à rien.

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 !!!")
Exemple de code incorrect

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

Imbrication de blocs d'instructions

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")
Exemple de définition d'un bloc d'instructions à l'intérieur d'un autre bloc.
chaque bloc est bien introduit par un caractère :.

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

Les blocs d'instructions et la PEP 8

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.

PyCharm nous alerte sur le fait que la PEP 8 n'est pas respectée au niveau de l'indentation.

Les variables et la notion de blocs d'instructions

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)
Déclaration d'une variable globale à l'intérieur d'un bloc d'instructions.
la fonction 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


Cloner une collection Les mots clés if, elif et else