Olá Luísa.
Tudo bem?
Sua abordagem está ótima mas há alguns pontos que merecem atenção.
A parte do .replace(",", ".") funciona bem para um contexto simples de estudo, mas existe uma pequena inconsistência conceitual: você está “corrigindo” a entrada antes de validar se ela realmente é um número válido.
O replace() apenas troca caracteres, ele não valida nada.
Exemplo:
"70,5" -> "70.5"
funciona corretamente.
Mas:
"1,2,3" -> "1.2.3"
continua inválido e o erro só aparece no float().
Isso não quebra o código porque o try/except captura o ValueError, então para um ambiente básico está aceitável.
A inconsistência é mais lógica do que funcional.
Outro detalhe é que você faz:
peso = float(peso_input)
altura = float(altura_input)
antes da validação:
if peso <= 0 or altura <= 0:
Isso não é exatamente errado, porque primeiro você precisa transformar a string em número para poder comparar com 0.
Porém, existe uma pequena inconsistência na organização do fluxo: a validação depende da conversão, mas ambas estão misturadas dentro do mesmo try.
O problema didático aqui é que o try parece estar tratando também a validação lógica, quando na verdade ele só existe por causa do float().
Além disso, se o objetivo é clareza, o ideal seria deixar explícito que:
- o
try serve apenas para conversão; - a validação vem depois.
Seu código atual:
try:
peso = float(peso_input)
altura = float(altura_input)
if peso <= 0 or altura <= 0:
print(...)
mistura:
- conversão;
- validação;
- regra de negócio.
Uma forma mais organizada seria:
try:
peso = float(peso_input)
altura = float(altura_input)
except ValueError:
print("ERRO: Digite apenas números.")
else:
if peso <= 0 or altura <= 0:
print("ERRO: Peso e altura devem ser maiores que zero.")
Isso deixa o fluxo mais coerente e didático.
Outra inconsistência é que sua função:
calculando_imc()
não valida nada internamente.
Então o programa depende totalmente da validação externa para não ocorrer divisão por zero.
Em um sistema real isso seria uma má prática, porque funções deveriam ser mais protegidas.
Mas para estudo básico isso ainda é aceitável.
Também há uma pequena má prática de nomenclatura:
calculando_imc
soa como ação em andamento.
O padrão em Python normalmente seria:
calcular_imc
porque funções representam ações.
Erros fazem parte do aprendizado, não se preocupe.
Eles que nos ajudam a entender melhor o que está acontecendo por trás do código e a fortalecer o conhecimento com mais consistência ao longo do tempo. O importante é continuar praticando e observando esses detalhes com calma, porque é assim que a evolução acontece de forma natural.
Se surgir qualquer dúvida, pode me avisar.
Bons estudos.