Funções em Python: N maneiras diferentes de declarar e chamar!
Existem N maneiras de declarar/chamar funções em Python… Hoje veremos algumas delas!
Função sem argumentos
def hello_world():
print("Hello World!")
Nenhuma novidade até aí: Sem argumentos, instrução simples, é só executar e ser feliz:
>>> hello_world()
Hello World!
Função com argumentos obrigatórios
Trata-se do método old-fashion: Argumentos identificados pela ordem:
def say_something(msg, name):
print('{}, {}!'.format(msg, name))
A chamada seria algo como:
>>> say_something('Hi', 'Nina')
Hi, Nina!
Novamente, nenhuma novidade… Mas se tentarmos chamar a função com menos argumentos ela simplesmente não será executada!
>>> say_something('Hi')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: greet() takes exactly 2 arguments (1 given)
E se errarmos a ordem dos argumentos, a função interpretatará name como msg e msg como name:
say_something('Nina', 'Hi')
Nina, Hi!
Função com argumentos nomeados na chamada
Nós até podemos inverter a ordem dos argumentos, desde que os tratemos como argumentos nomeados:
>>> greet(name='Nina', msg='Hi')
Hi, Nina!
repare que embora tenhamos passado o nome antes da mensagem, eles foram usados na ordem certa, pois os parâmetros foram nomeados :)
Função declarada com valores padrão
Também é possível definir valores padrão para argumento(s) de uma função:
def say_something(name, msg='Oh yeah'):
print('{}, {}!'.format(msg, name))
Dessa forma podemos omitir o argumento msg na chamada, pois ele assumirá seu valor padrão:
say_something('Buckethead')
Oh yeah, Buckethead!
Observação: O argumento com valor padrão não ficou por último por acaso, é obrigatório que seja assim! Ou todos têm valor padrão, ou os com valor padrão fica por último.
Recapitulando
say_something(msg, name) # obrigatórios e na ordem certa!
say_something(name='Nina', msg='Hi!') # nomeados, ordem arbitrária!
def say_something(name, msg='hi!') # valor padrão, permite omissão!
Conclusão
Whatever, man! — Jeffrey Lebowski
O próximo será sobre *args e **kwargs :)