Page 4

Les fonctions

Le concept de fonction est très important en programmation. Les fonctions permettent de décomposer un programme complexe en une série de sous-programmes plus simples, lesquels peuvent à leur tour être décomposés en fragments plus petits, et ainsi de suite. Une fonction est réutilisable. Si nous disposons d'une fonction capable de calculer une racine carrée, par exemple, nous pouvons l'utiliser un peu partout dans nos programmes sans avoir à la ré-écrire à chaque fois.

La programmation informatique favorise donc les travaux de groupe et l'apprentissage de la « gestion de projet ». Ainsi, on peut très bien imaginer faire travailler un groupe de 2 ou 3 élèves sur un même programme. Chaque élève devant développer un morceau de code compatible avec le code de ses camarades pour que l'ensemble remplisse le cahier des charges.

Dans ce qui suit, nous allons commencer par la découverte de quelques fonctions prédéfinies par Python, puis nous apprendrons à développer nos propres fonctions. Dans un troisième temps, nous verrons comment on peut réutiliser une fonction dans une autre fonction ou dans un autre « programme » (script).

Fonctions prédéfinies

La fonction print(...)

Nous avons déjà rencontré cette fonction. Elle permet d'afficher n'importe quel chaîne de caractères fournie en arguments. Par défaut, ces valeurs seront séparées les unes des autres par un espace, et le tout se terminera par un saut à la ligne.

>>> print('mot1','mot2')
mot1 mot2

