Descubra Python: Questões Diárias para Todos os Níveis.

Bem-vindo(a) ao nosso desafio diário de Python! Como amantes e entusiastas dessa linguagem incrível, criamos um espaço onde você pode aprimorar suas habilidades e testar seus conhecimentos todos os dias.

A cada dia, postaremos uma nova questão de Python, abrangendo desde conceitos básicos até tópicos avançados. Quer você seja um iniciante ansioso para aprender ou um programador experiente buscando novos desafios, nossos exercícios são projetados para todos. Junte-se a nós nessa jornada de aprendizado contínuo.

🔔 Assine o InfinitePy Newsletter para mais recursos e uma abordagem passo a passo para aprender Python, e fique atualizado com as últimas tendências e dicas práticas.

Todos os exemplos também são explicados aqui 👨‍🔬, um notebook Google Colab para tornar seu aprendizado ainda mais interativo.

InfinitePy Newsletter - Sua fonte de aprendizado e inspiração em Python.

Questão • 4D9F

10 de agosto de 2024

Qual é a saída para o código Python abaixo?

def countdown(n):
    while n > 0:
        yield n
        n -= 1

gen = countdown(10)
print(next(gen), end = " ")
print(next(gen), end = " ")
print(next(gen), end = " ")

Resposta

10 9 8 

Vamos analisar o código passo a passo:

# Definindo uma função chamada 'countdown' que recebe um argumento 'n'
def countdown(n):
    # Enquanto 'n' for maior que zero, execute o bloco de código abaixo
    while n > 0:
        # 'yield' é usado para fazer uma pausa no estado atual da função e retornar 'n' ao chamador
        yield n
        # Subtrai 1 de 'n' em cada iteração do loop while
        n -= 1

# Aqui estamos criando um gerador 'gen' chamando a função 'countdown' com o argumento 10
gen = countdown(10)

# O gerador 'gen' não executa o código imediatamente. Ele é um objeto iterável que
# produz valores conforme necessário. Usamos a função 'next' para obter o próximo valor.

# Imprimindo o próximo valor gerado por 'gen' com 'end = " "' para manter a mesma linha
print(next(gen), end=" ")  # Esperado imprimir 10
# Imprimindo o próximo valor gerado por 'gen'
print(next(gen), end=" ")  # Esperado imprimir 9
# Imprimindo o próximo valor gerado por 'gen'
print(next(gen), end=" ")  # Esperado imprimir 8

# Se chamássemos 'next(gen)' novamente, obteríamos o próximo valor: 7, 
# e assim por diante até que o gerador fique sem valores e levante uma exceção 'StopIteration'.

Questão • 87C1

09 de agosto de 2024

Qual é a saída para o código Python abaixo?

print(min(max(False,-3,-4), 2,7))

Resposta

False

Vamos analisar o código passo a passo:

# min() é uma função que retorna o menor valor entre os argumentos fornecidos.
# max() é uma função que retorna o maior valor entre os argumentos fornecidos.

# max(False, -3, -4)
# False em Python é considerado como 0 quando comparado com números inteiros.
# Portanto, max(False, -3, -4) é equivalente a max(0, -3, -4), porque o valor de False é interpretado como 0.
# max(0, -3, -4) retornará o maior valor dentre 0, -3 e -4, que é 0.

# Agora substituímos max(False, -3, -4) por 0 na expressão original:
# min(0, 2, 7)

# min(0, 2, 7)
# A função min() retorna o menor valor entre 0, 2 e 7, que é 0.

# Portanto, a expressão print(min(max(False, -3, -4), 2, 7)) vai mostrar o valor False no console.
print(min(max(False, -3, -4), 2, 7))

Questão • 11B5

08 de agosto de 2024

Qual é a saída para o código Python abaixo?

dict_a = {"a": 1, "b": 2}
dict_b = {"a": 1, "b": 2}

print(dict_a is dict_b)
print(dict_a == dict_b)

Resposta

False e True

