Expandindo e passando listas, tuplos e dicionários como argumentos de função em Python

O negócio

Em Python, listas (matrizes), tuplos e dicionários podem ser expandidos (desembalados) e os seus respectivos elementos podem ser passados em conjunto como argumentos de função.

Ao chamar uma função, especificar o argumento com * para listas e tuplos e ** para dicionários. Anote o número de asteriscos *.

Os seguintes detalhes são descritos aqui.

  • Expandir (desembalar) uma lista ou tuple com * (um asterisco)
    • Para funções com argumentos por defeito
    • Para funções com argumentos de comprimento variável
  • Expandir (desembalar) o dicionário com ** (dois asteriscos)
    • Para funções com argumentos por defeito
    • Para funções com argumentos de comprimento variável

Ver o artigo seguinte para a utilização básica das funções Python, argumentos padrão, e argumentos de comprimento variável com *,** ao definir funções.

Expandir (desembalar) uma lista ou tuple com * (um asterisco)

Quando uma lista ou tuple é especificada como um argumento com *, é expandida e cada elemento é passado como um argumento separado.

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

A seguinte explicação é para uma lista, mas o mesmo se aplica a um tuple.

Se o número de elementos não corresponder ao número de argumentos, ocorre um erro de TypeError.

# 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

Para funções com argumentos por defeito

Se for definido um argumento por defeito, o argumento por defeito é utilizado se o número de elementos for insuficiente. Se o número de elementos for demasiado grande, ocorre um erro de TypeError.

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

Para funções com argumentos de comprimento variável

Se for definido um argumento de comprimento variável, todos os elementos após o elemento para o argumento posicional são passados para o argumento de comprimento variável.

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')

Expandir (desembalar) o dicionário com ** (dois asteriscos)

Quando um ditado de dicionário é especificado como um argumento com **, as chaves do elemento são expandidas como nomes de argumentos e valores como valores de argumentos, e cada um é passado como um argumento separado.

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

Se não houver uma chave que corresponda ao nome do argumento ou se houver uma chave que não corresponda, resultará um erro de TypeError.

# 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'

Para funções com argumentos por defeito

Imagem na qual apenas os valores dos nomes dos argumentos que correspondem às chaves do dicionário são actualizados.

Uma chave que não corresponda ao nome do argumento resultará num erro de 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'

Para funções com argumentos de comprimento variável

Se forem definidos argumentos de comprimento variável, qualquer elemento com uma chave diferente do nome do argumento especificado à medida que o argumento é passado para o argumento de comprimento variável.

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