Arguments par défaut en Python

Python permet aux arguments de fonction d'avoir des valeurs par défaut. Si la fonction est appelée sans l'argument, l'argument obtient sa valeur par défaut.

Arguments par défaut :

Python a une manière différente de représenter la syntaxe et les valeurs par défaut des arguments de fonction. Les valeurs par défaut indiquent que l'argument de la fonction prendra cette valeur si aucune valeur d'argument n'est transmise lors de l'appel de la fonction. La valeur par défaut est attribuée à l'aide de l'opérateur d'affectation (=) du formulaire nom du mot-clé =valeur.
Comprenons cela à travers une fonction étudiant . La fonction étudiant contient 3 arguments dont 2 arguments sont affectés à des valeurs par défaut. Donc la fonction étudiant accepte un argument obligatoire ( prénom ), et les deux autres arguments sont facultatifs.

Python3




def> student(firstname, lastname> => 'Mark'> , standard> => 'Fifth'> ):> > print> (firstname, lastname,> 'studies in'> , standard,> 'Standard'> )>


Nous devons garder les points suivants à l’esprit lors de l’appel de fonctions :

  1. Dans le cas du passage des arguments de mots clés, l'ordre des arguments est important.
  2. Il ne doit y avoir qu'une seule valeur pour un paramètre.
  3. Le nom du mot-clé transmis doit correspondre au nom du mot-clé réel.
  4. Dans le cas de l’appel d’une fonction contenant des arguments autres que des mots-clés, l’ordre est important.

Exemple 1: Appel de fonctions sans arguments de mot-clé

Python3




def> student(firstname, lastname> => 'Mark'> , standard> => 'Fifth'> ):> > print> (firstname, lastname,> 'studies in'> , standard,> 'Standard'> )> # 1 positional argument> student(> 'John'> )> # 3 positional arguments> student(> 'John'> ,> 'Gates'> ,> 'Seventh'> )> # 2 positional arguments> student(> 'John'> ,> 'Gates'> )> student(> 'John'> ,> 'Seventh'> )>

Sortir:

John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard 

Lors du premier appel, il n'y a qu'un seul argument obligatoire et les autres arguments utilisent les valeurs par défaut. Lors du deuxième appel, nom de famille et la valeur des arguments standard est remplacée de la valeur par défaut par la nouvelle valeur de passage. Nous pouvons voir que l’ordre des arguments est important à partir des 2e, 3e et 4e appels de la fonction.

Exemple n°2 : Appel de fonctions avec des arguments de mots-clés

Python3




def> student(firstname, lastname> => 'Mark'> , standard> => 'Fifth'> ):> > print> (firstname, lastname,> 'studies in'> , standard,> 'Standard'> )> # 1 keyword argument> student(firstname> => 'John'> )> # 2 keyword arguments> student(firstname> => 'John'> , standard> => 'Seventh'> )> # 2 keyword arguments> student(lastname> => 'Gates'> , firstname> => 'John'> )>

Sortir:

John Mark studies in Fifth Standard John Mark studies in Seventh Standard John Gates studies in Fifth Standard 

Lors du premier appel, il n’y a qu’un seul argument de mot-clé requis. Dans le deuxième appel, l'un est un argument obligatoire et l'autre est facultatif (standard), dont la valeur par défaut est remplacée par une nouvelle valeur de passage. Dans le troisième appel, nous pouvons voir que l’ordre dans l’argument du mot-clé n’est pas important.

Exemple n°3 : Certains appels de fonction non valides

Python3




def> student(firstname, lastname> => 'Mark'> , standard> => 'Fifth'> ):> > print> (firstname, lastname,> 'studies in'> , standard,> 'Standard'> )> # required argument missing> student()> # non keyword argument after a keyword argument> student(firstname> => 'John'> ,> 'Seventh'> )> # unknown keyword argument> student(subject> => 'Maths'> )>

Le code ci-dessus générera une erreur car :

  • Lors du premier appel, la valeur n'est pas transmise pour le paramètre prénom qui est le paramètre requis.
  • Dans le deuxième appel, il y a un argument non-mot-clé après un argument mot-clé.
  • Lors du troisième appel, l'argument de mot-clé transmis ne correspond pas aux arguments de nom de mot-clé réels.

