1
resposta

Questão 7 aplicando a projetos da aula 4

escrevi meu seguinte código:

def divide_colunas(pressoes, temperaturas: list):
  try:
    if len(pressoes) != len(temperaturas):
      raise ValueError("As listas tem tamanhos diferentes.")
    for i in temperaturas:
      if i == 0:
        raise ZeroDivisionError("Não é possível dividir por zero.")
    resultado = []
    for pressao, temperatura  in zip(pressoes, temperaturas):
      razao = pressao / temperatura
      resultado.append((pressao, temperatura, round(razao, 4)))
  except ValueError as e:
    print(e)
  except ZeroDivisionError as e:
    print(f"{e}: A lista de temperaturas não pode ter um valor igual a 0.")
  else:
    return resultado

Mas notei uma diferença com o código do instrutor, pois meu código quando detecta um erro ele sempre retorna a mensagem designada para o erro e um None. Assim: "A lista de temperaturas não pode ter um valor igual a 0.\n None" ou "As listas tem tamanhos diferentes.\n None". Queria saber qual foi meu erro e como posso evitar isso nos meus próximos códigos.

1 resposta

Oi, Leonam! Como vai?

Seu código está bem estruturado e as validações estão corretas. Inclusive, testei chamando apenas a função (sem print) e o None não aparece.

O comportamento que você observou não é um erro na sua lógica, mas sim consequência de como funções funcionam em Python.

Quando ocorre uma exceção, sua função entra no bloco except, executa o print() com a mensagem de erro e termina sem retornar nenhum valor explicitamente. Em Python, toda função que termina sem return retorna automaticamente None.

Então, se você estiver chamando assim:

print(divide_colunas(pressoes, temperaturas))

acontece o seguinte:

  1. O print() dentro do except exibe a mensagem.
  2. A função retorna automaticamente None.
  3. O print() externo imprime esse None.

Por isso aparece:

Mensagem de erro
None

Esse None não faz parte da mensagem. Ele é apenas o valor retornado pela função.

Para evitar isso, você pode escolher entre duas abordagens:

Opção 1: não usar print() dentro da função

Deixe a função apenas calcular ou lançar exceção:

def divide_colunas(pressoes, temperaturas):
    if len(pressoes) != len(temperaturas):
        raise ValueError("As listas têm tamanhos diferentes.")
    
    resultado = []
    for pressao, temperatura in zip(pressoes, temperaturas):
        if temperatura == 0:
            raise ZeroDivisionError("Não é possível dividir por zero.")
        razao = pressao / temperatura
        resultado.append((pressao, temperatura, round(razao, 4)))
    
    return resultado

E trate o erro fora da função com try/except.

Opção 2: retornar a mensagem em vez de imprimir

def divide_colunas(pressoes, temperaturas):
    try:
        if len(pressoes) != len(temperaturas):
            raise ValueError("As listas têm tamanhos diferentes.")
        
        resultado = []
        for pressao, temperatura in zip(pressoes, temperaturas):
            if temperatura == 0:
                raise ZeroDivisionError("Não é possível dividir por zero.")
            razao = pressao / temperatura
            resultado.append((pressao, temperatura, round(razao, 4)))
        
        return resultado

    except ValueError as e:
        return str(e)

    except ZeroDivisionError as e:
        return f"{e}: A lista de temperaturas não pode ter valor 0."

Assim o print() externo exibirá apenas a mensagem, sem None.

Espero ter ajudado.

Qualquer dúvida que surgir, compartilhe no fórum. Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!