Como o quiz funciona
São 10 perguntas de múltipla escolha cobrindo diferentes áreas de Python. A cada resposta você recebe um feedback imediato com a explicação — mesmo quando erra, você já aprende algo novo.
No final, calculamos seu nível (iniciante, intermediário ou avançado) com base no percentual de acertos e identificamos as categorias onde você mais errou. Esse diagnóstico vira um prompt pronto para gerar um curso sob medida para preencher justamente essas lacunas.
Por que vale a pena
Estudar sem saber por onde começar é o principal motivo que faz gente desistir. Em vez de seguir uma trilha genérica, você descobre exatamente o que já sabe e onde estão seus gaps — e monta um curso focado no que falta.
O quiz é gratuito, anônimo e funciona sem login. Seus últimos 5 resultados ficam salvos no seu navegador para você acompanhar a evolução ao longo do tempo.
Como interpretamos os níveis
- Iniciante — menos de 40% de acertos. Você está começando em Python ou precisa revisar os fundamentos. Nada de vergonha: a melhor hora para começar bem é agora.
- Intermediário — entre 40% e 70%. Você já tem uma base sólida, mas existem conceitos-chave que ainda precisam ser consolidados na prática.
- Avançado — acima de 70%. Você domina o essencial. Vale aprofundar em tópicos mais complexos ou em aplicações específicas de Python.
Perguntas do quiz (com gabarito e explicação)
Prefere só ler as perguntas e respostas? Abaixo estão as 10 questões do quiz com a alternativa correta e a explicação de cada uma. Se quiser testar seu conhecimento sem olhar antes, volte para o quiz no topo da página.
-
1. Fundamentos iniciante
Qual é o tipo do valor retornado por `type("Olá")`?
- A. str ✓ correta
- B. string
- C. char
- D. text
Por quê: Em Python, sequências de caracteres são do tipo `str`. Ao contrário de outras linguagens, não existe o tipo `char` — um único caractere também é uma `str` de tamanho 1.
-
2. Fundamentos iniciante
Qual das opções abaixo retorna diretamente a parte inteira da divisão em Python?
- A. /
- B. // ✓ correta
- C. %
- D. int()
Por quê: O operador `//` faz divisão inteira (floor division) em um passo só — `7 // 2` retorna `3`. `int(7 / 2)` até chega no mesmo valor para positivos, mas trunca em vez de arredondar pra baixo (difere com negativos). `/` sempre retorna float e `%` retorna o resto da divisão.
-
3. Fluxo de Controle iniciante
Quantas vezes o corpo do loop executa em `for i in range(5):`?
- A. 4 vezes
- B. 5 vezes ✓ correta
- C. 6 vezes
- D. Depende do valor inicial
Por quê: `range(5)` gera a sequência 0, 1, 2, 3, 4 — cinco valores. O parâmetro é o limite superior exclusivo, por isso o último valor é sempre `n - 1`.
-
4. Fluxo de Controle intermediario
Quando o bloco `else` de um loop `for` é executado?
- A. Sempre que o loop termina
- B. Apenas quando o loop não executa nenhuma iteração
- C. Apenas quando o loop termina sem usar `break` ✓ correta
- D. Nunca — `for` não aceita `else`
Por quê: O `else` em loops Python executa quando a iteração termina naturalmente, sem um `break`. É útil para buscas: se saiu pelo `break`, achou; se entrou no `else`, não achou.
-
5. Estruturas de Dados intermediario
Qual expressão cria a lista `[0, 1, 4, 9, 16]`?
- A. [i * i for i in range(5)] ✓ correta
- B. [i ** i for i in range(5)]
- C. [i * 2 for i in range(5)]
- D. (i * i for i in range(5))
Por quê: A primeira é uma list comprehension que eleva cada número ao quadrado (`i * i`). `i ** i` é potenciação com o próprio índice e gera `[1, 1, 4, 27, 256]`. A última, com parênteses, cria um generator (preguiçoso), não uma lista.
-
6. Estruturas de Dados iniciante
Qual destas estruturas é imutável em Python?
- A. list
- B. dict
- C. tuple ✓ correta
- D. set
Por quê: Tuplas são imutáveis — não dá para adicionar, remover ou alterar elementos depois de criadas. Listas, dicts e sets são mutáveis. Essa diferença importa em performance e em uso como chave de dicionário.
-
7. Funções avancado
Qual o problema com `def f(x, items=[]): items.append(x); return items`?
- A. Não é válido em Python
- B. A lista padrão é compartilhada entre todas as chamadas ✓ correta
- C. Python lança erro na segunda chamada
- D. Nenhum — é um padrão recomendado
Por quê: Argumentos padrão mutáveis são avaliados uma única vez, na definição. A mesma lista é reutilizada entre chamadas, acumulando valores. O padrão correto é usar `items=None` e criar a lista dentro da função.
-
8. Funções intermediario
Como ordenar uma lista de tuplas pelo segundo elemento?
- A. sorted(lista, key=lambda t: t[1]) ✓ correta
- B. sorted(lista, 1)
- C. sorted(lista, second=True)
- D. lista.sort(index=1)
Por quê: A forma idiomática é passar uma função `key` que extrai o critério de ordenação. Lambdas são perfeitas para isso. Também funciona `operator.itemgetter(1)`, que costuma ser ligeiramente mais rápido.
-
9. OOP iniciante
O que representa o parâmetro `self` em um método de classe?
- A. Uma palavra reservada da linguagem
- B. A instância da classe que chamou o método ✓ correta
- C. A classe em si, equivalente a `cls`
- D. Um placeholder obrigatório sem função real
Por quê: `self` é apenas um nome convencional para o primeiro parâmetro de métodos de instância — ele recebe a instância que invocou o método. Não é palavra reservada; você pode usar outro nome, mas ninguém faz isso.
-
10. OOP intermediario
O que faz o decorator `@staticmethod`?
- A. Impede que o método seja sobrescrito em subclasses
- B. Marca um método que não recebe `self` nem `cls` ✓ correta
- C. Torna o método acessível sem instanciar a classe, passando `cls`
- D. Cacheia o retorno do método
Por quê: `@staticmethod` define um método que não recebe nem a instância (`self`) nem a classe (`cls`). É útil para agrupar funções auxiliares relacionadas à classe, mas que não dependem do estado dela. Quem recebe `cls` é o `@classmethod`.