Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Projeto] Resposta Desafio

Todas as questões estão no meu notebook: https://colab.research.google.com/drive/1WQq4ACl2_H5TAWJEGX6YwCCQQf3is-gX?usp=sharing

Questão 1:

def calculadora_divisao():
  while True:
    try:
      print("\n" + "-" * 50)
      print("Calculadora de divisão")
      print("-" * 50)

      num1 = float(input("Digite o primeiro número: "))
      num2 = float(input("Digite o segundo número: "))

      resultado = num1 / num2
      print(f"O resultado da divisão é: {resultado:.2f}")

      continuar = input("\nDeseja fazer outra divisão? (s/n): ")
      if continuar.lower() != 's':
        print("-" * 50)
        print("Obrigado por usar a calculadora de divisão!")
        print("-" * 50)
        break

    except ZeroDivisionError:
      print("-" * 50)
      print("Erro: Divisão por zero não é permitida.")
      print("-" * 50)
    except ValueError:
      print("-" * 50)
      print("Erro: Entrada inválida. Por favor, insira números válidos.")
      print("-" * 50)
    except Exception as e:
      print("-" * 50)
      print(f"Erro: {e}")
      print("-" * 50)

calculadora_divisao()

Questão 2:

idades = {'Júlia': 16, 'Carol': 23, 'Alberto': 19, 'Roberta': 17}

try:
  nome = input("Digite um nome: ")
  idade = idades[nome]
  print(f"{nome} tem {idade} anos")

except KeyError:
  print("Nome não encontrado")
idades = {'Júlia': 16, 'Carol': 23, 'Alberto': 19, 'Roberta': 17}

try:
  nome = input("Digite um nome: ")

  nome = nome.strip().capitalize()

  idade = idades[nome]
  print(f"{nome} tem {idade} anos")

except KeyError:
  print("Nome não encontrado")
  print(f"Nomes disponíveis: {', '.join(idades.keys())}")
idades = {'Júlia': 16, 'Carol': 23, 'Alberto': 19, 'Roberta': 17}

nome = input("Digite um nome: ")
idade = idades.get(nome)

if idade is not None:
  print(f"{nome} tem {idade} anos")
else:
  print("Nome não encontrado")

Questão 3:

def converter_lista_para_float(lista):
  try:
    nova_lista = []
    for i, valor in enumerate(lista):
      nova_lista.append(float(valor))

    print("Conversão realizada com sucesso!")
    return nova_lista

  except ValueError as e:
    print(f"Erro de valor: {e}")
    print(f"  O elemento '{valor}' não pode ser convertido para float")
    return None

  except TypeError as e:
    print(f"Erro de tipo: {e}")
    print(f"  Certifique-se de passar uma lista como parâmetro")
    return None

  finally:
    print("Fim da execução da função")

print("=" * 50)
print("Teste 1: Lista válida")
print("=" * 50)
lista1 = ["10", "20.5", "30.0", "40.75"]
resultado1 = converter_lista_para_float(lista1)
print(f"Resultado: {resultado1}\n")

print("=" * 50)
print("Teste 2: Lista com texto inválido")
print("=" * 50)
lista2 = ["10", "abc", "30.0", "40.75"]
resultado2 = converter_lista_para_float(lista2)
print(f"Resultado: {resultado2}\n")

print("=" * 50)
print("Teste 3: Parâmetro não é lista")
print("=" * 50)
resultado3 = converter_lista_para_float("não sou lista")
print(f"Resultado: {resultado3}\n")
1 resposta
solução!

Olá, Maria. Como vai?

Parabéns pela excelente resolução do desafio! O seu notebook demonstra que você compreendeu perfeitamente como funciona o tratamento de exceções em Python, além de aplicar ótimas práticas de experiência do usuário (UX), como limpar os espaços com .strip() e padronizar as iniciais com .capitalize().

O uso dos blocos try-except nas três questões foi cirúrgico. Vamos destacar os pontos fortes da sua implementação e ver pequenas sugestões de melhoria técnica:

  • Questão 1 (Calculadora): Tratar especificamente o ZeroDivisionError e o ValueError antes do Exception genérico é a melhor prática recomendada na comunidade Python. Isso evita mascarar bugs desconhecidos e dá um retorno preciso para o usuário.
  • Questão 2 (Dicionário): Suas três variações para resolver o problema ficaram ótimas! A segunda opção, que mostra os nomes disponíveis em caso de erro, ajuda muito o usuário. A terceira opção, usando o método .get(), é uma excelente alternativa booleana quando não queremos disparar uma exceção de forma explícita.
  • Questão 3 (Conversão de lista): O uso do bloco finally foi perfeito para garantir o encerramento do processo, independentemente de ter ocorrido erro ou sucesso.

Como um pequeno complemento de boa prática para a Questão 3, note que no bloco except ValueError, você fez referência à variável valor:

except ValueError as e:
    print(f"Erro de valor: {e}")
    print(f"  O elemento '{valor}' não pode ser convertido para float")

Isso funciona no seu teste porque a lista continha strings, e o erro ocorreu dentro do laço for. No entanto, se o primeiro item da lista ou a estrutura em si disparasse um ValueError antes da variável valor ser criada no loop, o Python geraria um erro do tipo NameError (variável não definida).

Para tornar a sua função ainda mais robusta e imune a esse cenário isolado, você pode inicializar a variável valor como vazia ou None logo no início do bloco try:

def converter_lista_para_float(lista):
  try:
    nova_lista = []
    valor = None # Inicialização preventiva para segurança do escopo
    for i, valor in enumerate(lista):
      nova_lista.append(float(valor))
    # ... restante do código

Seus códigos estão super limpos, organizados e os testes cobriram todos os cenários possíveis (sucesso, erro de conversão e tipo de dado inválido). Continue com esse ótimo desempenho nos estudos!

Espero que possa ter lhe ajudado!