L'étoile unique *
décompose la séquence/collection en arguments positionnels, afin que vous puissiez faire ceci :
def sum(a, b):
return a + b
values = (1, 2)
s = sum(*values)
Cela va décompresser le tuple de sorte qu'il s'exécute en tant que :
s = sum(1, 2)
L'étoile double **
fait la même chose, mais en utilisant un dictionnaire et donc des arguments nommés :
values = { 'a': 1, 'b': 2 }
s = sum(**values)
Vous pouvez également combiner :
def sum(a, b, c, d):
return a + b + c + d
values1 = (1, 2)
values2 = { 'c': 10, 'd': 15 }
s = sum(*values1, **values2)
s'exécutera comme :
s = sum(1, 2, c=10, d=15)
Voir également la section 4.7.4 - Dépaquetage des listes d'arguments de la documentation Python.
De plus, vous pouvez définir des fonctions pour prendre *x
et **y
arguments, cela permet à une fonction d'accepter un nombre quelconque d'arguments positionnels et/ou nommés qui ne sont pas spécifiquement nommés dans la déclaration.
Exemple :
def sum(*values):
s = 0
for v in values:
s = s + v
return s
s = sum(1, 2, 3, 4, 5)
ou avec **
:
def get_a(**values):
return values['a']
s = get_a(a=1, b=2) # returns 1
cela peut vous permettre de spécifier un grand nombre de paramètres facultatifs sans avoir à les déclarer.
Et encore une fois, vous pouvez combiner :
def sum(*values, **options):
s = 0
for i in values:
s = s + i
if "neg" in options:
if options["neg"]:
s = -s
return s
s = sum(1, 2, 3, 4, 5) # returns 15
s = sum(1, 2, 3, 4, 5, neg=True) # returns -15
s = sum(1, 2, 3, 4, 5, neg=False) # returns 15
0 votes
Addendum : stackoverflow.com/questions/1141504/
4 votes
Je pense que cela devrait être formulé comme la "*syntaxe d'appel de fonction". Ce ne sont pas des opérateurs, bien que cela puisse prêter à confusion car il y a est a
*
et**
qui n'ont rien à voir avec cette syntaxe.1 votes
@Ian Bicking : vous avez tout à fait raison, * et ** dans la liste des arguments sont de la syntaxe pure (tokens).
3 votes
Note : Pour PEP 448 : Généralités supplémentaires sur le déballage des éléments spécifiques (par exemple
[*a, b, *c]
ou{**d1, **d2}
), vous voudrez lire astérisque dans les définitions de tuple, list et set, double astérisque dans la définition de dict qui est spécifique à l'utilisation à l'extérieur de d'appels de fonctions et de définitions de fonctions. Pour les versions antérieures PEP 3132 voir Affectation de déballage multiple en Python lorsque vous ne connaissez pas la longueur de la séquence .1 votes
VTR - Il ne s'agit pas d'un duplicata de Que font ** (double étoile/astérisque) et * (étoile/astérisque) pour les paramètres ? puisque cette question ne porte que sur les paramètres, même si les réponses couvrent également les appels de fonction. Astérisque dans l'appel de fonction devrait être marquée comme un doublon de cette question car elle est moins populaire et la première réponse est moins complète.