2
respostas

Desafio: hora da prática

1-
try:
num1 = float(input("Digite o primeiro número (dividendo): "))
num2 = float(input("Digite o segundo número (divisor): "))
resultado = num1 / num2
print(f"O resultado da divisão de {num1} por {num2} é: {resultado:.2f}")
except ZeroDivisionError as erro:
print("\n--- Erro Gerado ---")
print(f"Tipo de Erro: {type(erro).name}")
print("Mensagem: Não é possível realizar uma divisão por zero!")
except ValueError as erro:
print("\n--- Erro Gerado ---")
print(f"Tipo de Erro: {type(erro).name}")
print("Mensagem: Entrada inválida! Você deve digitar apenas números")

Digite o primeiro número (dividendo): 5
Digite o segundo número (divisor): 0

--- Erro Gerado ---
Tipo de Erro: ZeroDivisionError
Mensagem: Não é possível realizar uma divisão por zero!

2-
idades = {'Júlia': 16, 'Carol': 23, 'Alberto': 19, 'Roberta': 17}
nome_pesquisa = input("Digite o nome que deseja pesquisar a idade: ")
try:
idade_encontrada = idades[nome_pesquisa]
except KeyError:
print("Nome não encontrado")
else:
print(f"A idade de {nome_pesquisa} é {idade_encontrada} anos.")

Digite o nome que deseja pesquisar a idade: Marcelo
Nome não encontrado

3-
def converter_para_float(lista_original: list) -> list:
try:
lista_convertida = [float(elemento) for elemento in lista_original]
except ValueError as erro:
print("\n--- Erro Gerado ---")
print(f"Tipo de Erro: {type(erro).name}")
print("Mensagem: A lista contém elementos de texto que não podem ser convertidos para número.")
return []
except TypeError as erro:
print("\n--- Erro Gerado ---")
print(f"Tipo de Erro: {type(erro).name}")
print("Mensagem: A lista contém tipos de dados incompatíveis (ex: sublistas ou dicionários).")
return []
else:
return lista_convertida
finally:
print("Fim da execução da função")

4-
def agrupar_e_somar(lista_a: list, lista_b: list) -> list:
try:
if len(lista_a) != len(lista_b):
raise IndexError("A quantidade de elementos em cada lista é diferente.")
lista_resultado = [(lista_a[i], lista_b[i], lista_a[i] + lista_b[i]) for i in range(len(lista_a))]
return lista_resultado
except IndexError as erro:
print("\n--- Erro Gerado via raise ---")
print(f"Tipo de Erro: {type(erro).name}")
print(f"Mensagem: {erro}")
return []
except TypeError:
print("\n--- Erro Gerado Automaticamente ---")
print("Tipo de Erro: TypeError")
print("Mensagem: Não foi possível realizar a soma. Um ou mais elementos não são numéricos.")
return []

5- Correção das notas
def calcular_notas_estudantes(testes: list, gabarito: list) -> list:
notas_finais = []
try:
for num_estudante, respostas in enumerate(testes, start=1):
nota_estudante = 0
for i, alternativa in enumerate(respostas):
if alternativa not in ['A', 'B', 'C', 'D']:
raise ValueError(f"A alternativa {alternativa} não é uma opção de alternativa válida")
if alternativa == gabarito[i]:
nota_estudante += 1
notas_finais.append(nota_estudante)
return notas_finais
except ValueError as erro:
print("\n--- Erro Encontrado ---")
print(f"Tipo de Erro: ValueError")
print(f"Mensagem: {erro}")
return []

  • Notas sem exceção
    gabarito = ['D', 'A', 'B', 'C', 'A']
    testes_sem_ex = [['D', 'A', 'B', 'C', 'A'], ['C', 'A', 'A', 'C', 'A'], ['D', 'B', 'A', 'C', 'A']]
    print("Executando teste sem exceção:")
    resultado1 = calcular_notas_estudantes(testes_sem_ex, gabarito)
    if resultado1:
    print(f"Notas dos estudantes: {resultado1}")

Executando teste sem exceção:
Notas dos estudantes: [5, 3, 3]

  • Notas com exceção
    testes_com_ex = [['D', 'A', 'B', 'C', 'A'], ['C', 'A', 'A', 'E', 'A'], ['D', 'B', 'A', 'C', 'A']]
    print("Executando teste com exceção:")
    resultado2 = calcular_notas_estudantes(testes_com_ex, gabarito)
    if resultado2:
    print(f"Notas dos estudantes: {resultado2}")

Executando teste com exceção:

--- Erro Encontrado ---
Tipo de Erro: ValueError
Mensagem: A alternativa E não é uma opção de alternativa válida

2 respostas

6-
6-
def verificar_pontuacao(lista_palavras):
for palavra in lista_palavras:
if ',' in palavra or '.' in palavra or '!' in palavra or '?' in palavra:
raise ValueError(
f'O texto apresenta pontuações na palavra "{palavra}".'
)

def verificar_pontuacao(lista_palavras):
for palavra in lista_palavras:
if ',' in palavra or '.' in palavra or '!' in palavra or '?' in palavra:
raise ValueError(
f'O texto apresenta pontuações na palavra "{palavra}".'
)

lista_tratada = [
'Python', 'é', 'uma', 'linguagem', 'de', 'programação', 'poderosa', 'versátil',
'e', 'fácil', 'de', 'aprender', 'utilizada', 'em', 'diversos', 'campos', 'desde',
'análise', 'de', 'dados', 'até', 'inteligência', 'artificial'
]

