Funções II
Diferentes formatos para os argumentos
Continuação de:
Introdução
Na seção anterior, aprendemos que funções podem ter argumentos, os quais são declarados em ordem com cada um possuindo um nome. Existem outras formas de declarar e utilizar argumentos de funções. Veremos algumas destas formas nesta seção.
Argumentos opcionais
Podemos flexibilizar as chamadas de funções de uma forma que o usuário não precise passar todos os argumentos da função. No entanto, para tornar os argumentos opcionais, precisamos definir um valor padrão para cada argumento.
Vejamos o exemplo a seguir:
# Todos os argumentos são opcionais
def func(msg1="1 vazia", msg2 ="2 vazia", msg3="3 vazia"):
print("Exibindo mensagens:")
print("\t{}".format(msg1))
print("\t{}".format(msg2))
print("\t{}".format(msg3))
print()# Realizando as chamadas
func()
func("Bem vindx!")
func("Bem vindx!", "Ao mundo")
func("Bem vindx!", "Ao mundo", "da programação")
Especificando os argumentos
No exemplo anterior, passamos os argumentos na chamada da função func
na mesma ordem em que os declaramos. Entretanto, podemos especificar quais argumentos queremos passar sem necessariamente passá-los na ordem que foram declarados.
# Todos os argumentos são opcionais
def func(msg1="1 vazia", msg2 ="2 vazia", msg3="3 vazia"):
print("Exibindo mensagens:")
print("\t{}".format(msg1))
print("\t{}".format(msg2))
print("\t{}".format(msg3))
print()# Realizando as chamadas
func()
func(msg3="Bem vindx!")
func(msg2="Ao mundo")
func(msg3="da programação", msg2="Ao mundo", msg1="Bem vindx!")
Quantidade de argumentos arbitrária
Algumas funções podem não definir diretamente a quantidade de argumentos que necessitam, permitindo que sejam passados uma quantidade arbitrária de argumentos. Estes argumentos podem ser “empacotados” numa tupla ou em um dicionário.
Empacotando argumentos em uma tupla
Para possibilitarmos uma função receber uma sequência de argumentos, devemos adicionar um argumento contendo um asterisco (*) no início de seu nome.
# Enumerando os argumentos
def enum(*args):
print("Foram passados {} argumentos:".format(len(args)))
for i,arg in enumerate(args):
print("[{}] {}".format(i, arg))# Realizando as chamadas
enum("listas", "tuplas", "dicionários")
enum("inteiros", "racionais", "strings", "booleanos")
Empacotando argumentos em um dicionário
Para o empacotamento ser feito em formato de dicionário, o argumento deve conter dois asteriscos (**) no início de seu nome. Cada argumento também deve ser passado indicando sua chave no formato chave=<valor>
.
# Enumerando os argumentos em chaves e valores(dicionário)
def python_modules(**kwargs):
print("Foram passados {} argumentos:".format(len(kwargs)))
for module,description in kwargs.items():
print("O módulo {} serve para {}".format(module, description))# Realizando as chamadas
python_modules(vlc="reprodução de mídias",
turtle="ilustrações via código",
pyglet="exibição de gifs",
opencv="visualização e processamento de imagens")
Asteriscos para desempacotar
Também podemos utilizar os asteriscos para desempacotar uma sequência (tupla ou lista), como também um dicionário.
- Desempacotando uma lista com três elementos para o método range():
# Definindo o start, stop e step
range_args = [0, 20, 3]# Desempacotando e utilizando no for
for i in range(*range_args):
print(i)
- Desempacotando um dicionário na chamada de uma função:
# Função que recebe três argumentos
def critica(coisa, qualidade, defeito):
print("{} é {}, mas {}!".format(coisa, qualidade, defeito))# Criando o dicionário com as chaves sendo os nomes dos argumentos
dic = dict()
dic["coisa"] = "Python"
dic["qualidade"] = "muito legal de aprender"
dic["defeito"] = "requer muitas horas de prática"# Desempacotando o dicionário
critica(**dic)
Conclusão
Agora, sabemos todos os possíveis formatos que nossos argumentos podem assumir. Isso nos ajudará não só na parte de criação de funções, mas também no uso de funções prontas nos módulos e frameworks que utilizaremos.