Funções
À medida que seus programas crescem, você acabará escrevendo a mesma lógica em mais de um lugar. Funções permitem que você escreva a lógica uma vez, dê um nome a ela e a use em todos os lugares. Corrija em um único lugar e toda chamada recebe a correção automaticamente.
def greet(name):
return f"Hello, {name}!"
print(greet("Ana")) # "Hello, Ana!"
print(greet("Bruno")) # "Hello, Bruno!"Escreva uma vez, use em todo lugar, conserte em um único lugar.
Definindo uma função
A palavra-chave def inicia a definição de uma função, seguida pelo nome, parênteses, dois-pontos e um corpo indentado. Uma função não faz nada até ser chamada. Defina-a com def, e então chame-a pelo nome com ().
def say_hello():
print("Hello!")
say_hello() # chama a funçãoParâmetros e argumentos
Parâmetros são as entradas que sua função espera. Liste-os dentro dos parênteses. Quando você chama a função, os valores que você passa são correspondidos aos parâmetros em ordem.
def greet(name, greeting):
print(f"{greeting}, {name}!")
greet("Ana", "Hello") # "Hello, Ana!"
greet("Bruno", "Hi") # "Hi, Bruno!"Parâmetros vs argumentos
Parâmetro é o nome na definição da função. Argumento é o valor real que você passa quando chama a função. Na prática, as pessoas usam as palavras de forma intercambiável. Apenas tenha consciência da distinção ao ler documentação.
Valores padrão
Você pode dar a um parâmetro um valor padrão. Se o chamador não fornecer aquele argumento, o padrão é usado. Parâmetros com padrões devem vir depois de parâmetros sem padrões.
def greet(name, greeting="Hello"):
print(f"{greeting}, {name}!")
greet("Ana") # "Hello, Ana!"
greet("Ana", "Hi") # "Hi, Ana!"Parâmetros com padrões devem vir depois de parâmetros sem padrões.
Argumentos nomeados
Ao chamar uma função, você pode nomear os argumentos. Isso torna as chamadas legíveis, especialmente para funções com muitos parâmetros, e permite que você os passe em qualquer ordem.
def describe_player(name, score, level):
print(f"{name} | Score: {score} | Level: {level}")
describe_player("Ana", 87, 5) # posicional
describe_player(name="Ana", level=5, score=87) # nomeado, qualquer ordem
describe_player("Ana", level=5, score=87) # misto: posicionais primeiroValores de retorno
return envia um valor de volta ao chamador. Sem return, uma função devolve None. Quando return é executado, a função sai imediatamente. Qualquer código após ele naquele bloco é ignorado.
def add(a, b):
return a + b
result = add(3, 4) # result = 7
print(result)return também sai da função imediatamente. Qualquer código após ele naquele bloco não é executado.
Retornando múltiplos valores
Python permite retornar múltiplos valores separando-os com vírgulas. O chamador os recebe como uma tupla e pode desempacotá-los em nomes separados em uma única linha.
def min_max(numbers):
return min(numbers), max(numbers)
low, high = min_max([3, 7, 1, 9, 4])
print(low, high) # 1 9A sintaxe low, high = ... é desempacotamento: Python atribui cada valor retornado ao nome correspondente.
Escopo
Variáveis criadas dentro de uma função existem apenas dentro dela. Você não pode vê-las de fora. Variáveis definidas fora de todas as funções são visíveis em todos os lugares, mas você não pode alterá-las de dentro de uma função sem uma declaração explícita.
def calculate():
result = 42 # local a esta função
return result
calculate()
print(result) # NameError, result não existe aqui foracount = 0
def increment():
global count # declara que você quer modificar o global
count += 1
increment()
print(count) # 1Usar global deve ser um último recurso. Torna o código mais difícil de raciocinar. Prefira passar valores como argumentos e retorná-los.
*args e **kwargs
Às vezes você não sabe quantos argumentos uma função receberá. *args coleta qualquer número de argumentos posicionais em uma tupla. **kwargs coleta qualquer número de argumentos nomeados em um dicionário. Os nomes args e kwargs são convenções; o que importa são os asteriscos.
def total(*args):
return sum(args)
total(1, 2, 3) # 6
total(1, 2, 3, 4, 5) # 15def display(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
display(name="Ana", score=87, level=5)Você pode misturá-los com parâmetros normais. Parâmetros normais vêm primeiro:
def describe(title, *tags, **metadata):
print(f"{title} | tags: {tags} | meta: {metadata}")
describe("Python intro", "beginner", "python", author="Ana", year=2024)Docstrings
Uma docstring é uma string no topo de uma função que descreve o que ela faz. Editores Python e ferramentas a usam para mostrar ajuda quando você passa o mouse sobre uma chamada de função. Use aspas triplas e escreva uma linha para funções simples.
def normalise(value, min_val, max_val):
"""Scale a value to the 0-1 range given the known min and max."""
return (value - min_val) / (max_val - min_val)def build_url(base, version, resource, *, secure=True):
"""
Build an API endpoint URL.
Returns a fully-qualified URL string. If secure is False,
the URL will use http instead of https.
"""
scheme = "https" if secure else "http"
base = base.replace("https://", "").replace("http://", "")
return f"{scheme}://{base}/{version}/{resource}"Escreva uma docstring para qualquer função que não seja obviamente autoexplicativa pelo seu nome e assinatura.
Type hints
Type hints permitem que você anote quais tipos uma função espera e retorna. Python não os força em tempo de execução, mas editores os usam para detectar erros antes de você executar qualquer coisa. O -> antes dos dois-pontos especifica o tipo de retorno.
def greet(name: str, score: int) -> str:
return f"{name} scored {score}"def log(message: str) -> None:
print(f"[LOG] {message}")def top_scores(scores: list[int], n: int) -> list[int]:
return sorted(scores, reverse=True)[:n]Type hints são opcionais, mas valiosos em qualquer função que será chamada de múltiplos lugares. São documentação que as ferramentas podem verificar.
Funções como valores
Funções em Python são valores, assim como strings ou números. Você pode atribuí-las a variáveis e passá-las para outras funções. É assim que sorted() aceita uma função key=.
def double(x):
return x * 2
def apply(func, value):
return func(value)
apply(double, 5) # 10Passar funções como argumentos aparece constantemente com sorted(), map() e filter(). Você também verá isso no capítulo Lambda, comprehensions e zip.
Na prática
Duas funções que trabalham juntas: letter_grade converte uma pontuação em uma letra, e summarise a chama para cada pontuação em uma lista:
def letter_grade(score: int) -> str:
if score >= 90:
return "A"
elif score >= 80:
return "B"
elif score >= 70:
return "C"
else:
return "F"
def summarise(scores: list[int]) -> None:
total = sum(scores)
avg = total / len(scores)
grades = [letter_grade(s) for s in scores]
print(f"Average: {avg:.1f}")
print(f"Grades: {', '.join(grades)}")
summarise([87, 92, 74, 65, 91])
