Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

Minhas Soluções - Exercício Seção 2 (Funções)

Boa Noite a Todos! :)

Questão 1


Questão 2


Questão 3


Questão 4


Questão 5


Questão 6


Questão 7

Questão 7 (Resolução 2)


Questão 8

Questão 8 (Resolução)


Questão 9

Questão 9 (Resolução Parte 1)

Questão 9 (Resolução Parte 2)


Questão 10


Enviando aqui minhas resoluções de cada questão relacionada a seção 2 do curso "Python para Dados: Trabalhando com funções, estruturas de dados e exceções".
Além daqui, compartilhei as resoluções no meu GitHub, em um repositório para armazenar meus códigos de estudo!
https://github.com/yanhrobim/data_engineer_journey/blob/main/02-Python/estudos/python-basics/Aula%205%20(Fun%C3%A7%C3%B5es%20e%20Estrutura%20de%20Dados)/fun%C3%A7%C3%B5es/exercicios.py (Espero que não tenha problema compartilhar isso aqui, sou novo por aqui, desculpe qualquer coisa!)

Estou aberto a qualquer tipo de melhor solução, crítica construtiva, outras maneiras que eu poderia ter aplicado no código, tanto por aqui quanto ou Issues ou Pull Requests no repositório. Além de também estar aberto a criar conexões dentro da área!
Desejo uma boa noite a todos, bom dia, boa tarde, de qualquer momento que esteja vendo isso :)

1 resposta

Olá, Yan. Como vai?

Seja muito bem-vindo à comunidade da Alura! Pode ficar super tranquilo, não há problema algum em compartilhar o link do seu repositório aqui no fórum. Pelo contrário: essa é uma das melhores práticas para quem está estudando programação, pois valoriza o seu perfil, ajuda a movimentar o seu GitHub e permite que outras pessoas analisem o seu código de forma limpa.

Parabéns pela qualidade das suas resoluções! Seus códigos estão extremamente organizados, com comentários muito didáticos explicando o seu raciocínio e utilizando recursos nativos modernos e avançados do Python, como type hinting (as indicações de tipo como list[int]), expressões lambda, map() e zip().

Como você mencionou que está aberto a feedbacks e outras maneiras de aplicar a lógica, analisei as suas imagens detalhadamente e encontrei alguns pontos muito interessantes para debatermos e elevarmos ainda mais o nível do seu código. Vamos a eles:

1. O detalhe oculto na Questão 5 (Notas dos Skatistas)

A sua lógica para resolver esse problema foi muito criativa ao usar list comprehension para filtrar os valores:

lista_notas = [numero for numero in lista_notas if numero not in maior_e_menor_nota]

Essa abordagem funciona perfeitamente quando as notas digitadas são todas diferentes. Contudo, ela esconde um pequeno bug caso o skatista receba notas repetidas. Imagine o seguinte cenário real: as notas digitadas são [9, 8, 8, 7, 5].

  • A sua lista maior_e_menor_nota terá os valores [9, 5].
  • Na sua linha de filtro, o código vai olhar nota por nota. Quando ele passar pelo número 8, ele verá que 8 não está em [9, 5]. O número 8 é mantido.
  • O problema ocorre se a nota repetida for a máxima ou a mínima. Se o júri der as notas [9, 9, 8, 7, 5], o max é 9. A sua condição if numero not in [9, 5] vai descartar os dois números 9 da lista, restando apenas duas notas para calcular a média, em vez de eliminar apenas uma.

Como resolver com uma boa prática: Em Python, para remover apenas a primeira ocorrência de um elemento específico em uma lista (mantendo os repetidos caso existam), utilizamos o método .remove(). Veja como a sua função ficaria mais blindada:

def nota_skatista(n1, n2, n3, n4, n5):
    lista_notas = [n1, n2, n3, n4, n5]
    
    # Remove apenas a primeira ocorrência do máximo e do mínimo
    lista_notas.remove(max(lista_notas))
    lista_notas.remove(min(lista_notas))
    
    media_skatista = sum(lista_notas) / len(lista_notas)
    return round(media_skatista, 2)

2. Simplificando a Questão 2 (Tabuada)

Na Questão 2, você escreveu dez linhas manuais de print(). O código funciona perfeitamente e exibe o resultado correto, mas imagine se o desafio pedisse a tabuada até o número 100? Faria o código ficar gigantesco, certo?

Sempre que notar um padrão repetitivo em programação, lembre-se que podemos automatizá-lo com uma estrutura de repetição (for). Veja como reduzir aquelas dez linhas para apenas duas usando a função range():

def tabuada(numero: int):
    # O range(0, 11) vai passar por todos os números de 0 até 10
    for i in range(0, 11):
        print(f"{numero} x {i} = {numero * i}")

3. Pequena correção conceitual na Questão 8 (Cálculo de Pontos)

Na imagem da Questão 8, o seu terminal exibiu o seguinte resultado: A pontuação do time foi de 7 e seu aproveitamento foi de 0.47%.

Na verdade, o aproveitamento do time foi de 46.67% (ou 0.4667 em formato decimal). Como no seu print() você adicionou o símbolo de porcentagem (%) diretamente ao lado da variável aproveitamento, o resultado exibido deu a entender que o time teve menos de 1% de aproveitamento.

Para que a exibição fique perfeita matematicamente, basta multiplicar o valor por 100 na hora de exibir:

print(f"A pontuação do time foi de {pontos} e seu aproveitamento foi de {round(aproveitamento * 100, 2)}%")

Suas soluções para as questões 3, 4, 6 and 7 (com destaque para a formatação de nomes com map e lambda) ficaram excelentes e dignas de quem tem muita facilidade com lógica.

Continue com esse foco incrível, documentando seus códigos e compartilhando seus projetos no GitHub. Essa postura ajuda demais a crescer na carreira de engenharia e ciência de dados!

Espero que possa ter lhe ajudado!