Paramètres

6.4 Paramètres

Objectifs d'apprentissage

À la fin de cette section, vous devriez être capable de :

  • Identifier les arguments et les paramètres d'une fonction.
  • Décrire comment la mutabilité influe sur la façon dont une fonction peut modifier des arguments.

Arguments et paramètres

Que faire si un programmeur souhaite écrire une fonction qui affiche le contenu d'une liste ? Une bonne pratique consiste à passer directement les valeurs à une fonction plutôt que de dépendre de variables globales. Un argument de fonction est une valeur transmise en entrée lors de l'appel d'une fonction. Un paramètre (parameter) de fonction est une variable représentant l'entrée dans la définition de la fonction. Remarque : les termes « argument » et « paramètre » sont parfois utilisés de manière interchangeable dans les conversations et la documentation.

Faites le point

Variables globales et locales dans un programme avec une fonction

Concepts en pratique

Arguments et paramètres

Considérez ce qui suit :

1
def print_welcome(name):
2
  print(f"Welcome {name}!")
3
4
username = int(input("Enter new username: "))
5
print_welcome(username)
1.
Lequel est un argument ?
  1. name
  2. username
  3. name et username
2.
Lequel est un paramètre ?
  1. name
  2. username
  3. name et username
3.
Quelle est la portée de name ?
  1. print_welcome() uniquement
  2. tout le programme
4.
Que se passerait-il si username était remplacé par name aux lignes 4 et 5 ?
  1. même sortie
  2. erreur/sortie incorrecte

Arguments et paramètres multiples

Les fonctions peuvent avoir plusieurs paramètres. Ex. : une fonction utilise deux paramètres, la longueur et la largeur, pour calculer la superficie d'une pièce. Les appels de fonction doivent utiliser l'ordre et le nombre corrects d'arguments pour éviter des comportements indésirables et des erreurs (sauf en cas d'utilisation d'arguments optionnels ou nommés, comme nous le verrons plus loin).

Exemple 6.1

Utilisation de plusieurs arguments dans un appel de fonction

    def print_div(op_1, op_2):
      """ Prints division operation """
      print(f"{op_1}/{op_2} = {op_1/op_2}")

    num_1 = 6
    num_2 = 3
    print_div(num_1, num_2) # Prints "6/3 = 2.0"
    print_div(num_2, num_1) # Prints "3/6 = 0.5"
    print_div(num_1) # Error: Missing argument: op_2

Concepts en pratique

Arguments et paramètres multiples

Considérez ce qui suit :

    def calc_distance(x1, y1, x2, y2):
      dist = math.sqrt((x2-x1)**2 + (y2-y1)**2)
      print(dist)

    p1_x =int(input("Enter point 1's x: "))
    p1_y =int(input("Enter point 1's y: "))
    p2_x =int(input("Enter point 2's x: "))
    p2_y =int(input("Enter point 2's y: "))
    calc_distance(p1_x, p1_y, p2_x, p2_y)
5.
Lequel est un argument ?
  1. p1_x
  2. x1
6.
Lequel est un paramètre ?
  1. p1_y
  2. y1
7.
Quelle serait la valeur de x2 pour l'appel de fonction calc_distance(2, 4, 3, 6) ?
  1. 2
  2. 4
  3. 3
  4. 6
  5. Error

Modification des arguments et mutabilité

En Python, une variable est un nom qui fait référence à un objet stocké en mémoire, c'est-à-dire une référence d'objet ; Python utilise donc un système de passage par référence d'objet (pass-by-object-reference). Si un argument est modifié dans une fonction, les modifications sont conservées ou perdues selon la mutabilité de l'objet. Un objet mutable peut être modifié après sa création. Les modifications apportées par une fonction à l'objet apparaissent alors en dehors de la fonction. Un objet immuable (immutable) ne peut pas être modifié après sa création. Une fonction doit donc en faire une copie locale pour le modifier, et les modifications apportées à cette copie locale n'apparaissent pas en dehors de la fonction.

Les programmeurs doivent faire preuve de prudence lorsqu'ils modifient les arguments d'une fonction, car ces effets de bord peuvent rendre les programmes difficiles à déboguer et à maintenir.

Exemple 6.2

Conversion de températures

Quelles sont les valeurs de weekend_temps et type une fois que convert_temps() s'est terminée ?

    def convert_temps(temps, unit):
      if unit == "F":
        for i in range(len(temps)):
          temps[i] = (temps[i]-32) * 5/9
        unit = "C"
      else:
        for i in range(len(temps)):
          temps[i] = (temps[i]*9/5) + 32
        unit = "F"

    # Weekend temperatures in Fahrenheit.
    wknd_temps = [49.0, 51.0, 44.0]
    deg_sign = u"\N{DEGREE SIGN}" # Unicode
    metric = "F"

    # Convert from Fahrenheit to Celsius.
    convert_temps(wknd_temps, metric)
    for temp in wknd_temps:
      print(f"{temp:.2f}{deg_sign}{metric}", end=" ")

La sortie est 9.44°F 10.56°F 6.67°F. type a été modifié en "C" dans la fonction, mais n'a pas conservé cette modification en dehors de la fonction. Pourquoi la modification de l'argument de type liste est-elle conservée et non celle de l'argument de type chaîne ? (Indice : une liste est mutable. Une chaîne de caractères est immuable.)

Faites le point

Exploration d'une fonction défectueuse

Concepts en pratique

Mutabilité et arguments de fonction

8.
Dans convert_temps(), wknd_temps et temps désignent ________ en mémoire.
  1. le même objet
  2. des objets différents
9.
Après que unit a reçu la valeur "C", metric et unit désignent ________ en mémoire.
  1. le même objet
  2. des objets différents
10.
deg_sign est une chaîne de caractères dont la valeur ne peut pas changer une fois créée. deg_sign est ________.
  1. immuable
  2. mutable
11.
À la ligne 16, unit ________.
  1. fait référence à un objet ayant la valeur "C"
  2. n'existe pas

À vous d'essayer

Affichage de l'aire d'un triangle rectangle

Écrivez une fonction, print_area(), qui prend en paramètres la base et la hauteur d'un triangle rectangle et affiche l'aire de ce triangle. L'aire d'un triangle rectangle est bh2bh2, où b représente la base et h la hauteur.

Pour les entrées suivantes :

    3
    4

La sortie est :

    Triangle area: 6.0

À vous d'essayer

Ajustement des notes

Écrivez une fonction, print_scores(), qui prend en entrée une liste de notes d'examen et un nombre représentant les points à ajouter. Pour chaque note, affichez la note originale et la somme de la note et du bonus. Veillez à ne pas modifier la liste.

Pour l'appel de fonction suivant :

    print_scores([67, 68, 72, 71, 69], 10)

La sortie est :

    67 would be updated to 77
    68 would be updated to 78
    72 would be updated to 82
    71 would be updated to 81
    69 would be updated to 79