42 Perguntas e Respostas de Entrevista em Python: Prepare-se Já!

últimas postagens

Está a preparar-se para entrevistas em Python? Ou simplesmente curioso sobre o seu nível de conhecimento em Python? Não se preocupe! Abordaremos as suas dúvidas com perguntas e respostas detalhadas.

Este artigo tem como objetivo prepará-lo para o tipo de perguntas que poderá encontrar em entrevistas, ou ajudá-lo a avaliar as suas competências em Python. É importante que responda às perguntas antes de ver as soluções, para que a sua autoavaliação seja o mais precisa possível. Sem mais demoras, vamos às perguntas!

As perguntas estão organizadas em diferentes secções, com base nos temas abordados. Cada secção apresenta perguntas juntamente com respostas cuidadosamente selecionadas. Pode adaptar as respostas com as suas próprias palavras, mantendo o significado original. Desta forma, o entrevistador não terá a sensação de que está a ler algo decorado.

Linguagem Python

#1. O que é Python?

Python é uma linguagem de programação interpretada, de alto nível e de uso geral. Com o auxílio de bibliotecas e frameworks de terceiros, é possível construir praticamente qualquer tipo de aplicação usando Python. É uma das linguagens de programação mais populares em tecnologias avançadas, como IA e Ciência de Dados.

#2. Qual a principal diferença entre um interpretador e um compilador?

Um interpretador traduz o código linha a linha para linguagem de máquina, enquanto um compilador traduz todo o código para linguagem de máquina numa única etapa.

#3. Python é uma linguagem de tipagem estática ou dinâmica?

Python é uma linguagem de tipagem dinâmica.

#4. O que significa uma linguagem de tipagem dinâmica?

Linguagens de tipagem dinâmica realizam a verificação do tipo de variável durante a execução do programa. Exemplos de linguagens de tipagem dinâmica incluem Python, JavaScript e Ruby.

Informação extra: Linguagens de tipagem estática verificam o tipo de variável durante a fase de compilação, como C++, C e Java.

#5. Dê alguns exemplos de aplicações em Python.

Python distingue-se por ter uma sintaxe simples e ser fácil de aprender, assemelhando-se à linguagem inglesa. Possui uma grande comunidade de desenvolvedores e uma vasta gama de pacotes de terceiros, que facilitam a criação de diversos tipos de aplicações, como aplicações web, aplicações GUI e aplicações CLI.

Uma das aplicações mais populares do Python é a automação, sendo muito utilizado para criar scripts que automatizam tarefas como limpeza de disco, envio de emails e obtenção de dados sobre preços de produtos.

Python é também uma das linguagens mais utilizadas na área da Ciência de Dados.

#6. Que aplicações construiu usando Python?

Criei vários scripts para automatizar tarefas repetitivas e para recolher informações como preços e disponibilidade de produtos.

Além disso, tenho trabalhado com frameworks como Django e Flask para criar aplicações web.

Nota: A resposta acima é um exemplo. A sua resposta pode ser completamente diferente. Tente explicar as diferentes áreas em que já trabalhou com Python. Se possível, apresente exemplos das aplicações que desenvolveu.

Tipos de Dados

#7. Quais são os tipos de dados nativos em Python?

Existem vários tipos de dados nativos em Python, incluindo: int, float, complex, bool, list, tuple, set, dict e str.

Nota: Não precisa de mencionar todos os tipos de dados existentes em Python. Mencione aqueles que utiliza com maior frequência. O entrevistador poderá colocar questões adicionais com base nas suas respostas.

#8. Qual a diferença entre uma lista e uma tupla?

Tanto listas como tuplas são usadas para guardar coleções de objetos. A principal diferença é que a lista é um objeto mutável, enquanto a tupla é um objeto imutável.

#9. O que são tipos de dados mutáveis e imutáveis?

Tipos de dados mutáveis podem ser alterados após a sua criação. Exemplos de objetos mutáveis em Python incluem listas, conjuntos e dicionários.

Tipos de dados imutáveis não podem ser modificados após a sua criação. Exemplos de objetos imutáveis em Python incluem strings e tuplas.

#10. Explique alguns métodos de lista.

1. append – Este método adiciona um elemento ao final da lista.

    >>> a = [1, 2]
    >>> a.append(3)
    >>> a
    [1, 2, 3]
  

