Utilisation d'arguments facultatifs Python lors de la définition de fonctions – Real Python

By | août 30, 2021

Expert Python

Dans cette section, vous apprendrez à définir une fonction qui prend un argument facultatif. Les fonctions avec des arguments facultatifs offrent plus de flexibilité dans la façon dont vous pouvez les utiliser. Vous pouvez appeler la fonction avec ou sans l'argument, et s'il n'y a pas d'argument dans l'appel de fonction, une valeur par défaut est utilisée.

Valeurs par défaut attribuées aux paramètres d'entrée

Vous pouvez modifier la fonction ajouter un item() de sorte que le paramètre quantité a une valeur par défaut :

# option_params.py

liste de courses = 

déf ajouter un item(nom de l'article, quantité=1):
    si nom de l'article dans liste de courses.clés():
        liste de courses[[[[nom de l'article] += quantité
    autre:
        liste de courses[[[[nom de l'article] = quantité

ajouter un item("Pain")
ajouter un item("Du lait", 2)
imprimer(liste de courses)

Dans la signature de la fonction, vous avez ajouté la valeur par défaut 1 au paramètre quantité. Cela ne signifie pas que la valeur de quantité sera toujours 1. Si vous passez un argument correspondant à quantité lorsque vous appelez la fonction, cet argument sera utilisé comme valeur pour le paramètre. Cependant, si vous ne passez aucun argument, la valeur par défaut sera utilisée.

Les paramètres avec des valeurs par défaut ne peuvent pas être suivis de paramètres normaux. Vous en saurez plus sur l'ordre dans lequel vous pouvez définir les paramètres plus loin dans ce didacticiel.

La fonction ajouter un item() a maintenant un paramètre obligatoire et un paramètre facultatif. Dans l'exemple de code ci-dessus, vous appelez ajouter un item() à deux reprises. Votre premier appel de fonction a un seul argument, qui correspond au paramètre requis nom de l'article. Dans ce cas, quantité par défaut à 1. Votre deuxième appel de fonction a deux arguments, donc la valeur par défaut n'est pas utilisée dans ce cas. Vous pouvez voir le résultat ci-dessous :

$ python optionnel_params.py
'Pain' : 1, 'Lait' : 2

Vous pouvez également passer des arguments obligatoires et facultatifs dans une fonction comme arguments de mot-clé. Les arguments de mot-clé peuvent également être appelés arguments nommés :

ajouter un item(nom de l'article="Du lait", quantité=2)

Vous pouvez maintenant revisiter la première fonction que vous avez définie dans ce tutoriel et la refactoriser afin qu'elle accepte également un argument par défaut :

déf show_list(inclure_quantités=Vrai):
    pour nom de l'article, quantité dans liste de courses.éléments():
        si inclure_quantités:
            imprimer(F"quantitéX nom de l'article")
        autre:
            imprimer(nom de l'article)

Maintenant, lorsque vous utilisez show_list(), vous pouvez l'appeler sans argument d'entrée ou passer une valeur booléenne en tant que drapeau argument. Si vous ne transmettez aucun argument lors de l'appel de la fonction, la liste de courses s'affiche en affichant le nom et la quantité de chaque article. La fonction affichera la même sortie si vous passez Vrai comme argument lors de l'appel de la fonction. Cependant, si vous utilisez show_list(Faux), seuls les noms des éléments sont affichés.

Vous devez éviter d'utiliser des indicateurs dans les cas où la valeur de l'indicateur modifie de manière significative le comportement de la fonction. Une fonction ne devrait être responsable que d'une chose. Si vous voulez qu'un indicateur pousse la fonction dans un chemin alternatif, vous pouvez envisager d'écrire une fonction distincte à la place.

Valeurs communes des arguments par défaut

Dans les exemples sur lesquels vous avez travaillé ci-dessus, vous avez utilisé l'entier 1 comme valeur par défaut dans un cas et la valeur booléenne Vrai dans l'autre. Ce sont des valeurs par défaut courantes que vous trouverez dans les définitions de fonctions. Cependant, le type de données que vous devez utiliser pour les valeurs par défaut dépend de la fonction que vous définissez et de la manière dont vous souhaitez que la fonction soit utilisée.

Les entiers 0 et 1 sont des valeurs par défaut courantes à utiliser lorsque la valeur d'un paramètre doit être un entier. Ceci est dû au fait 0 et 1 sont souvent des valeurs de repli utiles. Dans le ajouter un item() fonction que vous avez écrite plus tôt, en définissant la quantité d'un nouvel article sur 1 est l'option la plus logique.

Cependant, si vous aviez l'habitude d'acheter deux de tout ce que vous achetez lorsque vous allez au supermarché, définissez la valeur par défaut sur 2 peut être plus approprié pour vous.

Lorsque le paramètre d'entrée doit être une chaîne, une valeur par défaut commune à utiliser est la chaîne vide (""). Cela attribue une valeur dont le type de données est une chaîne mais ne met aucun caractère supplémentaire. Vous pouvez modifier ajouter un item() de sorte que les deux arguments sont facultatifs :

déf ajouter un item(nom de l'article="", quantité=1):
    si nom de l'article dans liste de courses.clés():
        liste de courses[[[[nom de l'article] += quantité
    autre:
        liste de courses[[[[nom de l'article] = quantité

Vous avez modifié la fonction pour que les deux paramètres aient une valeur par défaut et donc la fonction peut être appelée sans paramètres d'entrée :

Cette ligne de code ajoutera un élément au liste de courses dictionnaire avec une chaîne vide comme clé et une valeur de 1. Il est assez courant de vérifier si un argument a été passé lorsque la fonction est appelée et d'exécuter du code en conséquence. Vous pouvez modifier la fonction ci-dessus pour ce faire :

déf ajouter un item(nom de l'article="", quantité=1):
    si ne pas nom de l'article:
        quantité = 0
    si nom de l'article dans liste de courses.clés():
        liste de courses[[[[nom de l'article] += quantité
    autre:
        liste de courses[[[[nom de l'article] = quantité

Dans cette version, si aucun article n'est passé à la fonction, la fonction définit la quantité sur 0. La chaîne vide a un faux valeur, ce qui signifie que booléen("") Retour Faux, alors que toute autre chaîne aura un véridique valeur. Quand un si mot-clé est suivi d'une valeur vraie ou fausse, le si déclaration les interprétera comme Vrai ou Faux. Vous pouvez en savoir plus sur les valeurs vraies et fausses dans Python Booleans: Optimize Your Code With Truth Values.

Par conséquent, vous pouvez utiliser la variable directement dans un si pour vérifier si un argument facultatif a été utilisé.

Une autre valeur courante souvent utilisée comme valeur par défaut est Rien. C'est la façon dont Python ne représente rien, bien qu'il s'agisse en fait d'un objet qui représente la valeur nulle. Vous verrez un exemple de quand Rien est une valeur par défaut utile à utiliser dans la section suivante.

Types de données qui ne doivent pas être utilisés comme arguments par défaut

Vous avez utilisé des entiers et des chaînes comme valeurs par défaut dans les exemples ci-dessus, et Rien est une autre valeur par défaut commune. Ce ne sont pas les seuls types de données que vous pouvez utiliser comme valeurs par défaut. Cependant, tous les types de données ne doivent pas être utilisés.

Dans cette section, vous verrez pourquoi mutable les types de données ne doivent pas être utilisés comme valeurs par défaut dans les définitions de fonctions. Un objet mutable est un objet dont les valeurs peuvent être modifiées, comme une liste ou un dictionnaire. Vous pouvez en savoir plus sur les types de données mutables et immuables dans Immutability in Python et dans la documentation officielle de Python.

Vous pouvez ajouter le dictionnaire contenant les noms d'articles et les quantités en tant que paramètre d'entrée à la fonction que vous avez définie précédemment. Vous pouvez commencer par rendre tous les arguments obligatoires :

déf ajouter un item(nom de l'article, quantité, liste de courses):
    si nom de l'article dans liste de courses.clés():
        liste de courses[[[[nom de l'article] += quantité
    autre:
        liste de courses[[[[nom de l'article] = quantité

    revenir liste de courses

Vous pouvez maintenant passer liste de courses à la fonction lorsque vous l'appelez. Cela rend la fonction plus autonome car elle ne repose pas sur une variable appelée liste de courses exister dans la portée qui appelle la fonction. Ce changement rend également la fonction plus flexible car vous pouvez l'utiliser avec différents dictionnaires d'entrée.

Vous avez également ajouté le revenir instruction pour retourner le dictionnaire modifié. Cette ligne n'est techniquement pas requise à ce stade car les dictionnaires sont un type de données mutable et donc la fonction changera l'état du dictionnaire qui existe dans le module principal. Cependant, vous aurez besoin du revenir plus tard lorsque vous rendez cet argument facultatif, il est donc préférable de l'inclure maintenant.

Pour appeler la fonction, vous devrez affecter les données renvoyées par la fonction à une variable :

liste de courses = ajouter un item("Café", 2, liste de courses)

Vous pouvez également ajouter un liste de courses paramètre à show_list(), la première fonction que vous avez définie dans ce tutoriel. Vous pouvez désormais avoir plusieurs listes de courses dans votre programme et utiliser les mêmes fonctions pour ajouter des articles et afficher les listes de courses :

# option_params.py

liste_magasins_matériel = 
liste_supermarchés = 

déf show_list(liste de courses, inclure_quantités=Vrai):
    imprimer()
    pour nom de l'article, quantité dans liste de courses.éléments():
        si inclure_quantités:
            imprimer(F"quantitéX nom de l'article")
        autre:
            imprimer(nom de l'article)

déf ajouter un item(nom de l'article, quantité, liste de courses):
    si nom de l'article dans liste de courses.clés():
        liste de courses[[[[nom de l'article] += quantité
    autre:
        liste de courses[[[[nom de l'article] = quantité

    revenir liste de courses

liste_magasins_matériel = ajouter un item("Clous", 1, liste_magasins_matériel)
liste_magasins_matériel = ajouter un item("Tournevis", 1, liste_magasins_matériel)
liste_magasins_matériel = ajouter un item("La colle", 3, liste_magasins_matériel)

liste_supermarchés = ajouter un item("Pain", 1, liste_supermarchés)
liste_supermarchés = ajouter un item("Du lait", 2, liste_supermarchés)

show_list(liste_magasins_matériel)
show_list(liste_supermarchés)

Vous pouvez voir la sortie de ce code ci-dessous. La liste des articles à acheter à la quincaillerie s'affiche en premier. La deuxième partie de la sortie montre les articles nécessaires au supermarché :

$ python optionnel_params.py

1x ongles
1x Tournevis
3x colle

1x Pain
2x Lait

Vous allez maintenant ajouter une valeur par défaut pour le paramètre liste de courses dans ajouter un item() de sorte que si aucun dictionnaire n'est passé à la fonction, alors un dictionnaire vide est utilisé. L'option la plus tentante est de faire de la valeur par défaut un dictionnaire vide. Vous verrez bientôt pourquoi ce n'est pas une bonne idée, mais vous pouvez essayer cette option pour le moment :

# option_params.py

déf show_list(liste de courses, inclure_quantités=Vrai):
    imprimer()
    pour nom de l'article, quantité dans liste de courses.éléments():
        si inclure_quantités:
            imprimer(F"quantitéX nom de l'article")
        autre:
            imprimer(nom de l'article)

déf ajouter un item(nom de l'article, quantité, liste de courses=) :
    si nom de l'article dans liste de courses.clés():
        liste de courses[[[[nom de l'article] += quantité
    autre:
        liste de courses[[[[nom de l'article] = quantité

    revenir liste de courses

liste_de_boutiques_de_vêtements = ajouter un item("La chemise", 3)
show_list(liste_de_boutiques_de_vêtements)

Lorsque vous exécutez ce script, vous obtenez le résultat ci-dessous indiquant les articles nécessaires dans le magasin de vêtements, ce qui peut donner l'impression que ce code fonctionne comme prévu :

$ python optionnel_params.py

3x Chemise

Cependant, ce code a un défaut sérieux qui peut conduire à des résultats inattendus et erronés. Vous pouvez ajouter une nouvelle liste d'achats pour les articles nécessaires dans le magasin d'électronique en utilisant ajouter un item() sans argument correspondant à liste de courses. Cela conduit à l'utilisation de la valeur par défaut, qui, vous l'espérez, créerait un nouveau dictionnaire vide :

# option_params.py

déf show_list(liste de courses, inclure_quantités=Vrai):
    imprimer()
    pour nom de l'article, quantité dans liste de courses.éléments():
        si inclure_quantités:
            imprimer(F"quantitéX nom de l'article")
        autre:
            imprimer(nom de l'article)

déf ajouter un item(nom de l'article, quantité, liste de courses=) :
    si nom de l'article dans liste de courses.clés():
        liste de courses[[[[nom de l'article] += quantité
    autre:
        liste de courses[[[[nom de l'article] = quantité

    revenir liste de courses

liste_de_boutiques_de_vêtements = ajouter un item("La chemise", 3)
liste_magasins_électronique = ajouter un item("Cable USB", 1)
show_list(liste_de_boutiques_de_vêtements)
show_list(liste_magasins_électronique)

Vous verrez le problème lorsque vous regardez la sortie de ce code :

$ python optionnel_params.py

3x Chemise
1x câble USB

3x Chemise
1x câble USB

Les deux listes de courses sont identiques même si vous avez affecté la sortie de ajouter un item() à différentes variables chaque fois que vous appelez la fonction. Le problème se produit parce que les dictionnaires sont un type de données modifiable.

Vous avez affecté un dictionnaire vide comme valeur par défaut pour le paramètre liste de courses lorsque vous avez défini la fonction. La première fois que vous appelez la fonction, ce dictionnaire est vide. Cependant, comme les dictionnaires sont de type modifiable, lorsque vous affectez des valeurs au dictionnaire, le dictionnaire par défaut n'est plus vide.

Lorsque vous appelez la fonction pour la deuxième fois et la valeur par défaut pour liste de courses est à nouveau requis, le dictionnaire par défaut n'est plus vide car il a été renseigné la première fois que vous avez appelé la fonction. Puisque vous appelez la même fonction, vous utilisez le même dictionnaire par défaut stocké en mémoire.

Ce comportement ne se produit pas avec les types de données immuables. La solution à ce problème consiste à utiliser une autre valeur par défaut, telle que Rien, puis créez un dictionnaire vide dans la fonction lorsqu'aucun argument facultatif n'est passé :

# option_params.py

déf show_list(liste de courses, inclure_quantités=Vrai):
    imprimer()
    pour nom de l'article, quantité dans liste de courses.éléments():
        si inclure_quantités:
            imprimer(F"quantitéX nom de l'article")
        autre:
            imprimer(nom de l'article)

déf ajouter un item(nom de l'article, quantité, liste de courses=Rien):
    si liste de courses est Rien:
        liste de courses = 
    si nom de l'article dans liste de courses.clés():
        liste de courses[[[[nom de l'article] += quantité
    autre:
        liste de courses[[[[nom de l'article] = quantité

    revenir liste de courses

liste_de_boutiques_de_vêtements = ajouter un item("La chemise", 3)
liste_magasins_électronique = ajouter un item("Cable USB", 1)
show_list(liste_de_boutiques_de_vêtements)
show_list(liste_magasins_électronique)

Vous pouvez vérifier si un dictionnaire a été passé en argument à l'aide de la si déclaration. Vous ne devez pas vous fier à la fausse nature de Rien mais à la place, vérifiez explicitement que l'argument est Rien. S'appuyant sur le fait que Rien sera traité comme une valeur fausse peut causer des problèmes si un autre argument qui est faux est passé.

Maintenant, lorsque vous exécutez à nouveau votre script, vous obtiendrez la sortie correcte car un nouveau dictionnaire est créé chaque fois que vous utilisez la fonction avec la valeur par défaut pour liste de courses:

$ python optionnel_params.py

3x Chemise

1x câble USB

Vous devez toujours éviter d'utiliser un type de données modifiable comme valeur par défaut lors de la définition d'une fonction avec des paramètres facultatifs.

[ad_2]