Vamos analisar o código passo a passo:

# Criamos dois dicionários, dict_a e dict_b.
# Um dicionário é uma coleção não ordenada de pares chave-valor.
dict_a = {"a": 1, "b": 2}
dict_b = {"a": 1, "b": 2}

# Aqui estamos usando o operador 'is' para comparar se dict_a e dict_b são o mesmo objeto na memória.
# Como dict_a e dict_b são dois objetos diferentes, mesmo que contenham os mesmos pares chave-valor,
# o resultado será False.
print(dict_a is dict_b)

# Aqui estamos usando o operador '==' para comparar se dict_a e dict_b são iguais.
# Como dict_a e dict_b têm os mesmos pares chave-valor, o resultado será True.
print(dict_a == dict_b)

Questão • 42F1

07 de agosto de 2024

Qual é a saída para o código Python abaixo?

num = [10, 20, 30, 40, 50]
num[1:4] = [15, 25, 35]
print(num)

Resposta

[10, 15, 25, 35, 50]

Vamos analisar o código passo a passo:

# Define uma lista chamada 'num' que contém cinco elementos inteiros
num = [10, 20, 30, 40, 50]

# Aqui, estamos realizando uma atribuição de fatiamento (slice assignment)
# Os índices 1 até 3 (4 não é incluído) estão sendo substituídos por uma nova lista [15, 25, 35]
# Ou seja, a sublista [20, 30, 40] será substituída por [15, 25, 35]
# Após a operação, a lista 'num' será [10, 15, 25, 35, 50]
num[1:4] = [15, 25, 35]

# Imprime a lista 'num' atualizada no console:
print(num)
Explicações Adicionais:
  • Em Python, uma lista é uma coleção de itens que são ordenados e mutáveis. Ela é definida usando colchetes [].

  • O fatiamento é uma técnica útil para acessar subseções de uma lista. A sintaxe lista[início:fim] permite acessar elementos a partir do índice início até fim-1.

  • O Python permite atribuir uma nova lista para a seção fatiada da lista original. Isso permite substituir múltiplos elementos de uma vez.

Questão • 5A10

06 de agosto de 2024

Qual é a saída para o código Python abaixo?

from itertools import pairwise

def gerador(lista):
    return list(pairwise(lista))

lista_numeros = [1, 2, 3, 4, 5]
print(gerador(lista_numeros))

Resposta

[(1, 2), (2, 3), (3, 4), (4, 5)]

Vamos analisar o código passo a passo:

# Importa a função pairwise do módulo itertools
from itertools import pairwise

def gerador(lista):
    # A função gerador recebe uma lista como parâmetro
    # pairwise é uma função que gera pares consecutivos dos elementos na lista
    # Convertemos o resultado de pairwise, que é um iterador, para uma lista
    resultado = list(pairwise(lista))
    # Retornamos a lista de pares consecutivos
    return resultado

# Exemplo de uso da função gerador
# Definimos uma lista de números de exemplo
lista_numeros = [1, 2, 3, 4, 5]

# Chamamos a função gerador passando lista_numeros como argumento
# e imprimimos o resultado
print(gerador(lista_numeros))
Explicações Adicionais:
  • itertools é um módulo padrão em Python que fornece várias ferramentas para criar iteradores eficientes.

  • pairwise é uma função introduzida no Python 3.10 para criar iteradores que retornam pares consecutivos dos elementos.

  • Assim, a função pairwise do módulo itertools retorna um iterador de pares consecutivos dos elementos do iterável de entrada. Portanto, para a lista [1, 2, 3, 4, 5], a função pairwise gera os pares consecutivos (1, 2), (2, 3), (3, 4) e (4, 5), resultando na lista de tuplas [(1, 2), (2, 3), (3, 4), (4, 5)].

Questão • B845

05 de agosto de 2024

Qual é a saída para o código Python abaixo?

l1 = [1, 2, 3]
l2 = l1
l2.append(4)
print(l1)

Resposta

[1, 2, 3, 4]

