Módulo 1 - Boas-vindas ao Python Avançado

Revisão relâmpago do intermediário

10 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026

O que você vai aprender

  • Conferir o domínio de classes, __init__, self, herança e super.
  • Relembrar decoradores, geradores com yield e exceções próprias.
  • Revisar a diferença entre organizar e projetar.
  • Identificar pontos fracos para revisar antes de avançar.

O que você precisa ter na ponta da língua

Esta aula não ensina nada novo de propósito. Ela é uma checagem rápida do terreno. Leia os exemplos abaixo e pergunte-se, honestamente, se você entende cada linha sem travar. Se sim, você está pronto para o avançado. Se algum ponto parecer novo, vale voltar ao módulo correspondente do Curso de Python Intermediário antes de seguir, porque tudo daqui em diante se apoia nesta base.

class Conta:
    def __init__(self, dono, saldo=0):
        self.dono = dono
        self.saldo = saldo

    def depositar(self, valor):
        self.saldo += valor

    def __str__(self):
        return f"Conta de {self.dono}: R$ {self.saldo}"

c = Conta("Ana", 100)
c.depositar(50)
print(c)  # Conta de Ana: R$ 150

Classe com __init__, self, método e __str__. Tudo do Intermediário.

Decoradores e geradores, o feijão com arroz avançado

Dois recursos do Intermediário precisam estar automáticos, porque o avançado os aprofunda muito. O decorador envolve uma função para acrescentar comportamento sem mudar o corpo dela. O gerador produz valores sob demanda com yield, poupando memória. Boa parte deste curso, de decoradores com argumentos a async, é uma extensão direta desses dois conceitos. Se eles ainda confundem, este é o momento de revisar.

def registrar(funcao):
    def wrapper(*args, **kwargs):
        print(f"chamando {funcao.__name__}")
        return funcao(*args, **kwargs)
    return wrapper

@registrar
def somar(a, b):
    return a + b

print(somar(2, 3))  # chamando somar / 5

def contar_ate(n):
    for i in range(1, n + 1):
        yield i

print(list(contar_ate(3)))  # [1, 2, 3]

Um decorador simples e um gerador com yield: a base dos temas avançados.

De organizar para projetar

O último ponto a revisar não é sintaxe, é postura. No Intermediário, tratar um erro com try e except já era um avanço. No avançado, você desenha a hierarquia de exceções do seu programa antes de precisar dela, para que cada falha tenha um tipo próprio e uma mensagem útil. O mesmo vale para estruturas: em vez de sempre usar uma lista, você escolhe a estrutura certa para o problema. Guarde esse exemplo de exceção própria; ele volta, muito mais elaborado, no módulo 12.

class SaldoInsuficienteError(Exception):
    pass

def sacar(saldo, valor):
    if valor > saldo:
        raise SaldoInsuficienteError(f"Faltam R$ {valor - saldo}")
    return saldo - valor

try:
    sacar(100, 150)
except SaldoInsuficienteError as e:
    print("Erro:", e)  # Erro: Faltam R$ 50

Exceção própria com class e raise, capturada com except. A base do módulo 12.

Teste rápido

No exemplo, por que criar uma classe SaldoInsuficienteError em vez de usar um print de erro?

Perguntas frequentes

E se eu travar em algum exemplo desta revisão?
É o sinal de que vale revisar aquele tema no Curso de Python Intermediário antes de seguir. O avançado se apoia em orientação a objetos, decoradores e geradores o tempo todo, então poucos minutos de revisão agora economizam horas de confusão depois.
Preciso decorar a sintaxe de metaclasses e async já?
Não. Esses são temas que o próprio curso ensina do zero, nos módulos 9 e 11. O que precisa estar firme é a base do Intermediário: classes, herança, decoradores, geradores e exceções. É sobre isso que os temas novos se apoiam.
O que é wrapper, que aparece no exemplo do decorador?
É a função interna que o decorador cria para envolver a função original, acrescentando comportamento antes ou depois de chamá-la. O nome wrapper é uma convenção; no módulo 5 você aprende a preservar o nome e a documentação da função original com functools.wraps.
Qual a diferença entre um gerador e uma lista mesmo?
A lista guarda todos os valores na memória de uma vez; o gerador produz um valor por vez, sob demanda, com yield. Para sequências grandes ou infinitas, o gerador economiza memória. Esse conceito é a ponte para os geradores avançados e para async.
Preciso dominar testes automatizados antes de começar?
Uma noção básica de assert e de por que testar já ajuda, e você viu no Intermediário. O módulo 13 deste curso retoma o assunto do começo, agora com o pytest, fixtures e mocks, então testes não são um pré-requisito rígido.
Posso pular esta revisão se já me sinto seguro?
Pode, mas vale ao menos rodar os exemplos no Playground. Leva poucos minutos e confirma que a base está firme. Se tudo rodar e fizer sentido, avance tranquilo para o módulo 2, sobre tipagem estática.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.