Synthèse



Déclaration d'un sous-programme

Un sous-programme n'existe (et par conséquent ne peut être utilisé) que s'il est déclaré.

La déclaration d'un sous-programme contient les instructions à exécuter. Elle défini son nom et ses paramètres éventuels.

De manière générale, la déclaration d'un sous-programme comprend une entête (première ligne) et un corps (bloc d'instructions qui suit). L'entête contient le nom du programme et la liste (éventuellement vide) des paramètres:

def  Nom du sous-programme ( liste des paramètres ) :
    Bloc d'instructions
    

Les paramètres

La liste des paramètres figure juste après le nom du sous-programme. Elle peut être vide, contenir un seul paramètre ou dans le cas le plus complexe, plusieurs paramètres séparés par des virgules:


( Nom,  Nom, ....,  Nom )

Les paramètres déclarés dans l'entête sont les paramètres formels, à ne pas confondre avec les paramètres effectifs (voir plus loin) dont la valeur est déterminée au moment de l'exécution du sous-programme.


Le corps

Le corps contient les instructions à exécuter.

En Python, toutes les variables subissant une affectation dans le corps d'un sous-programme sont, par défaut, locales à ce sous-programme. Elles n'existe donc que pendant la durée d'exécution du sous-programme et ne sont pas atteignables en dehors de celui-ci.

Par conséquent, lorsque le sous-programme doit agir sur des variables externes, ce qui est généralement le cas pour des sous-programmes de type procédure, il est nécessaire de déclarer ces variables en global. La déclaration des variables globales est une instruction de la forme:

 global nom1, nom2, ...., nomN

Au contraire, pour un sous-programme de type fonction, la déclaration de variables globales n'est pas nécessaire, mais par contre, le corps du sous-programme doit obligatoirement contenir une instruction return de la forme:

 return expression

la valeur de l'expression est le résultat retournée par la fonction.

Exécution d'un sous-programme

Points communs aux fonctions et procédures

L'exécution d'une fonction ou d'une procédure est déclenchée par l'exécution d'un appel de sous-programme. On y trouve le nom du sous-programme suivi des paramètres effectifs entre parenthèses:

Nom du Sous-Programme (Param. effectif, ..., Param. effectif)

De manière générale, un paramètre effectif est une expression qui est évaluée lors de l'exécution de l'appel du sous-programme. En particulier, il peut donc s'agir simplement d'une variable ou d'un littéral. Le nombre de paramètres effectifs doit être égal au nombre de paramètres formels.

L'exécution d'un appel de procédure provoque les opérations suivantes:

L'exécution d'un appel de sous-programme commence par le passage des paramètres dont le mécanisme est le même pour les procédures et les fonctions.

Il existe plusieurs modes de passage de paramètre. Dans ce cours nous ne considérons que le mode de passage par valeur. Il fonctionne de la manière suivante:

Les instructions contenues dans le corps du sous-programme sont ensuite exécutées avec ces valeurs de paramètres.

Lorsqu'elles ont toutes été exécutées, la mémoire allouée aux paramètres et aux variables locales est libérée. Il se produit ensuite le mécanisme du retour de sous-programme dont le principe n'est pas le même pour les procédures et les fonctions.


Cas particulier des procédures

Dans le cas d'une procédure, le retour est simplement la continuation de l'exécution du programme à l'instruction qui suit son appel.

RetourSousProg.jpg, 38kB

D'autre part, l'appel d'une procédure peut être considérée comme une instruction.


Cas particulier des fonctions

Un appel de fonction au contraire n'est pas vraiment une instruction, mais doit plutot être considéré comme une expression à évaluer.

Comme toute expression, elle peut donc figurer à l'intérieur d'une instruction: dans le membre droit d'une affectation, dans les paramètres effectifs d'un appel de sous-programme, ....

L'autre point particulier des fonctions est qu'elles retournent un résultat, contrairement aux procédures. Tout se passe comme si le résultat retourné par la fonction venait s'inscrire dans le code à l'endroit où figure son appel.