Vamos analisar o código passo a passo:

# Definimos uma lista 'l1' com os elementos 1, 2 e 3
l1 = [1, 2, 3]

# Aqui, atribuimos 'l1' a 'l2'.
# Isso faz com que 'l2' e 'l1' apontem para a mesma lista na memória.
l2 = l1

# Adicionamos o número 4 à lista 'l2'.
# Como 'l2' e 'l1' apontam para o mesmo objeto na memória,
# isso significa que estamos realmente adicionando o número 4 a ambas as listas.
# Portanto, tanto 'l1' quanto 'l2' agora contêm [1, 2, 3, 4].
l2.append(4)

# Finalmente, imprimimos 'l1'.
# O resultado será [1, 2, 3, 4] porque a operação 'append' em 'l2'
# modificou a lista que 'l1' também referencia.
print(l1)
Explicações Adicionais:
  • Quando você atribui uma lista (ou qualquer outro objeto mutável) a uma nova variável, as duas variáveis apontam para o mesmo objeto na memória.

  • Alterações feitas usando qualquer uma das variáveis afetam o mesmo objeto subjacente.

  • Por isso, tanto l1 quanto l2 apresentam a modificação feita, que é a adição do número 4.

Questão • 88F7

04 de agosto de 2024

Qual é a saída para o código Python abaixo?

def foo(x=[]):
    x.append(1)
    return x

print(foo())
print(foo())

Resposta

[1] e [1, 1]

Vamos analisar o código passo a passo:

# Definimos uma função chamada foo que recebe um parâmetro opcional x, que por padrão é uma lista vazia.
def foo(x=[]):
    # Adicionamos o número 1 ao final da lista x.
    x.append(1)
    # Retornamos a lista x depois de adicionar o número 1.
    return x

# Chamamos a função foo sem passar nenhum argumento, então ela usa o valor padrão da lista x, que é uma lista vazia. 
# A função adiciona 1 a essa lista e a retorna, então a lista retornada e impressa é [1].
print(foo())

# Chamamos a função foo novamente sem passar nenhum argumento. 
# Agora, como a lista x foi definida no escopo da função e não é recriada a cada chamada (por causa do comportamento do parâmetro padrão mutável),
# a lista que está sendo usada ainda contém o valor anterior (ou seja, [1]).
# A função adiciona outro 1 a essa lista e a retorna, então a lista retornada e impressa é [1, 1].
print(foo())
Explicações Adicionais:
  • Em Python, argumentos padrão são avaliados apenas uma vez quando a função é definida, não toda vez que a função é chamada. Isso significa que se o argumento padrão for um objeto mutável como uma lista, e você modificar esse objeto, as alterações persistirão em todas as chamadas de função.

  • Este comportamento pode ser confuso para iniciantes porque normalmente se espera que uma nova lista seja criada a cada chamada da função.

  • No entanto, em Python, os parâmetros padrão de função são avaliados apenas uma vez no momento da definição da função, não a cada chamada.

Questão • AD26

03 de agosto de 2024

Qual é a saída para o código Python abaixo?

import pandas as pd

data = {'Equipe': ['China 🇨🇳', 'França 🇫🇷', 'Austrália 🇦🇺', 'Estados Unidos 🇺🇸', 'Grã-Bretanha 🇬🇧'],
        '🥇': [16, 11, 12, 11, 10],
        '🥈': [11, 14,  7, 20, 10],
        '🥉': [ 9,  7,  5, 20, 12]}

df = pd.DataFrame(data)
df['Total'] = df['🥇'] + df['🥈'] + df['🥉']

Resposta

df.loc[df['Total'].idxmax(), 'Total']

Vamos analisar o código passo a passo:

import pandas as pd  # Importa a biblioteca pandas como pd

