350 votes

Que signifie l'astérisque * en Python ?

Est-ce que * a une signification particulière en Python comme en C ? J'ai vu une fonction de ce type dans le Python Cookbook :

def get(self, *a, **kw)

Pourriez-vous me l'expliquer ou m'indiquer où je peux trouver une réponse (Google interprète le * comme un caractère de remplacement et je ne peux donc pas trouver de réponse satisfaisante).

Merci beaucoup.

1 votes

Voir aussi stackoverflow.com/questions/14301967/ pour un astérisque nu

0 votes

S'agit-il toujours d'un doublon ? La question référencée concerne spécifiquement les paramètres des fonctions, alors que cette question (du moins d'après son titre) couvrirait également une syntaxe telle que [*my_dict]

333voto

S.Lott Points 207588

Voir Définitions des fonctions dans la référence linguistique.

Si le formulaire *identifier est présent, il est initialisé à un tuple recevant tout excédent de position par défaut le tuple vide. vide. Si la forme **identifier est présent, il est initialisé à un nouveau recevant tout excédent de par défaut un nouveau dictionnaire vide. dictionnaire vide.

Voir aussi Appels de fonction .

244 votes

Bien qu'il s'agisse d'une définition très précise, il s'agit d'une très mauvaise explication, et il est peu probable qu'elle aide réellement un programmeur en difficulté.

2 votes

Les liens vers la documentation sont cassés.

0 votes

Que signifie l'astérisque lorsqu'il n'y a pas de nom d'argument ? Par exemple, dans certaines fonctions de la classe pprint .

195voto

Jason Baker Points 56682

Je n'ai qu'une seule chose à ajouter qui n'était pas claire dans les autres réponses (par souci d'exhaustivité).

Vous pouvez également utiliser les étoiles lors de l'appel de la fonction. Par exemple, disons que vous avez un code comme celui-ci :

>>> def foo(*args):
...     print(args)
...
>>> l = [1,2,3,4,5]

Vous pouvez passer la liste l dans foo comme ceci...

>>> foo(*l)
(1, 2, 3, 4, 5)

Vous pouvez faire de même pour les dictionnaires...

>>> def foo(**argd):
...     print(argd)
...
>>> d = {'a' : 'b', 'c' : 'd'}
>>> foo(**d)
{'a': 'b', 'c': 'd'}

13 votes

Désolé de remettre ça sur le tapis 7 ans plus tard, mais si vous avez enlevé ** de la déclaration fn pour avoir juste def foo(argd): et tu as couru foo(d) vous obtiendriez le même résultat. Pourquoi alors ** utilisé ?

5 votes

@David oui, vous avez raison. L'exemple est juste pour démontrer comment "déballer" un dict et ensuite le "remballer" à l'intérieur de la fonction. Par exemple, foo(a="b", c="d") fournirait également le même résultat que foo(**d) .

3 votes

J'ai vu la première réponse et je me suis dit, "Non, ce n'est pas ce que je voulais", et puis j'ai vu ta réponse :)

90voto

Salim Fadhley Points 4296

Toutes les réponses ci-dessus étaient parfaitement claires et complètes, mais pour mémoire, je tiens à confirmer que la signification de * et ** en python n'a absolument aucune similitude avec la signification des opérateurs similaires en C.

Ils sont appelés les opérateurs de déballage d'arguments et de déballage de mots-clés.

2 votes

Une clarification est nécessaire, ma pensée initiale était de passer par référence pour *

40voto

HUAGHAGUAH Points 665

Une étoile simple signifie que la variable 'a' sera un tuple de paramètres supplémentaires qui ont été fournis à la fonction. La double étoile signifie que la variable 'kw' sera un dictionnaire de taille variable de paramètres supplémentaires qui ont été fournis avec des mots-clés.

Bien que le comportement réel soit spécifié, il peut parfois être très peu intuitif. Écrire quelques exemples de fonctions et les appeler avec différents styles de paramètres peut vous aider à comprendre ce qui est autorisé et quels sont les résultats.

def f0(a)
def f1(*a)
def f2(**a)
def f3(*a, **b)
etc...

11 votes

Sans vouloir pinailler, si vous utilisez une seule étoile, l'argument est stocké sous forme de tuple et non de liste.

29voto

Clint Miller Points 6339

Je trouve * utile lorsque j'écris une fonction qui prend une autre fonction de rappel comme paramètre :

def some_function(parm1, parm2, callback, *callback_args):
    a = 1
    b = 2
    ...
    callback(a, b, *callback_args)
    ...

De cette façon, les appelants peuvent passer des paramètres supplémentaires arbitraires qui seront transmis à leur fonction de rappel. L'avantage est que la fonction de rappel peut utiliser des paramètres de fonction normaux. C'est-à-dire qu'elle n'a pas besoin d'utiliser la syntaxe * du tout. Voici un exemple :

def my_callback_function(a, b, x, y, z):
    ...

x = 5
y = 6
z = 7

some_function('parm1', 'parm2', my_callback_function, x, y, z)

Bien entendu, les fermetures offrent un autre moyen de faire la même chose sans vous obliger à faire passer x, y et z par some_function() et dans my_callback_function().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X