Outils pour utilisateurs

Outils du site


nsi:premiere:definition_fonctions

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Fonctions : organiser le code

Fiche élève à imprimerDiaporama

On a dit qu'un programme était la traduction d'un algorithme dans un langage de programmation. Ce n'est pas tout à fait exact. Il est plus juste de dire que le programme traduit un ensemble d'algorithmes, chaque algorithme réalisant une fonction. Un programme ordinaire est donc constitué de fonction chacune réalisant une petite partie du travail.

Quand les programmes sont très simples, il peut paraître inutile de s'embarrasser avec trop d'organisation. Mais notre but est d'apprendre de bonnes méthodes de façon à pouvoir plus tard envisager des programmes plus ambitieux. Le découpage du programme en fonction est alors INDISPENSABLE. D'ailleurs, l'essentiel de votre travail de programmation va vite être d'écrire des fonctions ou de les compléter.

Besoin d'organisation

Un programme mal écrit

Prenons un programme mal écrit :

x = int(input())
y = int(input())
a = x
b = y
while  a % b != 0:
    r = a % b
    a = b
    b = r
z = b
print(x//z)
print(y//z)
  • Celui qui écrit le programme est encore dans son idée, il se comprend peut-être… mais dès qu'il oublie un peu, il ne se comprend plus lui-même !
  • Pour un autre, la compréhension de ce programme demandera beaucoup d'efforts alors qu'il est très simple.

Le programmeur doit faire un effort de lisibilité !

Mieux nommer les variables

Les variables doivent être mieux nommées pour qu'on sache ce qu'elles signifient. On peut aussi rendre les print et input plus explicites.

num = int(input("Numérateur : "))
den = int(input("Dénominateur : "))
a = num
b = den
while  a % b != 0:
    r = a % b
    a = b
    b = r
d = b
print(f"Fraction réduite : {num//d}/{y//d}");

C'est un peu mieux.

Extraire la fonction

Le programme contient un calcul basé sur le while. On peut l'extraire pour le mettre en évidence.

def ma_fonction(a,b):
    while  a % b != 0:
        r  % b
        a = b= a
        b = r
	return b

num = int(input("Numérateur : "))
den = int(input("Dénominateur : "))
d = ma_fonction(num, den)
print(f"Fraction réduite : {num//d}/{y//d}");

On peut améliorer les choses en nommant convenablement la fonction.

def pgcd(a,b):
    while  a % b != 0:
        r  % b
        a = b= a
        b = r
	return b

num = int(input("Numérateur : "))
den = int(input("Dénominateur : "))
d = pgcd(num, den)
print(f"Fraction réduite : {num//d}/{y//d}");

Conventions pour les noms en plusieurs mots :

  • snake_case, la casse du serpent : tout en minuscule, mots séparés par _. Pour l'exemple calcule_pgcd. C'est la convention recommandée en Python.
  • camelCase, la casse du chameau : changement de mot avec une majuscule. Pour l'exemple calculePgcd.

Signature

def pgcd(a,b):

Cette ligne est la définition de la fonction. Elle indique le nom de la fonction et elle indique les entrées nécessaires.

principal

num = int(input("Numérateur : "))
den = int(input("Dénominateur : "))
d = pgcd(num, den)
print(f"Fraction réduite : {num//d}/{y//d}");

Ces lignes constituent la partie principale du programme. À la ligne 10 notamment, on appelle la fonction pgcd. C'est là qu'elle s'exécute.

Lors de la définition, avec def, la fonction ne s'exécute pas. Si dans un programme on ne fait que définir des fonctions, alors à l'exécution il ne fera rien.

Documenter la fonction

On appelle documentation le bloc de texte que l'on écrit sous la signature :

def pgcd(a, b):
    """
	a: entier
        b: entier non nul
	renvoie le pgcd de a, b
    """
    while  a % b != 0:
        r  % b
        a = b= a
        b = r
	return b

Vous devez documenter vos fonctions.

Typer

On peut indiquer dans la signature les types des entrées et sorties de la fonction. Ce n'est pas obligatoire et n'est pas exigé en NSI. C'est bien de le faire du moment que cela reste simple.

def pgcd(a:int,b:int) -> int:
    ...

Modulariser

On peut pousser l'organisation une étape plus loin en plaçant la fonction dans un module séparé.

# monmodumle.py

def pgcd(a:int, b:int) -> int:
    """
	a: entier
        b: entier non nul
	renvoie le pgcd de a, b
    """
    while  a % b != 0:
        r  % b
        a = b= a
        b = r
	return b
# main.py
from monmodule import pgcd

num = int(input("Numérateur : "))
den = int(input("Dénominateur : "))
d = pgcd(num, den)
print(f"Fraction réduite : {num//d}/{y//d}");

Ainsi, le principal est très lisible. On comprend en un coup d'œil ce qu'il fait.

Avantages

Les fonctions ont bien des avantages.

  • évitent les répétitions
  • facilitent les tests automatiques
  • les variables utilisées n'existent que le temps nécessaire.
  • facilitent le travail à plusieurs
  • simplifient la structure
  • modularisation

return !!!

  • Une fonction ne contient jamais de print
  • SAUF si la fonction est fait exprès pour l'affichage.
  • La sortie d'une fonction est faite par return
  • Certaines fonctions peuvent ne rien renvoyer et ne contenir aucun return (toutefois en Python, une fonction renvoie none à défaut d'autre chose)
  • Après l'exécution d'un return, la fonction se termine immédiatement.
  • Il peut y avoir plusieurs return dans une fonction. C'est d'ailleurs très pratique.

assert comme précondition

assert permet d'indiquer une condition qui doit être vérifiée.

# monmodule.py
def pgcd(a:int,b:int) -> int:
    """
	renvoie le pgcd de a et b
	"""
	assert b != 0
	...

Indique clairement la condition à laquelle la fonction fait son travail correctement.

assert comme test élémentaire

On sait d'avance que pgcd(15,35) == 7. On peut s'en servir comme test simple vérifiant que la fonction fait bien son travail.

# monmodule.py
def pgcd(a:int,b:int) -> int:
    """
	renvoie le pgcd de a et b
	"""
	...
	
assert pgcd(15,35) == 5

C'est même une bonne idée de multiplier ces tests en essayant les cas bizarres.

assert pgcd(2*3*3*7*11*23, 3*7*23*17*17*13) == 3*7
assert pgcd(0,5) == 5

Les parenthèses sont signe de fonction

>>> z = 15
>>> z()
TypeError: 'int' object is not callable

z est un nombre entier – int – mais le fait d'écrire ensuite z() fait que Python essaie de comprendre z comme une fonction. Un entier ne peut pas être appelé (called) comme une fonction, c'est le sens du message d'erreur.

nsi/premiere/definition_fonctions.txt · Dernière modification : de goupillwiki