# Define um dicionário com os dados das equipes e suas respectivas medalhas
data = {'Equipe': ['China 🇨🇳', 'França 🇫🇷', 'Austrália 🇦🇺', 'Estados Unidos 🇺🇸', 'Grã-Bretanha 🇬🇧'],
        '🥇': [16, 11, 12, 11, 10],  # Medalhas de ouro para cada país
        '🥈': [11, 14,  7, 20, 10],  # Medalhas de prata para cada país
        '🥉': [ 9,  7,  5, 20, 12]}  # Medalhas de bronze para cada país

# Cria um DataFrame com os dados fornecidos
df = pd.DataFrame(data)

# Criamos uma nova coluna 'Total' que soma todas as colunas de medalhas para cada país.
df['Total'] = df['🥇'] + df['🥈'] + df['🥉']

# Imprime o nome da equipe que tem o maior número total de medalhas usando idxmax() para encontrar o índice
# idxmax() retorna o índice do maior valor na série df['Total']
print(df.loc[df['Total'].idxmax(), 'Equipe'])

# Alternativamente, imprime o nome da equipe que tem o maior número total de medalhas usando argmax() para encontrar o índice (identico a idxmax)
# argmax() também pode ser usado em substituição a idxmax(), ele retorna a posição do maior valor na série df['Total']
print(df.loc[df['Total'].argmax(), 'Equipe'])

# Outra forma de acessar o nome da equipe com mais medalhas, usando indexação direta através do índice fornecido por idxmax()
print(df['Equipe'][df['Total'].idxmax()])

# Imprime o total de medalhas da equipe que mais ganhou medalhas, encontrada com idxmax()
print(df.loc[df['Total'].idxmax(), 'Total'])

Explicações Adicionais:

  • idxmax(): Este método retorna o índice da primeira ocorrência do valor máximo na série. No contexto de um DataFrame pandas, se aplicado a uma coluna específica, como df['Total'], ele retorna o índice da linha onde ocorre o maior valor na série df['Total'].

  • argmax(): Muito semelhante a idxmax(), este método retorna a posição do valor máximo na série. No entanto, argmax() é mais genérico e pode ser usado em arrays Numpy também. Em um DataFrame pandas, ambos os métodos se comportam de forma similar quando usados em uma série.

Questão • 9B8A

02 de agosto de 2024

Qual é a saída para o código Python abaixo?

lista = [10, 20, 30, 40, 50, 60]
lista_fatiada = lista[1:5:2]
print(lista_fatiada)

Resposta

[20, 40]

Vamos analisar o código passo a passo:

# Define uma lista com elementos inteiros
lista = [10, 20, 30, 40, 50, 60]

# Realiza uma fatiamento/slice na lista
# lista[1:5:2] significa:
# - começando no índice 1 (20)
# - até o índice 5 (não incluindo o índice 5, ou seja, até 50)
# - pegando a cada 2 elementos
# O resultado será [20, 40]
lista_fatiada = lista[1:5:2]

# Imprime a lista fatiada
print(lista_fatiada)
Explicação
  • A lista lista contém 6 elementos: [10, 20, 30, 40, 50, 60].

  • A fatia lista[1:5:2] indica que começamos no índice 1 e vamos até (mas não incluindo) o índice 5, pegando cada elemento. Portanto:

    • O primeiro elemento do índice 1 é 20.

  • O segundo elemento pegando cada elemento está no índice 3, que é 40.

  • A lista fatiada final é [20, 40].

Questão • AE8A

01 de agosto de 2024

Qual é a saída para o código Python abaixo?

result = 0
for i in range(1, 10):
    if i % 2 == 0:
        result += i

print(result)

Resposta

20

Vamos analisar o código passo a passo:

# Inicializa a variável "result" com valor 0
result = 0

# Inicia um loop que vai de 1 até 9 (o 10 não é incluído)
for i in range(1, 10):
    # Verifica se o valor de "i" é par (ou seja, se o resto da divisão de "i" por 2 é igual a 0)
    if i % 2 == 0:
        # Se "i" for par, adiciona o valor de "i" à variável "result"
        result += i

# Imprime o valor final de "result"
print(result)