Lembra quando você tinha que copiar e colar o mesmo código várias vezes? Hoje a gente acaba com isso. Você vai aprender a empacotar pedaços de código e reutilizar quantas vezes quiser. Bora?
Imagina que você quer cumprimentar três pessoas diferentes no seu programa. Sem função, você acabaria fazendo isso aqui:
print("Olá, Ana! Bem-vinda à programa AI 🐍") print("Olá, João! Bem-vindo à programa AI 🐍") print("Olá, Davi! Bem-vindo à programa AI 🐍")
Olha quanto código duplicado! Se um dia o curso mudar de nome, você teria que editar três linhas. Se forem cem alunos… já viu, né?
def saudacao(nome): print(f"Olá, {nome}! Bem-vindo à programa AI 🐍") saudacao("Ana") saudacao("João") saudacao("Davi")
Você escreve a receita uma vez. Depois, sempre que quiser bolo, é só seguir a receita — não precisa inventar tudo do zero. Função em Python é exatamente isso: um pedaço de código com nome, guardado, esperando você chamar.
Pra criar uma função em Python, a gente usa a palavra-chave
def (de define, "definir"). Olha que simples:
if e ao for que a gente já viu.
Mas atenção: definir a função NÃO faz nada acontecer ainda! É como escrever a receita do bolo — o bolo ainda não existe. Pra ela rodar, a gente precisa chamar:
# 1) DEFINIÇÃO — só ensina o Python o que é "saudacao" def saudacao(): print("Olá! Bem-vindo à programa AI 🐍") # 2) CHAMADA — agora SIM ela executa saudacao()
def = ensinar a função.
saudacao() = mandar ela rodar. Os parênteses no fim são essenciais —
sem eles, você só "aponta" pra função, não chama.
Esse é o jeito mais útil de pensar em função: como uma maquininha. Você joga uma coisa na entrada, ela processa, e devolve algo na saída:
Você joga frutas dentro (entrada), aperta o botão e sai vitamina (saída). Cada vez que você troca a fruta, sai uma vitamina diferente — mas o liquidificador é o mesmo.
Função em Python = mesma ideia. Mesmo código, entradas diferentes, resultados diferentes.
print() até as suas.
Até agora nossa função sempre fala "Olá! Bem-vindo…" genérico. Que tal personalizar pra cada pessoa? Pra isso, a gente coloca um parâmetro entre os parênteses:
def saudacao(nome): print(f"Olá, {nome}! Bem-vindo à programa AI 🐍") saudacao("Ana") saudacao("João")
Parâmetro é o nome que aparece na definição
(entre os parênteses do def). É tipo um espaço reservado:
"aqui vai vir um nome".
Argumento é o valor real que você passa quando chama:
saudacao("Ana") — "Ana" é o argumento.
Tranquilo se misturar os dois nomes, todo mundo faz isso 😅.
def soma(a, b): recebe dois números.
def cadastro(nome, idade, curso): recebe três coisas.
Só não esquece de passar o mesmo número de argumentos quando for chamar!
Olha como a mesma função, chamada três vezes com argumentos diferentes, produz três resultados diferentes — sem você reescrever nada:
Dois exercícios curtinhos antes de aprender o return. O primeiro a gente faz junto. O segundo… olhinho 👀.
Vamos criar uma função que recebe dois números e imprime a soma. Passo a passo:
func_soma.py no PyCharm.a e b.print() mostrando o resultado de a + b.def soma(a, b): print(f"{a} + {b} = {a + b}") soma(2, 3) soma(10, 7)
soma existe pra sempre. Pode chamar mil vezes,
com mil pares — não precisa reescrever a continha.
Crie um arquivo func_saudacao.py. Defina uma função chamada
saudar que recebe dois parâmetros: nome e curso.
Dentro dela, use print() com f-string mostrando algo como
"Olá, [nome]! Bom estudo no curso de [curso] 🚀".
Depois chame ela três vezes com pessoas/cursos diferentes. Lembra do exercício da soma? É a mesma estrutura — só muda o que tem dentro!
def saudar(nome, curso): print(f"Olá, {nome}! Bom estudo no curso de {curso} 🚀") saudar("Ana", "Python") saudar("João", "JavaScript") saudar("Davi", "Lógica de Programação")
saudar("Ana", "Python") → nome="Ana", curso="Python".
Trocar a ordem na chamada vira bagunça!
Até agora nossas funções só mostravam coisas com print().
Mas e se a gente quiser guardar o resultado da função pra usar depois?
Pra isso existe o return:
def soma(a, b): print(a + b) soma(2, 3) # mostra 5 e acabou
def soma(a, b): return a + b resultado = soma(2, 3) print(resultado * 10) # 50
Quando o Python encontra um return, ele sai da função
levando aquele valor pra fora. Quem chamou a função pode guardar esse valor numa variável
ou usar direto numa conta.
Diferença chave: print() só mostra na tela, ninguém pega o valor.
return entrega o valor de volta — você decide o que fazer com ele.
return é igual telefone sem voz —
ela faz coisa, mas não te conta nada de volta". Quando você quiser usar
o resultado, use return.
print() e return?saudacao sem os parênteses, em saudacao?Vamos juntar tudo que a gente já viu (input, conversão, condicional, agora função!) num sistema simples: o usuário digita 3 notas, a gente calcula a média e diz se passou. Aprovado se média ≥ 7.
# pega as 3 notas (convertendo pra float, podem ter vírgula) n1 = float(input("Nota 1: ")) n2 = float(input("Nota 2: ")) n3 = float(input("Nota 3: ")) media = (n1 + n2 + n3) / 3 if media >= 7: print(f"Média {media:.1f} — APROVADO ✅") else: print(f"Média {media:.1f} — REPROVADO ❌")
Bora refatorar (deixar mais inteligente) o exercício anterior.
Crie sistema_notas_func.py. Defina uma função resultado_aluno
que recebe 3 parâmetros (n1, n2, n3).
Dentro dela: calcula a média e retorna uma frase pronta tipo "Média 7.7 — APROVADO ✅" ou "Média 4.2 — REPROVADO ❌".
Depois, fora da função, peça as 3 notas com input(), chame a função e
imprima o que ela retornou. Bônus: chame a função 2 ou 3 vezes
com notas diferentes — repare como agora ficou fácil!
def resultado_aluno(n1, n2, n3): media = (n1 + n2 + n3) / 3 if media >= 7: return f"Média {media:.1f} — APROVADO ✅" else: return f"Média {media:.1f} — REPROVADO ❌" # pega as notas do usuário n1 = float(input("Nota 1: ")) n2 = float(input("Nota 2: ")) n3 = float(input("Nota 3: ")) # chama a função e mostra o que ela retornou print(resultado_aluno(n1, n2, n3))
print(resultado_aluno(5, 4, 6)). Esse é o poder da reutilização.
Função é onde o iniciante mais escorrega. Mas todo erro é o mesmo padrão: você está chamando errado, ou esqueceu um detalhe. Olha os clássicos 👇
def saudacao(): print("Olá!") saudacao # ❌ sem ()
Resultado: nada aparece. O programa termina silencioso.
def saudacao(): print("Olá!") saudacao() # ✅ com ()
def 🎯def saudacao(nome) # ❌ faltou : print(nome)
def saudacao(nome): # ✅ print(nome)
def calcular(): resultado = 42 # existe SÓ dentro daqui calcular() print(resultado) # ❌ NameError: name 'resultado' is not defined
return! A função devolve o valor
e você guarda numa variável fora:
resultado = calcular(). Sem mistério.
Hora de juntar tudo: função, lista, loop e duas novas armas —
zip() e sorted().
Imagina que você tem uma lista de nomes e uma lista de notas, e quer mostrar do maior pro menor. A gente vai usar duas ferramentinhas novas (entry-level, juro):
zip(["Ana","João"], [9, 6]) → [("Ana",9), ("João",6)].
É tipo um zíper de calça: pega o primeiro de cada lado e une.
sorted([3, 1, 2]) → [1, 2, 3].
Pra ordenar do maior pro menor, passa reverse=True.
E pra ordenar pares pela segunda posição (a nota), a gente usa
key=lambda x: x[1]. Não precisa entender a fundo agora —
é só uma "fórmula pronta" pra essa situação.
Crie ranking_alunos.py. Faça assim:
1) Crie duas listas: alunos = ["Ana","João","Davi","Lia"]
e notas = [9, 6, 7.5, 8].
2) Defina uma função ranking(alunos, notas) que:
junta com zip(), ordena com sorted(..., key=lambda x: x[1], reverse=True),
e return a lista ordenada.
3) Fora da função, chame ela e use um for pra imprimir
cada aluno + nota com a posição (1º, 2º, 3º…).
Lembra do for com enumerate? Não precisa —
dá pra fazer com um contador simples também. Ou usa enumerate
pra ficar bonito 😉.
def ranking(alunos, notas): # 1) une os pares: [("Ana",9),("João",6),...] pares = list(zip(alunos, notas)) # 2) ordena pelo segundo item (a nota), do maior pro menor ordenado = sorted(pares, key=lambda x: x[1], reverse=True) return ordenado alunos = ["Ana", "João", "Davi", "Lia"] notas = [9, 6, 7.5, 8] classificacao = ranking(alunos, notas) print("🏆 RANKING DE ALUNOS") for posicao, (nome, nota) in enumerate(classificacao, start=1): print(f"{posicao}º — {nome}: {nota}")
zip, sorted — tudo junto.
Dá um zoom mental nesse código. Você criou ele!
def nome():
reverse=True!)
Esse é o jeito de programador profissional pensar 🚀
Capítulo 06 — Desafios Integradores. Cinco mini-sistemas pra você consolidar TUDO: variáveis, condicionais, loops, listas e funções. Já tá pronto pra encarar?
🏆 Ir para Capítulo 06 →