Expansion et passage de listes, tuples et dictionnaires comme arguments de fonction en Python

Affaires

En Python, les listes (tableaux), les tuples et les dictionnaires peuvent être développés (déballés) et leurs éléments respectifs peuvent être passés ensemble comme arguments de fonction.

Lorsque vous appelez une fonction, spécifiez l'argument avec * pour les listes et les tuples et ** pour les dictionnaires. Notez le nombre d'astérisques *.

Les détails suivants sont décrits ici.

  • Développer (décompresser) une liste ou un tuple avec * (un astérisque)
    • Pour les fonctions avec des arguments par défaut
    • Pour les fonctions avec des arguments de longueur variable
  • Développez (décompressez) le dictionnaire avec ** (deux astérisques)
    • Pour les fonctions avec des arguments par défaut
    • Pour les fonctions avec des arguments de longueur variable

Voir l'article suivant pour l'utilisation de base des fonctions Python, les arguments par défaut, et les arguments de longueur variable avec *,** lors de la définition des fonctions.

Développer (décompresser) une liste ou un tuple avec * (un astérisque)

Lorsqu'une liste ou un tuple est spécifié comme argument avec *, il est développé et chaque élément est passé comme un argument séparé.

def func(arg1, arg2, arg3):
    print('arg1 =', arg1)
    print('arg2 =', arg2)
    print('arg3 =', arg3)

l = ['one', 'two', 'three']

func(*l)
# arg1 = one
# arg2 = two
# arg3 = three

func(*['one', 'two', 'three'])
# arg1 = one
# arg2 = two
# arg3 = three

t = ('one', 'two', 'three')

func(*t)
# arg1 = one
# arg2 = two
# arg3 = three

func(*('one', 'two', 'three'))
# arg1 = one
# arg2 = two
# arg3 = three

L'explication suivante concerne une liste, mais la même chose s'applique à un tuple.

Si le nombre d'éléments ne correspond pas au nombre d'arguments, une erreur TypeError se produit.

# func(*['one', 'two'])
# TypeError: func() missing 1 required positional argument: 'arg3'

# func(*['one', 'two', 'three', 'four'])
# TypeError: func() takes 3 positional arguments but 4 were given

Pour les fonctions avec des arguments par défaut

Si un argument par défaut est défini, celui-ci est utilisé si le nombre d'éléments est insuffisant. Si le nombre d'éléments est trop grand, une erreur TypeError se produit.

def func_default(arg1=1, arg2=2, arg3=3):
    print('arg1 =', arg1)
    print('arg2 =', arg2)
    print('arg3 =', arg3)

func_default(*['one', 'two'])
# arg1 = one
# arg2 = two
# arg3 = 3

func_default(*['one'])
# arg1 = one
# arg2 = 2
# arg3 = 3

# func_default(*['one', 'two', 'three', 'four'])
# TypeError: func_default() takes from 0 to 3 positional arguments but 4 were given

Pour les fonctions avec des arguments de longueur variable

Si un argument de longueur variable est défini, tous les éléments après l'élément pour l'argument positionnel sont passés à l'argument de longueur variable.

def func_args(arg1, *args):
    print('arg1 =', arg1)
    print('args =', args)

func_args(*['one', 'two'])
# arg1 = one
# args = ('two',)

func_args(*['one', 'two', 'three'])
# arg1 = one
# args = ('two', 'three')

func_args(*['one', 'two', 'three', 'four'])
# arg1 = one
# args = ('two', 'three', 'four')

Développez (décompressez) le dictionnaire avec ** (deux astérisques)

Lorsqu'un dictionnaire dict est spécifié en tant qu'argument avec **, les clés des éléments sont développées en tant que noms d'argument et les valeurs en tant que valeurs d'argument, et chacune est passée comme un argument séparé.

def func(arg1, arg2, arg3):
    print('arg1 =', arg1)
    print('arg2 =', arg2)
    print('arg3 =', arg3)

d = {'arg1': 'one', 'arg2': 'two', 'arg3': 'three'}

func(**d)
# arg1 = one
# arg2 = two
# arg3 = three

func(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three'})
# arg1 = one
# arg2 = two
# arg3 = three

Si aucune clé ne correspond au nom de l'argument ou s'il existe une clé qui ne correspond pas, une erreur TypeError sera générée.

# func(**{'arg1': 'one', 'arg2': 'two'})
# TypeError: func() missing 1 required positional argument: 'arg3'

# func(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three', 'arg4': 'four'})
# TypeError: func() got an unexpected keyword argument 'arg4'

Pour les fonctions avec des arguments par défaut

Image dans laquelle seules les valeurs des noms d'arguments qui correspondent aux clés du dictionnaire sont mises à jour.

Une clé qui ne correspond pas au nom de l'argument entraînera une erreur TypeError.

def func_default(arg1=1, arg2=2, arg3=3):
    print('arg1 =', arg1)
    print('arg2 =', arg2)
    print('arg3 =', arg3)

func_default(**{'arg1': 'one'})
# arg1 = one
# arg2 = 2
# arg3 = 3

func_default(**{'arg2': 'two', 'arg3': 'three'})
# arg1 = 1
# arg2 = two
# arg3 = three

# func_default(**{'arg1': 'one', 'arg4': 'four'})
# TypeError: func_default() got an unexpected keyword argument 'arg4'

Pour les fonctions avec des arguments de longueur variable

Si des arguments de longueur variable sont définis, tout élément dont la clé est différente du nom de l'argument spécifié en tant qu'argument est passé à l'argument de longueur variable.

def func_kwargs(arg1, **kwargs):
    print('arg1 =', arg1)
    print('kwargs =', kwargs)

func_kwargs(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three'})
# arg1 = one
# kwargs = {'arg2': 'two', 'arg3': 'three'}

func_kwargs(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three', 'arg4': 'four'})
# arg1 = one
# kwargs = {'arg2': 'two', 'arg3': 'three', 'arg4': 'four'}

func_kwargs(**{'arg1': 'one', 'arg3': 'three'})
# arg1 = one
# kwargs = {'arg3': 'three'}
Copied title and URL