1
resposta

[Projeto] Desafio: Hora da Prática - Funções

Estou fazendo os exercícios mas não tenho postado muito por aqui, hoje resolvi trazer a resolução da questão 9 que achei muito interessante.
Confesso que fiquei algum tempo pensando em como estruturar o programa antes de começar a digitar, e resisti à tentação de usar dicas da IA.
Preferi deixar as definições de variáveis fora das funções para facilitar caso eu quisesse adicionar mais cidades ou alterar o preço da gasolina, por exemplo, e não deixei fixo apenas na cidade de Salvador, deixei a opção para o usuário digitar a cidade desejada e a quantidade de dias, incluindo também o tratamento de erros de digitação. Com isso o programa ficou um pouco maior do que eu gostaria, mas acho que está aceitável.

cidades = ["Salvador", "Fortaleza", "Natal", "Aracaju"]
distancias = [850, 800, 300, 550]
passeio = [200, 400, 250, 300]
diarias = 150
gasolina = 5
consumo = 14

def gasto_hotel(dias):
    return dias * diarias

def gasto_gasolina(cidade):
    km_total = distancias[cidades.index(cidade)] * 2   # Ida e volta
    litros = km_total / consumo
    return litros * gasolina

def gasto_passeio(dias, cidade):
    return passeio[cidades.index(cidade)] * dias

def calcula_gastos(dias, cidade):
    gastos = gasto_hotel(dias) + gasto_gasolina(cidade) + gasto_passeio(dias, cidade)
    return round(gastos, 2)


cidade = input("Informe a cidade de destino: ").capitalize()
while cidade not in cidades:
    print("Cidade inválida. Tente novamente.")
    cidade = input("Informe a cidade de destino: ").capitalize()
    
while True:
    try:
        dias = int(input("Informe a quantidade de dias da viagem: "))
        if dias > 0:
            break
        else:
            print("Quantidade de dias inválida. Tente novamente.")
    except ValueError:
        print("Digite um número inteiro. Tente novamente.")

gastos = calcula_gastos(dias, cidade)
print(f"Com base nos gastos definidos, uma viagem de {dias} dias para {cidade} saindo de Recife custaria {gastos} reais")
1 resposta

Olá, Alex. Como vai?

Que entrega sensacional! É muito gratificante ver resoluções como a sua aqui no fórum. Como Analista de Segurança da Informação, você trouxe para o código duas características que fazem parte do seu DNA profissional: preocupação com a integridade dos dados (tratamento de erros) e visão de arquitetura limpa (desacoplamento de variáveis).

Resistir à tentação de pedir a resposta pronta para a IA e passar um tempo desenhando a lógica no papel antes de codar é o que realmente diferencia um programador comum de um profissional de alto nível. Esse processo de quebrar a cabeça consolida o aprendizado de uma forma que nenhuma consulta rápida consegue replicar.

O seu código ficou excelente e funciona perfeitamente! Para agregar valor ao seu post e destacar os grandes acertos da sua estrutura, fiz uma análise detalhada do seu projeto:


Os Grandes Acertos

  • Desacoplamento de Configurações (Variáveis Globais): Você mencionou que o programa ficou maior, mas o motivo é nobre e corretíssimo. Ao isolar as listas de cidades, distâncias, passeios e os custos fixos (gasolina, diarias, consumo) no topo do arquivo, você criou uma estrutura centralizada de configuração. Se o preço do combustível mudar amanhã, o usuário altera apenas uma linha no início do script, sem precisar caçar e modificar regras de cálculo dentro das funções.
  • Dinâmica com .index():
    A sacada de usar cidades.index(cidade) para mapear a posição correta nas listas paralelas de distâncias e passeios foi excelente! Isso eliminou a necessidade de criar múltiplos blocos de if/else engessados para cada destino.
  • Tratamento de Exceções e Validação de Fluxo robusta:
    O seu laço while para garantir que o usuário escolha uma cidade válida, combinado com o bloco try/except ValueError para blindar a entrada da quantidade de dias contra caracteres de texto, é uma boa prática indispensável em sistemas reais. O programa simplesmente não quebra se o usuário digitar algo errado.

Uma Pequena Correção na Indentação do while

O seu raciocínio lógico para as validações está impecável. No entanto, ao analisar a forma como os laços ficaram aninhados no final do seu script, notei um pequeno detalhe de indentação (o recuo do código) na transição entre o filtro da cidade e a captura dos dias.

Do jeito que o código foi postado, o segundo laço (while True:) ficou desalinhado para a direita, dando a entender que ele faz parte do escopo do primeiro while. Se o usuário digitar uma cidade correta de primeira, o código pula o bloco do primeiro while e pode deixar a variável dias sem definição.

Veja com o ajuste visual:

# 1. Validação da Cidade (Fica em loop até digitar uma cidade que exista na lista)
cidade = input("Informe a cidade de destino: ").capitalize()
while cidade not in cidades:
    print("Cidade inválida. Tente novamente.")
    cidade = input("Informe a cidade de destino: ").capitalize()

# 2. Validação dos Dias (Fica no mesmo nível da margem, rodando LOGO APÓS a cidade ser validada)
while True:
    try:
        dias = int(input("Informe a quantidade de dias da viagem: "))
        if dias > 0:
            break
        else:
            print("Quantidade de dias inválida. Tente novamente.")
    except ValueError:
        print("Digite um número inteiro. Tente novamente.")

Dica de Ouro para Evolução: O Poder dos Dicionários (dict)

Como você curte pensar na escalabilidade do código (facilidade para adicionar novas cidades), o próximo passo ideal na sua jornada em Python é substituir as três listas paralelas (cidades, distancias, passeio) por uma única estrutura de Dicionário.

Trabalhar com listas paralelas pode ser perigoso em projetos grandes, pois se alguém inserir uma cidade nova na lista de nomes mas esquecer de colocar a distância correspondente na outra lista, o sistema perde o alinhamento dos índices e gera um bug.

Veja como o mapeamento fica muito mais intuitivo e seguro usando chaves e valores:

# Concentramos todas as informações do destino em um único lugar
destinos = {
    "Salvador": {"distancia": 850, "passeio": 200},
    "Fortaleza": {"distancia": 800, "passeio": 400},
    "Natal": {"distancia": 300, "passeio": 250},
    "Aracaju": {"distancia": 550, "passeio": 300}
}

# Dentro da função, o acesso aos dados fica direto pelo nome da cidade:
def gasto_gasolina(cidade):
    # Buscamos a distância direto pela chave do dicionário, sem precisar de .index()
    km_total = destinos[cidade]["distancia"] * 2
    litros = km_total / consumo
    return litros * gasolina

Parabéns pela qualidade do código, Alex! É nítido que você gastou energia estruturando o pensamento antes de programar, e esse é o segredo para construir softwares seguros e resilientes. Continue compartilhando seus projetos com a comunidade!

Espero que possa ter lhe ajudado!