🌐 Detecting your location…
📢 Advertisement — Configure AdSense in Appearance → Customize → AdSense Settings

Perguntas da entrevista sobre Python 2026: 30 principais perguntas com respostas

⏱️5 min read  ·  888 words

As perguntas da entrevista sobre Python em 2026 cobrem tudo, desde sintaxe básica até padrões assíncronos avançados, estruturas de dados e design OOP. Esteja você se preparando para uma função de desenvolvedor júnior ou para uma posição sênior em uma empresa FAANG, este guia cobre as perguntas mais comuns das entrevistas sobre Python com respostas claras e concisas.

Perguntas básicas sobre Python

1. Qual é a diferença entre uma lista e uma tupla?

Listassão mutáveis ​​– os elementos podem ser adicionados, removidos ou alterados.Tuplassão imutáveis ​​– uma vez criados, eles não podem ser modificados.

# List — mutable
my_list = [1, 2, 3]
my_list.append(4)   # OK
my_list[0] = 10     # OK

# Tuple — immutable
my_tuple = (1, 2, 3)
# my_tuple[0] = 10  # TypeError!

# Tuples are faster and use less memory
# Use tuples for heterogeneous data (coordinates, RGB)
# Use lists for homogeneous, modifiable sequences

# Named tuples — readable tuples
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(3, 4)
print(p.x, p.y)  # 3 4

2. Explique o GIL (Global Interpreter Lock) do Python

O GIL é um mutex que permite que apenas um thread execute bytecode Python por vez, mesmo em sistemas multi-core. Isso significa que os threads Python não podem alcançar o verdadeiro paralelismo de CPU para o código Python.

  • Threads liberam GIL durante operações de E/S (rede, disco) — portanto, threading funciona para tarefas vinculadas a E/S
  • Para paralelismo vinculado à CPU, usemultiprocessing(cada processo tem seu próprio GIL)
  • Python 3.13+ possui modo experimental de thread livre (GIL pode ser desativado)

3. O que são decoradores? Dê um exemplo.

import functools, time

def timer(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        result = func(*args, **kwargs)
        elapsed = time.perf_counter() - start
        print(f"{func.__name__}: {elapsed*1000:.2f}ms")
        return result
    return wrapper

@timer
def slow_function():
    time.sleep(0.1)
    return 42

slow_function()  # "slow_function: 100.12ms" 

4. Qual é a diferença entre *args e **kwargs?

def func(*args, **kwargs):
    print(args)   # tuple of positional arguments
    print(kwargs) # dict of keyword arguments

func(1, 2, 3, name="Alice", age=30)
# (1, 2, 3)
# {'name': 'Alice', 'age': 30}

# Unpacking
def add(a, b, c): return a + b + c
numbers = [1, 2, 3]
print(add(*numbers))  # 6

settings = {"a": 1, "b": 2, "c": 3}
print(add(**settings))  # 6

5. O que é um gerador e quando você o usaria?

# Generator — lazy evaluation, memory efficient
def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

# vs list — loads everything into memory
fib = fibonacci()
print([next(fib) for _ in range(10)])

# Use generators when:
# 1. Processing large datasets (files, DB rows)
# 2. Infinite sequences
# 3. Building pipelines

Perguntas OOP

6. Qual é a diferença entre @classmethod e @staticmethod?

class Circle:
    pi = 3.14159

    def __init__(self, radius):
        self.radius = radius

    # Regular method — receives instance (self)
    def area(self):
        return self.pi * self.radius ** 2

    # classmethod — receives class (cls), can access class variables
    @classmethod
    def from_diameter(cls, diameter):
        return cls(diameter / 2)  # factory method

    # staticmethod — receives nothing, utility function
    @staticmethod
    def is_valid_radius(radius):
        return radius > 0

c1 = Circle(5)
c2 = Circle.from_diameter(10)
print(Circle.is_valid_radius(-1))  # False

7. Explique MRO (Ordem de Resolução de Método)

class A:
    def method(self): return "A"

class B(A):
    def method(self): return "B"

class C(A):
    def method(self): return "C"

class D(B, C):  # Multiple inheritance
    pass

d = D()
print(d.method())   # "B" — follows MRO
print(D.__mro__)    # (D, B, C, A, object)
# Python uses C3 linearization for MRO

Perguntas avançadas

8. Como funciona o gerenciamento de memória do Python?

  • Contagem de referência— cada objeto rastreia quantas referências apontam para ele
  • Quando a contagem chega a 0, o objeto é imediatamente liberado
  • Coletor de lixo— lida com referências circulares (a contagem de referências não pode)
  • gc.collect()– acionar manualmente a coleta de lixo
  • Estagiário— inteiros pequenos (-5 a 256) e strings curtas são armazenados em cache

9. Qual é a diferença entre cópia superficial e cópia profunda?

import copy

original = [[1, 2, 3], [4, 5, 6]]

# Shallow copy — new list, but nested objects are shared
shallow = copy.copy(original)  # or list(original) or original[:]
shallow[0].append(99)
print(original[0])  # [1, 2, 3, 99] — MODIFIED! (shared reference)

# Deep copy — completely independent copy
deep = copy.deepcopy(original)
deep[0].append(88)
print(original[0])  # [1, 2, 3] — unchanged

10. Quais são as estruturas de dados integradas do Python e suas complexidades de tempo?

Operação lista ditar set deque
Acesso O(1) O(1) média N/A Sobre)
Procurar Sobre) O(1) média O(1) média Sobre)
Inserir (final) O(1) amortização O(1) média O(1) média O(1)
Inserir (iniciar) Sobre) N/A N/A O(1)
Excluir Sobre) O(1) média O(1) média O(1)

Perguntas assíncronas

11. Qual é a diferença entre asyncio.gather() e asyncio.TaskGroup?

import asyncio

# asyncio.gather — partial failures possible
async def example_gather():
    results = await asyncio.gather(
        task1(),
        task2(),
        return_exceptions=True  # don't cancel others on failure
    )
    # Results include exceptions if return_exceptions=True

# asyncio.TaskGroup (Python 3.11+) — all-or-nothing
async def example_task_group():
    async with asyncio.TaskGroup() as tg:
        t1 = tg.create_task(task1())
        t2 = tg.create_task(task2())
    # If any task raises, all are cancelled — structured concurrency

asyncio.run(example_task_group())

O sucesso da entrevista Python vem do entendimento profundo da linguagem, não apenas da memorização das respostas. Concentre-se no “porquê” de cada conceito – por que o GIL existe, por que os geradores são eficientes em termos de memória, por que a cópia profunda é importante. Explique as compensações e mostre a aplicação de cada conceito no mundo real.

✍️ Leave a Comment

Your email address will not be published. Required fields are marked *

🌐 Read in:🇬🇧 English🇩🇪 Deutsch🇧🇷 Português🇸🇦 العربية🇮🇳 हिन्दी🇧🇩 বাংলা