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.
- RELACIONADO:Como usar e anotar argumentos por defeito em funções Python
- RELACIONADO:Como utilizar argumentos de comprimento variável em Python(
*args
,**kwargs
)
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'}