Archives Wild Code School
Python

3.2 Python - Functions - Helping Statisticians - Part 1

Quête 15 sur 66 · 4 images archivées

Dans cette quête, tu découvriras ce que sont les fonctions, comment les utiliser en Python et comment les créer toi-même. Tu entendras probablement aussi parler de méthodes, c'est à peu près la même chose qu'une fonction, mais dans un contexte particulier (POO).

Info

Garde à l'esprit que ce que tu vas apprendre ici n'est pas propre à Python, et qu'on le retrouve également dans de nombreux autres langages.

Objectifs

✅ Savoir comment utiliser une fonction ✅ Créer tes propres fonctions ✅ Gérer le passage des arguments ✅ Contrôler ce que retourne une fonction

Sommaire

Utiliser une fonction

Dans ton travail, tu peux avoir besoin de la même fonctionnalité de manière répétée. Comme connaître le total de différents montants. Tu découvriras que tu en auras besoin plus souvent que tu ne le penses.

Considérons cette liste à titre d'exemple :

python
amounts_list = [12, 24, 36, 51, 62]

Nous avons donc une liste contenant différents montants, et tu souhaites connaître la somme totale. En raison de ta récente maîtrise des boucles, tu pourrais être tenté de coder toi-même la fonction suivante :

python
total = 0
for i in amounts_list:
  total += i
print("Total amount is : ",total)

Et chaque fois que tu voudras avoir un total de montants, ou plus génériquement, calculer la somme d'une liste contenant des nombres entiers, tu devras faire cette petite boucle, ou dupliquer le code.

Pour cet exemple très simpliste, tu te dis que copier et coller une simple boucle n'est pas mal. Sauf qu'il existe déjà quelque chose en Python qui te permet d'obtenir le même résultat, beaucoup plus simplement, rapidement, et avec de meilleures performances : la fonction sum.

python
print("Total amount is : ", sum(amounts_list) )

Il suffit d'appeler la fonction sum suivie de 2 parenthèses ()à l'intérieur desquels, tu dois préciser ta liste qui est appelée argument (ou paramètre).

C'est plus efficace de cette façon. L'utilisation d'une fonction peut alléger considérablement ton code en réduisant fortement le nombre de lignes. Imagine combien tu peux économiser en utilisant des fonctions qui font des choses plus complexes.

Python dispose d'un grand nombre de fonctions, dont tu peux user et abuser. Elles sont appelées "built-in functions". Tu entendras également parler de "fonctions standard ". Certaines sont tellement courantes et utiles que tu les maîtriseras parfaitement. Bien sûr, elles sont trop nombreuses pour qu'on puisse toutes les faire entrer dans sa tête.

A l'usage, tu en connaîtras certaines, et tu auras une idée de ce que tu peux et ne peux pas faire avec les fonctions intégrées de Python. Pour cela, tu disposes de la documentation officielle de Python (voir les ressources ci-dessous).

Note bien que comme le reste en Python, les noms de fonctions sont sensibles à la casse ! Si tu appelles Sum(), Python ne comprendra pas que tu penses à la fonction sum().

↗
Documentation officielle

Voici ton nouveau meilleur ami, la documentation officielle de Python ! C'est grâce à elle que tu pourras savoir exactement comment utiliser telle ou telle fonction.

docs.python.org

Créer tes propres fonctions

Tu l'auras compris, Python contient déjà de nombreuses fonctions intégrées que tu peux utiliser au quotidien. Mais, tu seras aussi souvent amené à créer tes propres fonctions. Comme vu précédemment, une fonction exécute un ensemble de code prédéterminé et peut être appelée quand tu le souhaites. Cela te permettra d'exécuter le même algorithme encore et encore sans jamais faire de copier-coller. Comme tu le découvriras bientôt, moins tu copies-colles, plus le code sera propre, bien structuré et cohérent.

Le récit

