P
prepair.app
Começar entrevista →
EnglishУкраїнськаРусскийDeutsch
🐍

Perguntas de entrevista Python backend

Entrevistas de Python backend cobrem detalhes internos da linguagem, programação assíncrona, Django ou FastAPI, e padrões de acesso a banco de dados. Abaixo estão as perguntas mais comuns com respostas modelo.

Junior · sem experiência / menos de 1 anoMiddle · 2–4 anos de experiênciaSenior · 5+ anos de experiência

O que perguntam

Tipos e estruturas de dados
Decorators e generators
GIL e concorrência
asyncio e async/await
Django / FastAPI
ORM e otimização de SQL

12 perguntas reais com respostas

Cada pergunta vem com uma resposta modelo para você comparar com a sua.

1

O que é o GIL e como ele afeta o multithreading?

Resposta

O Global Interpreter Lock permite que apenas uma thread execute bytecode Python por vez no CPython, então as threads nunca rodam código Python em paralelo entre núcleos. Ainda assim, threads ajudam em trabalho limitado por I/O porque o GIL é liberado durante chamadas bloqueantes. Para trabalho limitado por CPU você precisa de multiprocessing, uma extensão em C que libere o GIL, ou um runtime diferente.

2

Qual é a diferença entre uma lista e uma tupla? Quando usar cada uma?

Resposta

Listas são mutáveis e tuplas imutáveis, o que torna as tuplas hasheáveis e utilizáveis como chave de dicionário. Tuplas são um pouco mais rápidas e sinalizam ao leitor que a coleção é um registro fixo, não uma sequência que cresce. Use uma lista quando o conteúdo muda e uma tupla para dados heterogêneos fixos, como coordenadas ou um par retornado.

3

O que é um decorator? Escreva um que meça o tempo de execução.

Resposta

Um decorator é um callable que recebe uma função e retorna um substituto, usado para adicionar comportamento sem mexer no corpo original. Um decorator de timing envolve a chamada: registra o perf_counter antes, invoca a função, registra depois, loga a diferença e retorna o resultado. Sempre aplique functools.wraps na função interna para que o nome original, a docstring e a assinatura sobrevivam à introspecção.

4

Explique a diferença entre um generator e uma função normal. Por que precisamos do yield?

Resposta

Uma função normal calcula tudo e retorna uma vez; um generator se suspende em cada yield e retoma de onde parou, produzindo valores de forma preguiçosa. Isso significa memória constante não importa quantos itens sejam gerados, então você consegue iterar um arquivo de vários gigabytes ou uma sequência infinita. O yield é o que transforma a função numa máquina de estados que o interpretador consegue pausar e retomar.

5

O que são *args e **kwargs? Dê um exemplo de uso.

Resposta

*args coleta argumentos posicionais extras numa tupla e **kwargs coleta argumentos nomeados extras num dict. São usados quando uma função precisa aceitar uma assinatura arbitrária — mais comumente em decorators e wrappers que repassam tudo para o callable envolvido. O uso espelhado é o unpacking: chamar f(*items, **options) espalha uma sequência e um mapping em argumentos.

6

Qual é a diferença entre multiprocessing, threading e asyncio?

Resposta

Threading dá concorrência dentro de um processo e só ajuda com I/O por causa do GIL. Multiprocessing gera interpretadores separados com paralelismo real, ao custo da inicialização de processos e da comunicação entre eles — a escolha certa para trabalho limitado por CPU. asyncio é concorrência cooperativa numa única thread: as tasks cedem o controle nos pontos await, o que escala para dezenas de milhares de sockets, mas trava tudo se você chamar código síncrono dentro de uma coroutine.

7

O que é um context manager? Como você implementa um próprio?

Resposta

Um context manager garante setup e teardown ao redor de um bloco, que é o que os statements with usam para fechar arquivos ou liberar locks mesmo quando uma exceção é lançada. Você implementa um tanto como uma classe com __enter__ e __exit__, quanto como um generator decorado com @contextlib.contextmanager que faz yield uma vez entre o código de setup e o de limpeza. O método __exit__ recebe os detalhes da exceção e pode suprimi-la retornando True.

8

Explique MRO e herança múltipla.

Resposta

O Method Resolution Order define a sequência em que o Python busca um atributo entre as classes, calculada pelo algoritmo de linearização C3. Ele garante que uma classe sempre precede seus pais e que a ordem das classes base é respeitada, o que torna a herança em diamante previsível. O super() segue o MRO em vez de pular direto para o pai, por isso a herança múltipla cooperativa exige que cada classe na cadeia chame super().

9

O que é o problema N+1 no Django ORM? Como select_related e prefetch_related ajudam?

Resposta

O N+1 acontece quando um queryset retorna N objetos e cada acesso a um campo relacionado dispara sua própria consulta. select_related resolve isso para ForeignKey e OneToOne fazendo um JOIN SQL e preenchendo o objeto relacionado na mesma consulta. prefetch_related trata ManyToMany e relações reversas rodando uma segunda consulta e juntando os resultados em Python, por isso produz duas consultas em vez de uma.

10

Qual é a diferença entre uma cópia rasa e uma cópia profunda?

Resposta

Uma cópia rasa cria um novo container externo, mas mantém referências aos mesmos objetos aninhados, então mutar uma lista aninhada é visível através das duas cópias. Uma cópia profunda duplica tudo recursivamente, dando independência completa ao custo de tempo e memória. O bug que isso causa na prática é um argumento default mutável ou uma config aninhada compartilhada que um chamador altera para todo mundo.

11

Qual é a diferença entre __str__ e __repr__?

Resposta

__repr__ é voltado para desenvolvedores e idealmente deveria ser inequívoco — geralmente algo parecido com a expressão necessária para recriar o objeto; é o que o REPL e os debuggers mostram. __str__ é voltado para usuários finais e é o que print() e str() chamam, caindo de volta em __repr__ quando não está definido. Implementar __repr__ é o hábito de maior valor porque torna logs e tracebacks legíveis.

12

Como o Python gerencia memória e o que é reference counting?

Resposta

O CPython libera um objeto assim que sua contagem de referências chega a zero, o que torna a desalocação imediata e previsível. Como a contagem de referências sozinha não consegue liberar ciclos de referência, um garbage collector cíclico geracional roda periodicamente para detectá-los e coletá-los. Consequências práticas: fechar recursos explicitamente ainda é necessário, e manter uma referência num cache ou closure é a causa mais comum de vazamento de memória.

🦎

Só ler as respostas não basta

Numa entrevista de verdade você fala sob pressão. O Cam faz essas mesmas perguntas, avalia cada resposta e mostra exatamente o que melhorar.

Praticar entrevista de Python Backend →
Grátis · 3 entrevistas por mês

Vale a pena ler

Todos os artigos →

Outras especializações

🔍QA Manual🤖QA AutomationJava Backend🐘PHP Backend🦫Go Backend🟢Node.js Backend💎Ruby on Rails🔷C++🟨JavaScript⚛️React Frontend💚Vue Frontend🅰️Angular FrontendNext.js🍏iOS (Swift)🟩Android (Kotlin)⚙️DevOps / SRE🗄️Data Engineer📈Business Analyst🎯Product Manager📋Project Manager🎨UI/UX Designer📣Marketing