On peut remplacer le séparateur par défaut (l'espace) par un autre caractère quelconque (ou même par aucun caractère), grâce à l'argument « sep ».

>>> print('mot1','mot2',sep=';')
mot1;mot2

La fonction d'écriture print(...) a de nombreuses options qui permettent de personnaliser la présentation des données :

#Observez, successivement les effets de ces instructions dans la console.
>>> x, y, z = 1, 2, 3                  
>>> print(x, y, z, sep='')
>>> print(x, y, z, sep=';')
>>> print(x, y, z, sep='\n')
>>> print('x=', x, sep='', end='; ')
>>> print('y=', y, sep=' ', end='; ')
>>> print('z=', z, sep=' ')

Voici quelques astuces qui peuvent être pratiques :

>>> print('1. Dans ce cas, on utilise des "guillemets" !')
>>> print("2. Dans ce cas, on utilise des 'apostrophes' !")
>>> print('3. Dans ce cas, on va \n à la ligne')
>>> print('4. Dans ce cas, on coupe la ligne '
      'si elle est trop longue dans le fichier source')

La méthode format, de l'objet string, est un outil très puissant permettant de créer des chaînes de caractères en remplaçant certains champs entre accolades par des valeurs passées en arguments de la fonction format. Voici un premiers exemples.

#Observez les effets de ces instructions.
>>> a,b,c=2,3,4
>>> print('P(x)={}x^2+{}x+{}'.format(a,b,c))

On trouve les descriptions détaillées de la méthode format à l'adresse suivante : voir

Remarque : Dans certains cas, la ligne,

# -*- coding: utf-8 -*-

placée en début de code, permet d'éviter les problèmes d'accents (par exemple).

La fonction input(..) :

Cette fonction permet de demander à l'utilisateur de fournir des données au programme en cours d'exécution.

Testons le code suivant.

>>> a=input('a=') ; b=input('b=') ; c=input('c=')
>>> print('Delta={}^2-4*{}*{}={}'.format(b,a,c,b**2-4*a*c))

On obtient un message d'erreur. En effet, les variables a, b et c sont des chaînes de caractères (string). On ne peut donc pas faire de calculs avec elles sauf si on transforme ces variables de type string en entier (int) ou en réel (float). Pour cela, il suffit d'utiliser les fonctions int(...) ou float(...). Une autre méthode consiste à utiliser la fonction eval(...) qui permet d'évaluer l'expression représentée par une chaîne de caractères.

Corrigez alors le code, ci-dessus, de manière à obtenir la valeur du discriminant, en utilisant l'une des deux méthodes proposées.

Il y a bien d'autres fonctions prédéfinies. Vous en trouverez une liste non exhaustive à l'adresse suivante.

https://docs.python.org/3/library/functions.html

Voici un autre exemple.

La fonction len(..)

Devinette : à quoi sert cette fonction ?
Voici des instructions qui devraient vous permettre de trouver.

>>> phrase=input('entrez une phrase ')
>>> n=len(phrase)
>>> print(n)

Construction de nos propres fonctions

Commençons tout de suite par deux exemples très simples de rédaction d'une fonction et de leur utilisation.

Fonction 1 Fonction 2
>>> def bonjour(nom):
	print('Bonjour ',nom)

>>> bonjour('Albert')
Bonjour  Albert
>>> def multiplication(a,b):
	return a*b

>>> multiplication(2,3)
6

La fonction 1 permet l'affichage d'une chaîne de caractères. En langage Python, on dira que c'est une fonction même si elle ne renvoie pas de valeur. Dans d'autres langages de programmation, on dira que c'est une procédure.
La fonction 2 est une fonction (au sens strict), qui, grâce à l'instruction return, renvoie le produit de deux nombres passés en argument.

Paramètre ou argument ?

La fonction bonjour(...) ci-dessus utilise le paramètre nom pour afficher le message de bienvenue.
Pour tester cette fonction, il nous suffit de l'appeler avec un argument, ici l'argument est Albert.
La fonction multiplication(...) utilise les paramètres a et b pour calculer leur produit.
Pour tester cette fonction, on a utilisé 2 arguments, qui sont 2 et 3.
Le nom d'une variable que nous passons comme argument n'a rien à voir avec le nom du paramètre correspondant dans la fonction.
Une fonction peut avoir autant de paramètres que l'on veut.
Une fonction peut aussi ne pas prendre de paramètres comme le montre les deux exemples ci-dessous que vous pouvez recopier dans la console et tester.

Exemplle 1 Exemple 2
def table5():
	n=1
	while n<11:
		print(n*5,end=' ')
		n=n+1

def nom_prenom():
	x=input('Quel est votre nom ? ')
	y=input('Quel est votre prénom ? ')
	print('Bonjour',y,'',x)

Remarque :

  1. Vous avez compris que pour lancer ses deux fonctions, il suffit d'écrire dans la console table5() et nom_prenom()
  2. Vous avez déjà un première exemple d'utilisation de la structure While (Tant Que). Nous y reviendrons un peu plus tard.

Soit la fonction \(f\) définie sur l'ensemble des nombres réels par \(f(x)=x^5-6x^4+5x^3+3x^2+x-5\). On souhaite calculer les images de nombres réels par cette fonction \(f\) mais on n'a pas envie de saisir à chaque fois l'expression de la fonction.

Méthode 1: Alt + p

>>> x=2
>>> x**5-6*x**4+5*x**3+3*x**2+x-5
-15
>>> x=1
>>> x**5-6*x**4+5*x**3+3*x**2+x-5     #Ici on utilise les touches Atl+p pour ..
-1                                    #...remonter dans les instructions déjà saisies            
>>> x=3
>>> x**5-6*x**4+5*x**3+3*x**2+x-5
-83

Méthode 2: La création d'une fonction au sens informatique
Commençons par saisir les 4 lignes suivantes dans IDLEX.

>>>def f(x) :
	   return x**5-6*x**4+5*x**3+3*x**2+x-5

>>>f(2), f(1), f(10)

Explications de la syntaxe :

Remarque : De manière générale l'indentation peut s'obtenir :

Les variables à l'intérieur d'une fonction sont des variables locales. Elles sont supprimées une fois l'exécution de la fonction terminée. Saisissons successivement les deux exemples suivants.

Exemple 1 Exemple 2
>>> def f(x):
	y=5
	return x+1

>>> f(2)
3
>>> y
Traceback (most recent call last):
  File "", line 1, in 
    y
NameError: name 'y' is not defined

>>> y=6
>>> def f(x):
	y=5
	print(y)
	return x+1

>>> f(2)
5
3
>>> y
6

Dans l'exemple 1, un message d'erreur apparaît car la variable y est une variable locale qui a été déclarée à l'intérieure de la fonction.
Dans l'exemple 2, la variable y a été modifiée localement dans la fonction mais reprend la valeur qui lui a été attribuée globalement en dehors de celle-ci.

Une fonction dans une autre fonction :

Le programme suivant permet à son utilisateur de saisir une valeur entière n (de type entier), une valeur réelle p (de type float) puis d'obtenir les bornes de l'intervalle de fluctuation asymptotique au seuil de 95 % correspondant. On rencontre cet intervalle dans les programmes de mathématiques du lycée. Pour les professeurs qui n'enseignent pas les mathématiques, il suffira d'admettre la formule. L'important est ici de comprendre que la fonction racine carré ( sqrt(...) ) est contenue dans la bibliothèque math et est appelée à l'aide de math.sqrt(...).
Deux erreurs de programmation se cachent dans le programme principal. A vous de les trouver.

#Fonction
import math              #cette ligne va permettre d'utiliser la fonction math.sqrt(...)
def cal(n,p):
    return 1.96*math.sqrt(p*(1-p)/n)

#Programme principal (à corriger)
n=input('Entrez une valeur de n \n')
p=input('Entrez une valeur de p \n')
print('L\'intervalle de fluctuation asymptotique au seuil de 95% est ', end='\n')
print('[',p-cal(n,p),end=';')
print(p+cal(n,p),']',end='')

Maintenant que vous avez corrigé ce code, on remarque que la fonction cal(...) est utilisée deux fois dans le programme principal. D'autre part, on pourrait imaginer que cette fonction soit utilisée dans un autre programme (pourquoi pas!). Même si dans notre cas ce code est très court, comment faire pour ne pas avoir à le saisir une deuxième fois , si jamais on avait à le réutiliser ?

Deux méthodes.

Méthode 1 (un peu technique !) :
On commence par créer un dossier que l'on nomme, par exemple, Intervalle_Fluctuation. On ouvre un éditeur, par exemple, NotePad++ (Démarrer/Tous les programmes/Bureautique) et tout de suite on règle l'encodage : Encodage/encoder en UTF-8. On copie le code de la fonction cal(...) , puis on l'enregistre dans le dossier Intervalle_Fluctuation en le nommant calcul_aux.py.

Dans Notepad++, on ouvre un deuxième onglet (Fichier/Nouveau) et on copie l'instruction :

from calcul_aux import *    #importation du code contenu dans le script calcul_aux import.py

Puis on copie le code du programme principal (sans les deux erreurs!) et on enregistre ce fichier dans le dossier Intervalle_Fluctuation en le nommant, par exemple, Prog_Princ.py.
Il suffit ensuite d'ouvrir le fichier Prog_Princ.py dans IDLEX (clique droit/ ouvrir avec...) puis de le lancer en faisant Run/Run Module F5 ou tout simplement F5.

Méthode 2 : Spyder
Maintenant que l'on sait, grâce à notre interpréteur IDLEX qu'il n'y a plus d'erreur dans notre code, on va utiliser ce code pour apprendre à utiliser Spyder qui va se révéler plus pratique, puisque, comme nous l'avons dit au début, cet IDLE a, à la fois, une console et un éditeur. C'est IDLEX et notepad++ à la fois !

FenetreSpyder

La console (partie en bas à droite) joue le même rôle que IDLEX.

L'éditeur (partie de gauche) joue le même rôle que NotePad++, avec l'avantage qu'il permet, grâce au bouton "play" vert, de lancer directement le script.

Question : Pourquoi ne pas vous avoir présenté Spyder plutôt ?

Tout simplement parce que, lorsque vous ferez des recherches sur Internet pour trouver des solutions à un problème, beaucoup de sites utilisent la méthode 1.

Nouvelle question : Et si le programme se trouve dans un sous-dossier du dossier Intervalle_Fluctuation  ?

On souhaite mettre tous les scripts qui vont être utilisés par un même programme principal dans un même sous-dossier du dossier qui contient le programme principal. Dans ce cas, si le sous dossier s'appelle, par exemple, fonctions il suffit, dans le programme principal de remplacer la ligne :

from calcul_aux import *

par la ligne

from fonctions.calcul_aux import *

En résumé : On va donc pouvoir réutiliser plusieurs fois une même fonction ou morceau de code contenu dans un script Python et ceci est un plus par rapport à Algobox.

Dans nos classes :
Les élèves vont devoir faire très attention, au moment de l'enregistrement de leurs scripts Python. Ils devront prendre l'habitude de les nommer d'une manière qui permettra de comprendre ce qu'il contient. Ils devront également les enregistrer dans des dossiers qui leur permettront :

Il ne faudra pas hésiter à perdre du temps en début d'utilisation de Python. Cela permettra d'en gagner ensuite car cela évitera bien des erreurs. Cet apprentissage ne sera pas fait aucollège car Scratch permet (heureusement) d'éviter ces problèmes.




Page 4