2. pop – Este método remove um elemento da lista. Se não for fornecido nenhum índice, remove o último elemento. Se um índice for fornecido, remove o elemento nessa posição.

    >>> a = [1, 2, 3, 4, 5]
    >>> a.pop()
    5
    >>> a
    [1, 2, 3, 4]
    >>> a.pop(1)
    2
    >>> a
    [1, 3, 4]
  

3. remove – Este método remove a primeira ocorrência de um elemento específico da lista, dado como argumento.

    >>> a = [1, 2, 2, 3, 4]
    >>> a.remove(1)
    >>> a
    [2, 2, 3, 4]
    >>> a.remove(2)
    >>> a
    [2, 3, 4]
  

4. sort – Este método ordena a lista por ordem crescente ou decrescente.

    >>> a = [3, 2, 4, 1]
    >>> a.sort()
    >>> a
    [1, 2, 3, 4]
    >>> a.sort(reverse=True)
    >>> a
    [4, 3, 2, 1]
  

5. reverse – Este método inverte a ordem dos elementos na lista.

    >>> a = [3, 2, 4, 1]
    >>> a.reverse()
    >>> a
    [1, 4, 2, 3]
  

Nota: Existem outros métodos como clear, insert, count, etc. Não é necessário explicar todos os métodos de lista ao entrevistador. Explique apenas dois ou três métodos que utilize com mais frequência.

#11. Explique alguns métodos de string.

1. split – Este método divide a string nos pontos desejados e retorna uma lista como resultado. Por padrão, divide a string em espaços. Um delimitador pode ser especificado como argumento.

    >>> a = "Isto é um exemplo de texto."
    >>> a.split()
    ['Isto', 'é', 'um', 'exemplo', 'de', 'texto.']
    >>> a = "1, 2, 3, 4, 5, 6"
    >>> a.split(", ")
    ['1', '2', '3', '4', '5', '6']
  

2. join – Este método combina uma lista de strings. A combinação é feita com o delimitador que fornecemos.

    >>> a = ['Isto', 'é', 'um', 'exemplo', 'de', 'texto.']
    >>> ' '.join(a)
    'Isto é um exemplo de texto.'
    >>> ', '.join(a)
    'Isto, é, um, exemplo, de, texto.'
  

Nota: Alguns outros métodos de string incluem: capitalize, isalnum, isalpha, isdigit, lower, upper, center, etc.

#12. O que é a indexação negativa em listas?

A indexação é utilizada para aceder aos elementos de listas. A indexação normal começa em 0.

A indexação negativa permite aceder aos elementos da lista a partir do final. A indexação negativa começa em -1 e continua -2, -3, -4, etc., até ao início da lista.

    >>> a = [1, 2, 3, 4, 5]
    >>> a[-1]
    5
    >>> a[-3]
    3
    >>> a[-5]
    1
  

#13. Explique alguns métodos de dicionário.

1. items – Este método retorna os pares chave:valor de um dicionário como uma lista de tuplas.

    >>> a = {1: 'valor1', 2: 'valor2', 3: 'valor3'}
    >>> a.items()
    dict_items([(1, 'valor1'), (2, 'valor2'), (3, 'valor3')])
  

2. pop – Este método remove o par chave:valor do dicionário. Aceita a chave como argumento e remove-a do dicionário.

    >>> a = {1: 2, 2: 3}
    >>> a.pop(2)
    3
    >>> a
    {1: 2}
  

Nota: Alguns outros métodos de dicionário são: get, keys, values, clear, etc.

#14. O que é slicing (fatiamento) em Python?

O fatiamento é usado para aceder a uma sublista (subarray) de um tipo de dados de sequência. Retorna os dados com base nos argumentos fornecidos, mantendo o mesmo tipo de dados da origem.

O fatiamento aceita três argumentos: o índice inicial, o índice final e o passo de incremento. A sintaxe de fatiamento é variavel[inicio:fim:passo]. Os argumentos são opcionais. Dois pontos vazios (:) retornam todos os dados.

    >>> a = [1, 2, 3, 4, 5]
    >>> a[:]
    [1, 2, 3, 4, 5]
    >>> a[:3]
    [1, 2, 3]
    >>> a[3:]
    [4, 5]
    >>> a[0:5:2]
    [1, 3, 5]
  

#15. Quais tipos de dados permitem fatiamento?

O fatiamento pode ser usado com listas, tuplas e strings.

#16. O que são operadores de desempacotamento em Python? Como usá-los?

Os operadores * e ** são operadores de desempacotamento em Python.