Le principe de se répéter le moins possible dans son code est le principe du code DRY (Don't Repeat Yourself). En programmation, tu découvriras qu'il existe de nombreux "courants philosophiques", prônant différentes approches pour produire un code propre, fonctionnel et optimisé. DRY est l'un d'entre eux.

Pour la définition d'une fonction en Python, tu devras d'abord faire appel au mot-clé def.

Ensuite, il suffit de lui donner un nom. Tu es libre de l'appeler comme bon te semble ! Tant que tu respectes les contraintes imposées par Python, qui sont les mêmes que pour les variables. Pour rappel :

  • Un nom de fonction ne peut pas commencer par une valeur numérique,
  • Ne doit pas contenir de caractères interdits : @ ou -.
  • Chaque nom doit être unique et ne pas être un nom réservé. Comme list() ou str() par exemple. (En Python, ce n'est pas vraiment interdit, mais c'est une très mauvaise pratique)

Tu devras également penser à la propreté et à la maintenabilité du code. Comme pour le nommage des variables, il est important de nommer les fonctions correctement. Un script rempli de toto(), tata(), function1(), function2() et doSomething() ou getStuff() ne sera pas très facile à comprendre. Utilise des noms cohérents, représentatifs de ce qu'ils font, et utilisant la syntaxe recommandée : en minuscules, en séparant les mots avec des underscores si nécessaire pour améliorer la lisibilité. Par exemple, get_total_price(price, taxeRate) ou filter_subscribed_users(users).

Ce qui te donne, pour définir une fonction appelée ma_fonction la définition ci-dessous :

python
def ma_fonction(argument) :
  return something

Et pour appeler la fonction, fraîchement définie, tu devras faire exactement comme pour une fonction intégrée :

python
ma_fonction()

Les arguments

Dans le premier chapitre, pour que la fonction sum() "fonctionne", tu devais donner comme "argument", la liste amounts_list. Le code ne peut pas deviner ce que tu avais en tête, tu devras lui donner des détails.

Essayons de coder une nouvelle fonction pour additionner une liste :

python
def my_sum(list_argument):
  tot = 0
  for i in list_argument:
    tot += i
  print(tot)

Nous pouvons appeler cette fonction pour imprimer le résultat.

python
my_sum(amounts_list)

Tu peux nommer ton argument comme tu le souhaites. C'est comme une variable locale présente uniquement dans ta fonction.

image.png

Si tu essayes d'afficher un argument en dehors d'une fonction, tu obtiendras un message d'erreur.

python
print(list_argument)
Important

NameError: name 'list_argument' is not defined

C'est la même chose pour une variable locale :

python
print(tot)
Important

NameError: name 'tot' is not defined

Comment cela fonctionne-t-il pour l'ordinateur ? Il remplace d'abord l'argument par la variable, puis la variable par les données.

image Concrètement voici le code que tu lances :

  1. Définition d'une fonction
  2. Affectation d'une donnée à une variable
  3. Exécution de la fonction sur la variable

Mais voici les étapes réellement effectuées par l'ordinateur :

  1. Définition d'une fonction
  2. Affectation de données à une variable
  3. Remplacement du nom de la fonction par le script : image
  4. Remplacement de l'argument par la variable globale
  5. Remplacement de la variable globale par les données image
Le récit

Quelle est la différence entre argument et paramètre ?

La principale différence est que le paramètre est ce qui est déclaré dans la fonction, tandis que l'argument est ce qui est transmis lors de l'appel de la fonction.

Arguments multiples

Le nombre d'arguments est différent pour chaque fonction, en fonction de ce qu'elle fait, et des informations dont elle a besoin pour fonctionner.

Essayons de créer une fonction substraction. Nous avons besoin d'un premier nombre, et d'un second nombre à soustraire du premier.

python
def substraction(nb, nb_to_substract):
  print(nb - nb_to_substract)

Lorsqu'une fonction attend plusieurs arguments, c'est l'ordre qui importe.

python
soustraction(12 , 7)
shell
>>> 5

tu peux préciser les noms des arguments, si tu préfères :

python
substraction(nb = 12 , nb_to_substract = 7)
shell
>>> 5

On obtient le même résultat si on change l'ordre et si on précise le nom des arguments :

python
substraction(nb_to_substract = 7 , nb = 12 )
shell
>>> 5

Mais bien sûr, le résultat est différent si nous changeons l'ordre sans les noms des arguments :

python
soustraction(7 , 12)
shell
>>> -5

Valeurs de retour

Une fonction devrait rarement afficher un résultat. Même si la plupart du temps, le but est d'afficher du contenu à l'utilisateur, à quelques exceptions près, tu ne devrais jamais appeler print() directement dans une fonction. Hey, mais c'est ce que nous avons fait depuis le début de cette quête ! Oui c'est vrai, mais maintenant c'est fini. Tu dois maintenant utiliser le mot-clé return suivi des données à retourner. C'est-à-dire qu'au lieu d'écrire :

python
def substraction(nb, nb_to_substract):
  print(nb - nb_to_substract)

tu dois plutôt écrire :

python
def substraction(nb, nb_to_substract):
  return (nb - nb_to_substract)

Pourquoi est-il préférable d'utiliser return ? Parce que print est une fonction pour afficher un message sur ton écran. Et return est une commande pour retourner, ainsi tu peux utiliser plus tard le résultat de ta fonction. Par exemple :

python
def substraction(nb, nb_to_substract):
  print(nb - nb_to_substract)

substraction(10 , 3) + 2
Important

unsupported operand type(s) for +: 'NoneType' and 'int'

Nous avons une erreur, car nous disons à l'ordinateur "pourquoi ne pas imprimer quelque chose, et ajouter 2 à cette impression". Mais un ordinateur ne comprend pas comment ajouter quelque chose à une impression.

Avec la syntaxe correcte :

python
def substraction(nb, nb_to_substract):
  return (nb - nb_to_substract)

substraction(10 , 3) + 2
shell
>>> 9
Attention

N'oublie jamais qu'à partir du moment où l'interpréteur rencontre l'instruction return celle-ci s'arrêtera là et sortira de la fonction. Si jamais tu as du code écrit après un return, il ne sera jamais lu. Normalement, ton IDE devrait t'avertir de ce genre d'incohérence. Une erreur courante est de placer un return au milieu d'une boucle. Évidemment, dès la première itération (premier tour), l'interpréteur quitte la boucle et la boucle n'est jamais terminée.

Quiz

quiz
false|||true|||false
# Une fonction 'python' ne peut traiter que des valeurs numériques : 
[x] Faux
[] Vrai
# Seul l'équipe de la fondation python peut créer de nouvelles fonctions : 
[x] Faux, tout le monde peut créer de nouvelles fonctions.
[] Vrai
# Quelle est la commande pour créer une nouvelle fonction en python ? 
[x] def new_function():
[] func new_function():
[] function new_function():
[] definition new_function():
# Une fonction python ne peut avoir qu'un seul argument : 
[x] Faux
[] Vrai
# Quels sont les synonymes ? 
[x] Argument et Paramètre
[] Variable et Fonction
[] Variable et Argument
# Quelle est la commande pour retourner une valeur à la fin d'une fonction ? 
[x] return
[] print
[] end

Lis le code ci-dessous, puis réponds au questionnaire suivant :

python
def add(first, second):
    new = first + second
    return new

test1 = 3
test2 = 4

add(test1, test2)
quiz
faux|||vrai|||faux
# "add" est : 
[x] une fonction
[] un argument/un paramètre
[] une variable
[] peut être considéré comme une variable locale
# "first" est : 
[] une fonction
[x] un argument/un paramètre
[] une variable
[x] peut être considéré comme une variable locale
# "new" est : 
[] une fonction
[] un argument/un paramètre
[] une variable globale
[x] une variable locale
# "test1" est : 
[] une variable locale
[x] une variable globale
[] une fonction
[] un argument

Ressources

↗
Une bonne explication sur les fonctions en Python (en français)
courspython.com
↗
Une bonne ressource sur les fonctions lambda en Python (en anglais)
youtube.com
↗
Un cheatsheet très complet sur les fonctions python
github.com

Challenge

Il fait beau, le soleil brille, les oiseaux gazouillent. Tu aperçois un groupe de collègues statisticiens qui se dirigent résolument vers ton bureau. Ils ont l'air abattu. Que leur est-il arrivé ?

Quel est leur problème ? Ils veulent apprendre à programmer en Python. Ils suivent un cours en ligne, mais ils ont du mal depuis le début.

Tu décides gentiment de les aider. Mais avant de te faire une confiance aveugle, ils décident de te lancer un défi qui consiste à réaliser toutes les missions contenues dans ce notebook : 3.2 Python - Functions Helping statisticians Part 1

Tu dois créer une copie du notebook et réaliser les missions qu'il contient.

Poste ensuite le lien vers ton notebook comme solution.

Critères de validation

  • Le fichier lié est consultable et lisible par tous.
  • Toutes les missions sont correctement codées et testées.

==$==

Une solution ici

Ressources partagées sur cette quête