linguagem
Python
Entrevista de Python gosta de testar entendimento de modelo de execução: o que o GIL impede (e o que não impede), diferença entre lista e generator em memória, o clássico argumento default mutável, e quando list comprehension ajuda ou atrapalha a legibilidade.
Simulador de Python
Tópicos por senioridade
Desafios práticos
Cenários reais pra resolver em voz alta, como numa entrevista de verdade — não é múltipla escolha.
- Cenário: argumento default mutável
Por que `def add(item, lista=[]): lista.append(item); return lista` se comporta de forma inesperada quando chamada várias vezes sem passar `lista`?
Perguntas mais cobradas
ver todas →- Médio
O GIL do Python: o que ele impede e o que não impede
Uma thread executa bytecode Python por vez. Threads não paralelizam CPU-bound, mas ajudam I/O-bound (o GIL é solto no I/O). CPU real → multiprocessing.
- Fácil
Lista x generator: memória e avaliação
Lista materializa tudo na memória; generator produz sob demanda (memória ~constante, lazy, iterável uma vez).
- Médio
Cenário: argumento default mutável
O default é criado uma vez na definição da função e reutilizado — a lista acumula entre chamadas. Use `=None` e crie dentro.
- Fácil
`is` x `==` e o cache de inteiros pequenos
`==` compara valor; `is` compara identidade (mesmo objeto). CPython cacheia ints -5..256, então `100 is 100` é True e `1000 is 1000` é False. Use `is` só pra None/singleton; nunca dependa do cache.
- Médio
Decorators: o que são e uma pegadinha comum
Função que recebe e devolve uma função (`@d` = `f = d(f)`), pra logging/cache/retry/etc. Sem `functools.wraps` no wrapper, a função decorada perde nome, docstring e assinatura.
- Difícil
`asyncio`: quando ajuda e quando não
Event loop single-thread; `await` no I/O cede pra outra corrotina. Ótimo pra I/O-bound concorrente, inútil pra CPU-bound (bloqueia o loop). Chamada síncrona bloqueante dentro de corrotina trava tudo — precisa ser async de ponta a ponta.
- Médio
Context managers e o `with`
`with` garante setup/teardown ao redor de um bloco mesmo com exceção. Implemente `__enter__`/`__exit__`, ou use `@contextlib.contextmanager` sobre um gerador (antes do yield = enter, depois = exit).