Utiliser des objets mutables comme valeurs d'argument par défaut en python

Cela doit être fait avec beaucoup de soin. La raison est que les valeurs par défaut des arguments ne sont évaluées qu'une seule fois lorsque le contrôle atteint la fonction.

Définition pour la première fois. Après cela, les mêmes valeurs (ou objets mutables) sont référencées dans les appels de fonction suivants.
Les choses seront beaucoup plus claires avec l'exemple

Python3




# mutable default argument values example using python list> # itemName is the name of the item that we want to add to list> # that is being passed, or if it is not passed then appending in> # the default list> def> appendItem(itemName, itemList> => []):> > itemList.append(itemName)> > return> itemList> print> (appendItem(> 'notebook'> ))> print> (appendItem(> 'pencil'> ))> print> (appendItem(> 'eraser'> ))>

Sortir

['notebook'] ['notebook', 'pencil'] ['notebook', 'pencil', 'eraser'] 

À quoi vous vous attendiez si vous supposez qu'une nouvelle liste est créée à chaque appel de fonction lorsque nous ne lui transmettons pas de liste

['carnet de notes']

['crayon']

['gomme']

Mais comme vous pouvez le voir dans la sortie réelle du programme, chaque fois que la fonction est appelée, la même liste est utilisée, aucune nouvelle liste n'est créée lors d'un nouvel appel.

Exemple utilisant un dictionnaire

Python3




# mutable default argument values example using python dictionary> # itemName is the name of item and quantity is the number of such> # items are there> def> addItemToDictionary(itemName, quantity, itemList> => {}):> > itemList[itemName]> => quantity> > return> itemList> print> (addItemToDictionary(> 'notebook'> ,> 4> ))> print> (addItemToDictionary(> 'pencil'> ,> 1> ))> print> (addItemToDictionary(> 'eraser'> ,> 1> ))>

Sortir

{'notebook': 4} {'notebook': 4, 'pencil': 1} {'notebook': 4, 'pencil': 1, 'eraser': 1} 

À quoi vous vous attendiez si vous supposez qu'un nouveau dictionnaire est créé à chaque appel de fonction

{'carnet': 4}

{'crayon': 1}

{'gomme': 1}

Mais vous pouvez clairement voir que la sortie réelle du programme est différente et indique l'utilisation du même dictionnaire à chaque appel ultérieur.

Ce qu’il faut retenir ici, c’est que nous devrions éviter de tels scénarios.

Les meilleures pratiques

Attribuez la valeur par défaut à aucun, puis vérifiez dans la fonction si l'argument de liste ou de dictionnaire attendu est aucun ou non.

S'il n'y en a pas, attribuez-lui une liste ou un dictionnaire en fonction de vos besoins.

Python3




# using None as values of the default arguments> print> (> '#list'> )> def> appendItem(itemName, itemList> => None> ):> > if> itemList> => => None> :> > itemList> => []> > itemList.append(itemName)> > return> itemList> print> (appendItem(> 'notebook'> ))> print> (appendItem(> 'pencil'> ))> print> (appendItem(> 'eraser'> ))> # using None as value of default parameter> print> (> ' #dictionary'> )> def> addItemToDictionary(itemName, quantity, itemList> => None> ):> > if> itemList> => => None> :> > itemList> => {}> > itemList[itemName]> => quantity> > return> itemList> print> (addItemToDictionary(> 'notebook'> ,> 4> ))> print> (addItemToDictionary(> 'pencil'> ,> 1> ))> print> (addItemToDictionary(> 'eraser'> ,> 1> ))>

Sortir

#list ['notebook'] ['pencil'] ['eraser'] #dictionary {'notebook': 4} {'pencil': 1} {'eraser': 1} 

Ici, vous pouvez clairement voir que chaque fois qu'une fonction est appelée et qu'une liste ou un dictionnaire n'est pas passé en argument à la fonction, elle crée une nouvelle liste ou un nouveau dictionnaire.