O operador * é usado para atribuir múltiplos valores a diferentes variáveis simultaneamente, a partir de tipos de dados de sequência.

    >>> items = [1, 2, 3]
    >>> a, b, c = items
    >>> a
    1
    >>> b
    2
    >>> c
    3
    >>> a, *b = items
    >>> a
    1
    >>> b
    [2, 3]
  

O operador ** é usado com dicionários. O desempacotamento em dicionários funciona de maneira diferente do desempacotamento com tipos de dados de sequência.

O desempacotamento em dicionários é usado principalmente para copiar pares chave:valor de um dicionário para outro.

    >>> a = {1:2, 3:4}
    >>> b = {**a}
    >>> b
    {1: 2, 3: 4}
    >>> c = {3:5, 5:6}
    >>> b = {**a, **c}
    >>> b
    {1: 2, 3: 5, 5: 6}
  

Nota: Consulte outros artigos para mais informações sobre estes operadores.

Condições e Loops

#17. Python tem instruções switch?

Não, Python não tem a instrução switch.

#18. Como implementar a funcionalidade da instrução switch em Python?

A funcionalidade da instrução switch pode ser implementada utilizando as instruções if e elif.

    >>> if a == 1:
    ...     print(...)
    ... elif a == 2:
    ...     print(....)
  

#19. O que são as instruções break e continue?

break – A instrução break é usada para terminar a execução de um loop. O código continua a sua execução fora do loop.

    >>> for i in range(5):
    ...     if i == 3:
    ...             break
    ...     print(i)
    ...
    0
    1
    2
  

continue – A instrução continue é usada para saltar a execução do código restante no ciclo atual, passando para a próxima iteração.

    >>> for i in range(5):
    ...     if i == 3:
    ...             continue
    ...     print(i)
    ...
    0
    1
    2
    4
  

#20. Quando é que o código dentro do bloco else é executado com loops while e for?

O código dentro do bloco else com loops while e for é executado depois de todas as iterações terem sido completadas. O código dentro do bloco else não é executado quando o loop é interrompido por uma instrução break.

#21. O que são list comprehensions e dictionary comprehensions?

As list e dictionary comprehensions são uma forma concisa de construir listas e dicionários, usando uma sintaxe mais simplificada do que os loops for.

    >>> a = [i for i in range(10)]
    >>> a
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> a = {i: i + 1 for i in range(10)}
    >>> a
    {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}
    >>>
  

#22. Como funciona a função range?

A função range retorna uma sequência de números dentro de um intervalo específico, com um determinado incremento. A sintaxe da função range é range(start, stop[, step]).

