* é um operador e não é só de multiplicação. Hun!?
Muita gente acha que *args e **kwargs são coisas mágicas em Python.
* é um operador que transforma listas em argumentos de uma função.
Por exemplo, imagina que você quer usar a função replace em uma string. Essa função recebe 2 argumentos, o primeiro para o valor que precisa ser substituído e o segundo para o novo valor.
>>> 'a escambau'.replace('a ', 'o ')
>>> 'o escambau'
>>> # Agora tentando passar os parâmetros com uma lista
>>>
>>> args = ['a ','o ']
>>> 'a escambau'.replace(args)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: replace() takes at least 2 arguments (1 given)
>>>
>>> #Para que isso funcione basta usar o operador *
>>> 'a escambau'.replace(*args)
'o escambau'
Super simples.
O ** segue a mesma lógica, é um operador que transforma um dicionário em keyword arguments de uma função.
Vou criar uma função que recebe dois argumentos e printa o nome com a idade (como na revista caras)
>>> d = {'nome' : 'Fernando', 'idade': 29}
>>> def caras_me(nome,idade):
... print("%s(%s)" % (nome,idade))
...
>>> #Colocando só o dicionário sem o operador:
>>> caras_me(d)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: caras_me() takes exactly 2 arguments (1 given)
>>> # Colocando o dicionário usando o operador **
>>> caras_me(**d)
Fernando(29)
Você pode dar uma olhada na documentação oficial, caso queira:
https://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists
* como em *args não é uma coisa mágica, é um operador que transforma uma lista em parâmetros de uma função #python #rapidinhas
— Fernando Freitas (@ffreitasalves) April 13, 2015
da mesma forma que ** como em **kwargs também é um operador que transforma um dicionário em keywords de uma função #python #rapidinhas
— Fernando Freitas (@ffreitasalves) April 13, 2015