Les fonctions

Une fonction peut renvoyer plusieurs valeurs. Dans l'exemple 1, on a défini une fonction tirage() qui simule le lancer aléatoire de trois dés équilibrés. Cette fonction renvoie la valeur de chaque dé. Lorsqu'on l'appelle (ligne 9), il faut donc s'assurer que les valeurs des 3 dés seront affectées à 3 variables distinctes, sans quoi un message d'erreur apparait.

exemple 1

exemple 1

Deux remarques encore concernant l'exemple 1:

On choisit en général un nom de fonction adapté, c'est à dire un nom qui explique ce que fait la fonction. Néanmoins, on peut choisir d'ajouter une ligne de commentaire pour détailler davantage le rôle de la fonction, voire pour indiquer le type des paramètres d'entrée et de sortie

Vous aurez certainement remarqué que le nom des variables a changé entre le moment où la fonction est définie et le moment où elle est exécutée (D1, D2, D3 puis a, b, c). En effet, les variable D1, D2 et D3 sont des variables locales. Elles n'ont pas d'existence en dehors de la fonction, ou, dit de manière plus précise, elles sont détruites une fois que la fonction a fini de s'exécuter (exemple 2). On peut donc choisir le nom des variables du programme principal comme on le souhaite, c'est à dire sans forcément conserver le nom des variables locales.

exemple 2

Python respecte l'ordre dans lequel les variables sont renvoyées. Dans l'exemple 3, la première variable correspond à l'instruction random (type float) et la seconde à randint (type integer)

exemple 3

On peut très bien définir plusieurs fonctions dans un même script. Une fonction peut d'ailleurs en appeler un autre, dès lors que la fonction appelée est définie avant.

exemple 4

Regardons de plus près l'exemple 4. La fonction Triangle renvoie un booléen: le résultat du test effectué à la ligne 4. True signifie que les trois longueurs a, b et c passées en paramètre définissent un triangle, False signifie qu'il n'est pas possible de construire un triangle avec ces trois longueurs. En effet, il est nécessaire que la longueur d'un coté quelconque d'un triangle soit toujours inférieure à la somme des deux autres cotés. L'affichage qui résulte de la ligne 15 confirme que la fonction renvoie bien une valeur booléenne.

La fonction AireTriangle permet de renvoyer l'aire d'un triangle quelconque à partir des longueurs de ses trois cotés. Pour cela, la fonction utilise la formule de Héron. La fonction renvoie un nombre (float). Avant d'effectuer des calculs qui seraient impossibles si a, b et c ne définissaient pas un triangle (on demanderait en effet à python d'évaluer la racine carrée d'un nombre négatif), il convient d'appeler la fonction Triangle. Triangle(a, b, c) étant un booléen, on peut directement tester sa valeur à la ligne 8. Avec Python, d'un point de vue syntaxique, le test "if condition", où condition est une variable booléenne, est équivalent à "if condition == True"

EXERCICES

Exercice 1: Définir une fonction, qui en fonction d'un entier n impair, renvoie la valeur du produit de tous les nombres entiers impairs de 1 jusqu'à n inclus

Exercice 2: Définir une fonction qui simule le lancer de 3 dés et qui renvoie le nombre de fois que le chiffre 6 est apparu

Exercice 3: Définir une fonction qui simule la réalisation de 50 expériences similaires à celle de l'exercice 2 puis qui renvoie le nombre total de fois sur les 50 expériences où aucun 6 n'est apparu

Exercice 4: Définir une fonction qui, en fonction d'un texte passé en paramètre, renvoie True ou False, selon que ce texte ne comporte que des lettres ou des chiffres

Correction exercice 1

# un script possible

def FactorielleImpaire(n):

p = 1

for i in range(1,n+1,2):

p = p*i

return p

Correction exercice 2

# un script possible. Ce script est très lisible mais il n'est pas très élégant. Une boucle fera mieux l'affaire.

from random import randint

def nb6():

n=0

D1=randint(1,6)

D2=randint(1,6)

D3=randint(1,6)

if D1==6:

n=n+1

if D2==6:

n=n+1

if D3==6:

n=n+1

return n


# un script meilleur

from random import randint

def nb6():

n = 0

for i in range(3):

if randint(1,6)==6:

n=n+1

return n


# encore un autre script, un peu plus concis. Le langage python convertit aisément un booléen en un entier avec la convention universelle suivante: 0 pour False et 1 pour True. A la ligne 5 de ce script, l'interpréteur comprend de manière implicite que le résultat du test entre parenthèses doit être converti: lorsque le test est vrai, n est incrémenté de 1.

from random import randint

def nb6():

n = 0

for i in range(3):

n = n + (randint(1,6)==6)

return n


Correction exercice 3

# un script possible. La fonction echantillon50() appelle la fonction nb6() de l'exercice précédent

def echantillon50():

n = 0

for i in range(50):

if nb6()==0:

n=n+1

return n



# un autre script possible. Pour la ligne 4, voir correction de l'exercice précédent

def echantillon50():

n = 0

for i in range(50):

n = n + (nb6()==0)

return n


Correction exercice 4

# On se base sur la table ASCII pour tester la conformité des différents caractères qui composent la chaine

# Dans cet exercice, on ne traite pas les cas particuliers qui correspondent aux lettres accentuées


# un script possible

def Conforme(texte):

OK = True # Au départ, on suppose le test conforme

for i in range(len(texte)):

n = ord(texte[i])

if n not in range(65,91):

if n not in range(97,123):

if n not in range(48,58):

# On a testé successivement si le caractère est une lettre majuscule, puis une lettre minuscule, puis un chiffre

# Si tous ces tests ont échoué alors le caractère est déclaré non conforme

OK = False

return OK

# Dès qu'un caractère n'est pas conforme, la variable OK prend la valeur 'False'. Comme il n'est pas prévu dans la boucle de la remettre à 'True', quelle que soit la conformité des autres caractères, cette variable restera égale à 'False'


# un autre script possible: plutot que d'écrire formellement trois tests distincts, on les a regroupés en un seul grace à l'opérateur 'and'

def Conforme(texte):

OK = True

for i in range(len(texte)):

n = ord(texte[i])

if n not in range(65,91) and n not in range(97,123) and n not in range(48,58):

OK = False

return OK



# encore un autre script possible

# Dans ce script on a supprimé le test pour le transformer en une opération entre plusieurs booléens. Les parenthèses qui entoure la série des opérations correspondantes aux 'or' sont nécessaires pour respecter les priorités.

# Le fait de réévaluer la variable OK à chaque tour de boucle implique qu'on évalue la conformité des caractères, contrairement aux scripts précédents qui testaient leur éventuelle non-conformité


def Conforme(texte):

OK = True # on suppose que le texte est conforme

for i in range(len(texte)):

n = ord(texte[i])

OK = OK and (n in range(65,91) or n in range(97,123) or n in range(48,58)) # on évalue si le texte reste conforme, caractère après caractère

return OK