Les fonctions

Définition des fonctions

Une fonction(function) est une suite d'instructions que l'on peut appeler avec un nom. La syntaxe pour la déclaration d'une fonction est la suivante:

 def nomDeLaFonction(param1,param2,param3,...):
   ...
   bloc d'instructions
   ...

Fonctions sans paramètre

On considère le script suivant:
def carre():
	i=1
	while i<11:
		print(i*i,end=" ")
		i=i+1
 
Ce script definit une fonction qui affiche les carrés des entiers de 1 à 10.
Pour excécuter la fonction il faut l'appeler par son nom:
carre()
soit dans l shell soit dans l'éditeur de textes.

Fonctions avec paramètres

On considère le script suivant:
def carre(max):
	i=1
	while i< max+1:
		print(i*i,end=" ")
		i=i+1
carre(15)
Exécuter ce script.
Ce script definit une fonction qui affiche les carrés des entiers de 1 à max.
Pour excécuter la fonction il faut l'appeler par son nom et indiquer entre les parenthèses la valeur de max (ici max vaut 15 ).
Remarque: Une fonction peut être définie avec plusieurs paramètres, dans ce cas les paramètres sont séparés par des virgules.

Exercices

  1. Ecrire une fonction qui affiche la table de a, a étant un entier.
  2. Ecrire une fonction qui affiche l'âge d'une personne avec les paramètres anneeCourante et anneeNaissance.

L'instruction return

On considère le script suivant:
def cube(a):
	return a*a*a
Exécuter ce script puis dans le shell, saisir:
 >>>cube(5)
L'instruction return permet à la fonction de renvoyer une valeur.
La valeur renvoyée ici est le cube de l'entier a. Pour afficher cette valeur (par exemple lorsque a prend la valeur 5), il faut écrire la ligne de code:
 >>>print(cube(5))
Remarques:

Variables locales, variables locales

On considère le script suivant:
def mask():
    p=20
    return(p,q)
p=15
q=38
print(mask())
print((p,q))
Exécuter ce script et observer ce qui est affiché.

Les variables définies à l’extérieur d’une fonction sont des variables globales. Leur contenu est « visible» de l’intérieur d’une fonction, mais la fonction ne peut pas le modifier.
Les variables utilisées à l'intérieur d'une fonction sont des variables locales.
Une variable globale peut être modifiée dans une fonction en utilisant l'instruction global.
Exemples:

def augmenter():
    global a
    a=a+1
    return(a)
a=15
print(augmenter())

Fonctions prédéfinies et modules

Nous avons déjà rencontré des fonctions intégrées au language python, comme la fonction len() qui permet de connaître la longueur d'une chaîne de caractères?
Il existe d'autes fonctions qui sont regroupées dans des fichiers qu'on appelle modules

On considère la script suivant:
from math import*
a=121
b=sqrt(a)
print(b)
Exécuter ce script. Quelle est cette fonction sqrt()?
Voici une liste de modules de base que vous serez amené un jour ou l'autre à utiliser.
random : fonctions permettant de travailler avec des valeurs aléatoires
math : toutes les fonctions utiles pour les opérations mathématiques (cosinus,sinus,exp,etc.)
sys : fonctions systèmes
os : fonctions permettant d'interagir avec le système d'exploitation
time : fonctions permettant de travailler avec le temps
calendar : fonctions de calendrier
profile : fonctions permettant d'analyser l'éxecution des fonctions
urllib2 : fonctions permettant de récupérer des informations sur internet
re : fonctions permettant de travailler sur des expressions régulières

Exercices

  1. Définissez une fonction aireDisque(R). Cette fonction doit renvoyer l’aire du disque dont on lui a fourni le rayon R en argument.
    Par exemple, l’exécution de l’instruction : >>> aireDisque(2.5) doit donner le résultat : 19.63495...
  2. Définissez une fonction volBoite(x1,x2,x3) qui renvoie le volume d’une boîte parallélépipédique dont on fournit les trois dimensions x1, x2, x3 en arguments.
    Par exemple, l’exécution de l’instruction : >>> volBoite(5.2, 7.7, 3.3) doit donner le résultat : 132.132.
  3. Définissez une fonction ligneCar(n, car) qui renvoie une chaîne de n caractères car. Par exemple >>> ligneCar(7,"o") donne 'ooooooo'
  4. Définissez une fonction maximum(n1,n2,n3) qui renvoie le plus grand de 3 nombres n1, n2, n3 fournis en arguments.
    Par exemple, l’exécution de l’instruction : >>> maximum(2,5,4) doit donner le résultat : 5.
  5. Définissez une fonction compteCar(car,ch) qui renvoie le nombre de fois que l’on rencontre le caractère car dans la chaîne de caractères ch.
    Par exemple, l’exécution de l’instruction : >>> compteCar(’e’, ’Cette phrase est un exemple’) doit donner le résultat : 7
  6. Définissez une fonction nomMois(n) qui renvoie le nom du énième mois de l’année.
    Par exemple, l’exécution de l’instruction : >>> nomMois(4) doit donner le résultat : Avril.
  7. Définissez une fonction inverse(ch) qui permette d’inverser l’ordre des caractères d’une chaîne quelconque. La chaîne inversée sera renvoyée au programme appelant.
  8. Ecrivez un programme qui donne les solutions éventuelles d'une équation du premier degré de la forme ax+b=0.
    Définissez une fonction resoudPremierDegre(a,b) qui affiche la solution éventuelle.

Les bonnes pratiques

Un programme doit:
  1. doit être lisible et clair
  2. doit être découpé en petits composants faisant peu de choses, mais les faisant bien
  3. doit séparer calculs et interface homme/machine
  4. doit être documenté : spécification
  5. doit être testé.

Documenter une fonction:docstring

On considère la fonction suivante:
def distance(a,b):
    if a>=b:
        return a-b
    else:
        return b-a
Que fait cette fonction?
Enregistrer cette fonction dans le fichier exple_doctest.py. Documentons cette fonction:

def distance(a,b):
	''' renvoie la distance entre les entiers a et b
	:param a,b:(int)
	:return:(int)
	:CU: aucune
	Exemples:
	>>> distance(5,3)
	2
	>>> distance(-4,7)
	11
	'''
    if a>=b:
        return a-b
    else:
        return b-a
On peut accéder à la docstring d'une fonction avec la commande help
>>> help(distance)
Tester!

Tester avec doctest

Pour tester de manière automatique les fonctions dans le programme, on insert en fin de programme les instructions suivantes:
if __name__ == '__main__':
    import doctest
    doctest.testmod()
La fonction testmod du module doctest est allée chercher dans les docstring des fonctions du module actuellement chargé, c’est-à-dire exple_doctest.py, tous les exemples (reconnaissables à la présence des triples chevrons >>>), et a vérifié que la fonction documentée satisfait bien ces exemples.
A faire avec des exemples erronés et sans exemples erronés.

Application

Réaliser la docstring et le doctest pour la fonction compteCar(car,ch) .