O argumento stop é obrigatório. Os argumentos start e step são opcionais, com os valores padrão de 0 e 1, respetivamente.

    >>> list(range(10))
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(range(1, 10))
    [1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(range(1, 10, 2))
    [1, 3, 5, 7, 9]
    >>>
  

Funções

#23. O que são parâmetros e argumentos?

Os parâmetros são os nomes listados na definição de uma função.

Os argumentos são os valores que são passados para a função durante a sua chamada.

#24. Quais os diferentes tipos de argumentos em Python?

Existem quatro tipos principais de argumentos: argumentos posicionais, argumentos padrão, argumentos de palavra-chave e argumentos arbitrários.

Argumentos posicionais: São os argumentos que são definidos numa função e são obrigatórios quando a função é chamada, sendo que a sua ordem é importante.

    >>> def add(a, b):
    ...     return a + b
    ...
    >>> add(1, 2)
    3
    >>> add(1)
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: add() missing 1 required positional argument: 'b'
    >>>
  

Argumentos padrão: É possível fornecer um valor padrão para um argumento na definição da função. Se não for passado nenhum valor para esse argumento quando a função for chamada, será usado o valor padrão.

    >>> def add(a, b=3):
    ...     return a + b
    ...
    >>> add(1, 2)
    3
    >>> add(1)
    4
  

Argumentos de palavra-chave: É possível especificar o nome dos argumentos ao chamar a função, atribuindo valores a esses argumentos. Os argumentos de palavra-chave permitem evitar a ordem dos argumentos posicionais.

    >>> def add(a, b):
    ...     print("a ", a)
    ...     print("b ", b)
    ...     return a + b
    ...
    >>> add(b=4, a=2)
    a  2
    b  4
    6
  

Argumentos arbitrários: São usados para coletar um número indefinido de valores numa função. Os operadores * e ** são usados na definição da função para coletar argumentos arbitrários.

    >>> def add(*args):
    ...     return sum(args)
    ...
    >>> add(1, 2, 3, 4, 5)
    15
    >>> def dict_args(**kwargs):
    ...     print(kwargs)
    ...
    >>> dict_args(a="valor1", b='valor2', c="valor3")
    {'a': 'valor1', 'b': 'valor2', 'c': 'valor3'}
  

#25. O que é uma função lambda?

Funções lambda são pequenas funções anônimas em Python. Permitem uma única expressão e aceitam múltiplos argumentos.

    >>> add = lambda a, b: a + b
    >>> add(1, 3)
    4
  

#26. Qual a diferença entre uma função normal e uma função lambda?

A funcionalidade de ambas as funções normais e funções lambda é semelhante. No entanto, as funções normais exigem mais código do que uma função lambda para a mesma funcionalidade.

As funções lambda são úteis quando se tem apenas uma expressão.

#27. Para que serve a palavra-chave pass?

A palavra-chave pass é usada para indicar um bloco de código vazio. Python não permite blocos vazios. Assim, a instrução pass permite definir um bloco vazio (quando se decide adicionar o código mais tarde).

    >>> def add(*args):
    ...
    ...
    File "<stdin>", line 3
        ^
    IndentationError: expected an indented block
    >>> def add(*args):
    ...     pass
    ...
    >>>
  

#28. O que é uma função recursiva?

Uma função recursiva é aquela que se chama a si própria.

O que são operadores de empacotamento em Python? Como usá-los?

Os operadores de empacotamento são usados para coletar vários argumentos em funções. São conhecidos como argumentos arbitrários.

Nota: Consulte outros artigos para mais informações sobre operadores de empacotamento em Python.

OOPs em Python

#29. Qual palavra-chave é usada para criar classes em Python?

A palavra-chave class é usada para criar classes em Python. É uma prática padrão da indústria usar a convenção PascalCase para nomes de classes.

    >>> class Carro:
    ...     pass
    ...
  

#30. Como instanciar uma classe em Python?

Para criar uma instância de uma classe em Python, basta chamar a classe como se fosse uma função. É possível passar os atributos necessários para o objeto da mesma forma que se passa argumentos para uma função.

    >>> class Carro:
    ...     def __init__(self, cor):
    ...         self.cor = cor
    ...
    >>> carro_vermelho = Carro('vermelho')
    >>> carro_vermelho.cor
    'vermelho'
    >>> carro_verde = Carro('verde')
    >>> carro_verde.cor
    'verde'
    >>>
  

#31. O que é o self em Python?

self representa o objeto da classe. É usado para aceder aos atributos e métodos do objeto dentro da classe, para o objeto específico.

#32. O que é o método __init__?

__init__ é o método construtor, semelhante a construtores em outras linguagens OOP. Ele é executado imediatamente quando um objeto é criado para a classe, e é usado para inicializar os dados da instância.

#33. O que é docstring em Python?

Strings de documentação, ou docstrings, são usadas para documentar um bloco de código. São também usadas como comentários de várias linhas.

Essas docstrings são usadas nos métodos de uma classe para descrever a função de um determinado método. A docstring pode ser visualizada usando o método help.

    >>> class Carro:
    ...     def __init__(self, cor):
    ...         self.cor = cor
    ...
    ...     def mudar_cor(self, nova_cor):
    ...             """Este método muda a cor do carro"""
    ...             self.cor = nova_cor
    ...
    >>> carro = Carro('vermelho')
    >>> help(carro.mudar_cor)
    Help on method mudar_cor in module __main__:

    mudar_cor(nova_cor) method of __main__.Carro instance
        Este método muda a cor do carro

    >>>
  

#34. O que são métodos dunder ou mágicos?

Métodos com dois underscores como prefixo e sufixo são chamados de métodos dunder ou mágicos. São usados principalmente para substituir métodos. Alguns dos métodos que podem ser sobrescritos em classes são __str__, __len__, __setitem__, __getitem__, etc.

    >>> class Carro:
    ...     def __str__(self):
    ...         return "Isto é a classe Carro"
    ...
    >>> carro = Carro()
    >>> print(carro)
    Isto é a classe Carro
    >>>
  

Nota: Existem muitos outros métodos que podem ser sobrescritos. Eles são úteis quando é preciso personalizar profundamente o código. Consulte a documentação para mais informações.

#35. Como implementar herança em Python?

A herança é implementada passando a classe pai para a classe filha como argumento, podendo ser invocado o método __init__ da classe pai dentro da classe filha.

    >>> class Animal:
    ...     def __init__(self, nome):
    ...         self.nome = nome
    ...
    >>> class Animal:
    ...     def __init__(self, nome):
    ...             self.nome = nome
    ...
    ...     def display(self):
    ...             print(self.nome)
    >>> class Cachorro(Animal):
    ...     def __init__(self, nome):
    ...             super().__init__(nome)
    ...
    >>> cachorro = Cachorro('Tommy')
    >>> cachorro.display()
    Tommy
    >>>
  

#36. Como aceder à classe pai dentro da classe filha em Python?

A classe pai pode ser acedida dentro da classe filha usando a função super(), que permite aceder aos atributos e métodos da classe pai.

Diversos

#37. Como usar comentários de linha única e de várias linhas em Python?

Usamos o símbolo de hash (#) para comentários de linha única e aspas simples triplas (”’comentário”’) ou aspas duplas triplas (“””comentário”””) para comentários de várias linhas.

#38. O que é um objeto em Python?

Em Python, tudo é um objeto. Todos os tipos de dados, funções e classes são objetos.

#39. Qual a diferença entre is e ==?

O operador == é usado para verificar se dois objetos têm o mesmo valor. O operador is é usado para verificar se dois objetos estão a referir-se ao mesmo local na memória.

    >>> a = []
    >>> b = []
    >>> c = a
    >>> a == b
    True
    >>> a is b
    False
    >>> a is c
    True
    >>>
  

#40. O que são cópia rasa (shallow copy) e cópia profunda (deep copy)?

Cópia rasa: Cria uma cópia exata do original, sem alterar as referências aos objetos. Os objetos copiados e originais referem-se às mesmas referências de objeto, de forma que alterar um objeto irá afetar o outro.

O método copy do módulo copy é usado para realizar uma cópia rasa.

    >>> from copy import copy
    >>> a = [1, [2, 3]]
    >>> b = copy(a)
    >>> a[1].append(4)
    >>> a
    [1, [2, 3, 4]]
    >>> b
    [1, [2, 3, 4]]
  

Cópia profunda: Copia os valores do objeto original recursivamente para o novo objeto. Para realizar uma cópia profunda, pode usar-se a função de fatiamento (slicing) ou a função deepcopy do módulo copy.

    >>> from copy import deepcopy
    >>> a = [1, [2, 3]]
    >>> b = deepcopy(a)
    >>> a[1].append(4)
    >>> a
    [1, [2, 3, 4]]
    >>> b
    [1, [2, 3]]
    >>> b[1].append(5)
    >>> a
    [1, [2, 3, 4]]
    >>> b
    [1, [2, 3, 5]]
    >>>
  

#41. O que são iteradores?

Iteradores são objetos em Python que guardam o seu estado de iteração. Inicializam os dados usando o método __iter__ e retornam o próximo elemento usando o método __next__.

Para obter o próximo elemento do iterador, é necessário chamar a função next(iterador). Um tipo de dados de sequência pode ser convertido num iterador usando o método iter.

    >>> a = [1, 2]
    >>> iterador = iter(a)
    >>> next(iterador)
    1
    >>> next(iterador)
    2
    >>> next(iterador)
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    StopIteration
    >>>
  

#42. O que são geradores?

Geradores são funções que retornam um iterador como um objeto gerador. Usam a instrução yield para gerar os dados.

    >>> def numeros(n):
    ...     for i in range(1, n + 1):
    ...             yield i
    ...
    >>> _10 = numeros(10)
    >>> next(_10)
    1
    >>> next(_10)
    2
    >>> next(_10)
    3
    >>> next(_10)
    4
  

Conclusão 👨‍💻

As perguntas não estão limitadas ao que vimos neste artigo. Este artigo demonstra como diferentes tipos de perguntas podem surgir em diferentes áreas do Python. No entanto, não se limite ao conjunto de questões aqui abordadas.

Uma forma de se preparar, enquanto aprende, é questionar-se sobre os diferentes tópicos. Tente fazer diferentes tipos de perguntas a partir de um mesmo conceito, e responda-as. Desta forma, será mais difícil ser surpreendido com as perguntas numa entrevista. Pode também consultar um compilador Python online para praticar o seu código.

Boa sorte na sua próxima entrevista em Python! 👍