1
resposta

(07. Python para Dados: Funções) Desafio: hora da prática

# 1. Questão
lista = [16, 14, 63, 65, 17, 99, 70, 11, 20, 48, 79, 32, 17, 89, 12, 25, 66]

def analise_lista(dados):
    tam = len(dados)
    maior = max(dados)
    menor = min(dados)
    soma = sum(dados)
    return tam, maior, menor, soma

tam, maior, menor, soma = analise_lista(lista)

print(f"A lista possui {tam} números em que o maior número é {maior} e o menor número é {menor}. A soma dos valores presentes nela é igual a {soma}")


# 2. Questão
def tabuada(n):
    print(f"Tabuada do {n}:")
    for i in range(11):
        print(f"{n} x {i} = {n * i}")

numero = int(input("Digite um número inteiro: "))
tabuada(numero)


# 3. Questão
def multiplos_de_3(lista):
    resultado = []
    for numero in lista:
        if numero % 3 == 0:
            resultado.append(numero)
    return resultado

lista = [97, 80, 94, 88, 80, 1, 16, 53, 62, 32, 24, 99]

nova_lista = multiplos_de_3(lista)

print(nova_lista)


# 4. Questão
lista = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

quadrados = list(map(lambda x: x ** 2, lista))

print(quadrados)


# 5. Questão
notas = []

for indice in range(5):
    nota = float(input(f"Digite a {indice+1}ª nota: "))
    notas.append(nota)

notas.remove(max(notas))
notas.remove(min(notas))

media = sum(notas) / len(notas)

print(f"Nota da manobra: {media}")


# 6. Questão
def analisar_desempenho(notas):
    maior = max(notas)
    menor = min(notas)
    media = sum(notas) / len(notas)
    if media >= 6:
        situacao = "Aprovado(a)"
    else:
        situacao = "Reprovado(a)"
    return round(media, 1), maior, menor, situacao

notas = []

for indice in range(4):
    nota = float(input(f"Digite a {indice+1}ª nota: "))
    notas.append(nota)

media, maior, menor, situacao = analisar_desempenho(notas)

print(f"O(a) estudante obteve uma média de {media}, com a sua maior nota de {maior} pontos e a menor nota de {menor} pontos e foi {situacao}")


# 7. Questão
nomes = ["joão", "MaRia", "JOSÉ"]
sobrenomes = ["SILVA", "souza", "Tavares"]

def juntar_nome(nome, sobrenome):
    return f"{nome.title()} {sobrenome.title()}"

nomes_completos = list(map(juntar_nome, nomes, sobrenomes))

for nome in nomes_completos:
    print(f"Nome completo: {nome}")


# 8. Questão
def calcula_pontos(gols_marcados, gols_sofridos):
    pontos = 0
    # A função zip() em Python serve para combinar duas ou mais listas (ou iteráveis) elemento por elemento.
    for gm, gs in zip(gols_marcados, gols_sofridos):
        if gm > gs:
            pontos += 3
        elif gm == gs:
            pontos += 1
        else:
            pontos += 0
    pontuacao_maxima = len(gols_marcados) * 3
    aproveitamento = (pontos / pontuacao_maxima) * 100
    return pontos, round(aproveitamento, 1)

gols_marcados = [2, 1, 3, 1, 0]
gols_sofridos = [1, 2, 2, 1, 3]

pontos, aprov = calcula_pontos(gols_marcados, gols_sofridos)

print(f"A pontuação do time foi de {pontos} e seu aproveitamento foi de {aprov}%")


# 9. Questão
def gasto_hotel(dias):
    return dias * 150

def gasto_gasolina(distancia):
    consumo = 14  # km por litro
    preco_litro = 5
    litros = (distancia * 2) / consumo  # ida e volta
    return litros * preco_litro

def gasto_passeio(dias, valor_diaria):
    return dias * valor_diaria

# dados da viagem
dias = 3
cidade = "Salvador"

distancias = {
    "Salvador": 850,
    "Fortaleza": 800,
    "Natal": 300,
    "Aracaju": 550
}

passeios = {
    "Salvador": 200,
    "Fortaleza": 400,
    "Natal": 250,
    "Aracaju": 300
}

distancia = distancias[cidade]
valor_passeio = passeios[cidade]