try:
verificar_pontuacao(lista_tratada)
print("Nenhuma pontuação encontrada.")
except ValueError as erro:
print(erro)

def verificar_pontuacao(lista_palavras):
for palavra in lista_palavras:
if ',' in palavra or '.' in palavra or '!' in palavra or '?' in palavra:
raise ValueError(
f'O texto apresenta pontuações na palavra "{palavra}".'
)

lista_nao_tratada = [
'Python', 'é', 'uma', 'linguagem', 'de', 'programação', 'poderosa,', 'versátil',
'e', 'fácil,', 'de', 'aprender', 'utilizada', 'em', 'diversos', 'campos,', 'desde',
'análise', 'de', 'dados', 'até', 'inteligência', 'artificial!'
]

try:
verificar_pontuacao(lista_nao_tratada)
print("Nenhuma pontuação encontrada.")
except ValueError as erro:
print(erro)

def verificar_pontuacao(lista_palavras):
for palavra in lista_palavras:
if ',' in palavra or '.' in palavra or '!' in palavra or '?' in palavra:
raise ValueError(
f'O texto apresenta pontuações na palavra "{palavra}".'
)

lista_nao_tratada = [
'Python', 'é', 'uma', 'linguagem', 'de', 'programação', 'poderosa,', 'versátil',
'e', 'fácil,', 'de', 'aprender', 'utilizada', 'em', 'diversos', 'campos,', 'desde',
'análise', 'de', 'dados', 'até', 'inteligência', 'artificial!'
]

try:
verificar_pontuacao(lista_nao_tratada)
print("Nenhuma pontuação encontrada.")
except ValueError as erro:
print(erro)

O texto apresenta pontuações na palavra "poderosa,".

7-
def divide_colunas(pressoes, temperaturas):
try:
# Verifica se as listas têm o mesmo tamanho
if len(pressoes) != len(temperaturas):
raise ValueError("As listas devem ter o mesmo tamanho.")

    resultado = []

    for pressao, temperatura in zip(pressoes, temperaturas):
        # Verifica divisão por zero
        if temperatura == 0:
            raise ZeroDivisionError("Não é possível dividir por zero.")

        resultado.append(round(pressao / temperatura, 2))

    return resultado

except ValueError as erro:
    print(f"ValueError: {erro}")

except ZeroDivisionError as erro:
    print(f"ZeroDivisionError: {erro}")

Teste 1 - Caso válido

pressoes = [100, 120, 140, 160, 180]
temperaturas = [20, 25, 30, 35, 40]

print(divide_colunas(pressoes, temperaturas))

Teste 2 - Divisão por zero

pressoes = [60, 120, 140, 160, 180]
temperaturas = [0, 25, 30, 35, 40]

print(divide_colunas(pressoes, temperaturas))

Teste 3 - Listas com tamanhos diferentes

pressoes = [100, 120, 140, 160]
temperaturas = [20, 25, 30, 35, 40]

print(divide_colunas(pressoes, temperaturas))

[5.0, 4.8, 4.67, 4.57, 4.5]

ZeroDivisionError: Não é possível dividir por zero.
None

ValueError: As listas devem ter o mesmo tamanho.
None

Olá, Marcelo. Como vai?

Parabéns por concluir e compartilhar todas as resoluções do desafio! É muito bacana ver como você aplicou diferentes tipos de tratamento de erros, cobrindo exceções como ValueError, ZeroDivisionError e KeyError, além de utilizar perfeitamente o comando raise para criar validações customizadas. O seu uso da função zip no exercício 7 também foi uma sacada muito inteligente e elegante para iterar sobre duas listas simultaneamente.

Notei que na hora de colar os scripts aqui no fórum, a indentação acabou se perdendo. Como dica para as suas próximas postagens, você pode preservar a estrutura do seu script utilizando três crases antes e depois do bloco de texto. Isso cria um bloco de código que facilita muito a leitura por outros alunos.

Para agregar ainda mais valor ao seu projeto, gostaria de deixar uma sugestão de melhoria focada no seu exercício 6. Nele, você verificou manualmente algumas pontuações específicas utilizando vários operadores or:

if ',' in palavra or '.' in palavra or '!' in palavra or '?' in palavra:

No dia a dia com análise de dados, costumamos lidar com textos que podem conter pontuações inesperadas (como ponto e vírgula, aspas, parênteses, etc). Para tornar essa verificação mais robusta sem precisar digitar símbolo por símbolo, você pode utilizar a biblioteca nativa string do Python, que já possui uma constante chamada string.punctuation contendo todas as pontuações padrão.

Veja um exemplo de como o seu código pode ser otimizado utilizando essa biblioteca associada à função any() (que retorna verdadeiro se qualquer uma das condições for atendida):

import string

def verificar_pontuacao(lista_palavras):
    for palavra in lista_palavras:
        # Verifica se algum caractere da palavra atual é uma pontuação
        if any(caractere in string.punctuation for caractere in palavra):
            raise ValueError(f'O texto apresenta pontuações na palavra "{palavra}".')

lista_teste = ['Python', 'é', 'poderosa,', 'versátil', 'e', 'fácil!']

try:
    verificar_pontuacao(lista_teste)
    print("Nenhuma pontuação encontrada.")
except ValueError as erro:
    print(erro)

Dessa forma o seu código fica mais limpo, dinâmico e blindado contra qualquer tipo de pontuação que possa aparecer nos textos dos seus futuros projetos de Data Science. Continue com esse ótimo ritmo de prática!

Espero que possa ter lhe ajudado!