total = (
    gasto_hotel(dias) +
    gasto_gasolina(distancia) +
    gasto_passeio(dias, valor_passeio)
)

print(f"Com base nos gastos definidos, uma viagem de {dias} dias para {cidade} saindo de Recife custaria {round(total, 2)} reais")


# 10. Questão
frase = "Aprender Python aqui na Alura é muito bom"

# removendo pontuações
frase = frase.replace(",", " ").replace(".", " ").replace("!", " ").replace("?", " ")

# transformando em lista de palavras
palavras = frase.split()

# filtrando palavras com tamanho >= 5
resultado = list(filter(lambda p: len(p) >= 5, palavras))

print(resultado)
1 resposta

Olá, Eduardo! Como vai?

Uau, que entrega espetacular! Você resolveu todas as 10 questões do desafio prático com um nível de precisão, organização e clareza dignos de um desenvolvedor profissional.

Fazer um script modularizado, dividindo as responsabilidades em funções separadas e explorando recursos nativos do Python como as funções built-in (map, filter, zip), além de estruturas condicionais e de repetição, é exatamente o que consolida a base de um ótimo Cientista de Dados.

O seu código está excelente e roda sem erros. Para valorizar o seu esforço e trazer alguns insights técnicos de boas práticas e arquitetura de código, analisei detalhadamente os seus acertos:


Destaques Técnicos da sua Resolução

1. Uso elegante da função zip() (Questão 8)

O seu comentário explicando o funcionamento do zip() já mostra uma ótima preocupação com a documentação do código. Usá-lo para iterar em paralelo sobre as listas de gols_marcados e gols_sofridos foi a escolha de design perfeita:

for gm, gs in zip(gols_marcados, gols_sofridos):

Fazer isso evita o uso de contadores manuais (como gols_marcados[i]), deixando a leitura do laço for muito mais limpa e idiomática (Pythonic).

2. Modularização de subproblemas (Questão 9)

Na questão da viagem, você quebrou o problema complexo em três funções independentes e especializadas (gasto_hotel, gasto_gasolina, gasto_passeio). Essa prática segue o princípio de responsabilidade única do desenvolvimento de software, tornando muito fácil ajustar, por exemplo, o consumo do carro ou o preço do litro da gasolina sem mexer na lógica de cálculo do hotel.

3. Programação Funcional com map e filter (Questões 4, 7 e 10)

Você aplicou perfeitamente as funções de alta ordem juntamente com expressões lambda. Na questão 10, o seu fluxo de tratamento de texto (higienização das pontuações com .replace(), quebra em palavras com .split() e filtragem com filter) mimetiza com exatidão as primeiras etapas de um pipeline de Processamento de Linguagem Natural (PLN).


Uma Dica de Ouro sobre Segurança de Código (Questão 5)

A sua lógica para a nota da manobra (excluir a maior e a menor nota e tirar a média do restante) está perfeita e o resultado está correto. Porém, existe uma pegadinha silenciosa na forma como os métodos de lista agem em Python.

Você utilizou o método .remove() diretamente na lista original:

notas.remove(max(notas))
notas.remove(min(notas))

O método .remove() é uma operação in-place, ou seja, ele altera a lista notas permanentemente deletando o dado. No mundo da análise de dados, alterar o dado bruto original pode ser perigoso, pois se você precisasse exibir um relatório com todas as cinco notas originais do atleta no final do script, você já teria perdido essa informação.

A boa prática: Para manter o seu código seguro, uma alternativa muito elegante é ordenar uma cópia da lista ou usar fatiamento de listas (slicing). Veja essa alternativa sem alterar o dado original:

# Criamos uma nova lista ordenada a partir das notas digitadas
notas_ordenadas = sorted(notas)

# O fatiamento [1:-1] joga fora o primeiro elemento (o menor) e o último (o maior)
notas_validas = notas_ordenadas[1:-1]

media = sum(notas_validas) / len(notas_validas)

Dessa forma, a sua lista notas original permanece intacta com as 5 notas salvas caso o sistema precise delas para outro cálculo no futuro.

Parabéns pelo engajamento e pelo altíssimo nível das respostas postadas no fórum, Eduardo! Continue avançando com esse mesmo foco.

Espero que possa ter lhe ajudado!