Variáveis numéricas em Python

Para fazer uma calculadora de ingredientes vamos aprender sobre números fracionais (Float), arredondamento, funções, comentários e também aprenderemos a fazer refactoring, tudo isto utilizando Python.

Açúcar, Arroz e Farinha

Imagina que está preparando uma receita e as quantidades da receita são expressas em gramas mas você não possui uma balança de cozinha, possui apenas os medidores de xícaras, e agora o que fazer? E se criarmos uma calculadora de ingredientes para calcular as quantidades em xícaras para nós? (Sério, isso acontece comigo toda hora, ainda não tive coragem de comprar a balança de cozinha).

Inteiro vs Float

Antes de começarmos gostaria de introduzir um novo tipo de variável, o Float. Este termo vem da palavra floating point (pontos flutuantes). Para não gerar muita confusão na sua cabeça gostaria apenas de esclarecer que esta palavra “ponto flutuante” se refere a forma como o computador armazena números fracionais, ou seja números não inteiros. Então fica fácil lembrar:

Integer -> Int -> Números inteiros

Float -> Números fracionais

Imagina que vamos calcular qual o equivalente a 250g de arroz em xícaras. Certamente o resultado não vai ser um número inteiro de xícaras, será algo em torno de 2.11 xícaras.

Calcular a quantidade de xícaras de arroz

Para calcular a quantidade de xícaras de arroz baseado na quantidade gramas, precisamos saber quantas gramas tem uma xícara. Para o arroz, a média é de 118g. Supondo que você queira saber quantas xícaras tem em 177g, a conta seria assim:

177g / 118g = 1,5 xícara

Vamos imaginar então que temos uma variável chamada gramas que contém o valor que queremos converter, então o códido fica assim:

gramas = 177
xicaras = gramas / 118

Utilizando o mecanismo que usamos para fazer meu primeiro software podemos obter do usuário o valor das gramas que ele quer calcular. Daremos a opção de calcular arroz, açúcar e farinha, estes são os valores que vamos utilizar:

  • 1  xícara de arroz = 118g
  • 1 xícara de açúcar = 220g
  • 1 xícara de farinha = 120g
ingrediente = input("Digite o ingrediente (acucar, arroz, farinha):")
quantidade = input("Digite a quantidade (g):")

if ingrediente == "acucar":
  xicaras = int(quantidade) / 118
  print(xicaras)

if ingrediente == "açucar":
  xicaras = int(quantidade) / 220
  print(xicara)

if ingrediente == "açucar":
  xicaras = int(quantidade) / 120
  print(xicaras)

Arredondamento de números em Python

Se você executar o código acima passando o valor “acucar” e “200” verá o resultado de 1.694915254237288. Isto se dá por que a divisão não é exata então o python nos dá o valor mais próximo possível. Porém para a nossa calculadora não precisa de tantos números de precisão, creio que podemos arredondá-lo. Para isto utilizaremos a função round. Até o momento utilizamos funções com um único parâmetro por exemplo:

  • print(“texto”)
  • int(“string”)

Mas é possível passar dois parâmetros para uma mesma função, basta separá-los por vírgula. A função round recebe dois parâmetros, o primeiro é o numero que você quer arredondar e o segundo é a quantidade de dígitos que você quer:

arredondado = round(1.694915254237288, 1)
# resultado: 1,7

arredondado = round(1.694915254237288, 2)
# resultado: 1,69

Para este caso da calculadora de ingredientes podemos utilizar apenas um dígito, então o código do cálculo fica assim:

ingrediente = input("Digite o ingrediente (acucar, arroz, farinha):")
quantidade = input("Digite a quantidade (g):")

if ingrediente == "acucar":
  xicaras = int(quantidade) / 118
  xicaras = round(xicaras, 1)
  print(xicaras)

if ingrediente == "açucar":
  xicaras = int(quantidade) / 220
  xicaras = round(xicaras, 1)
  print(xicaras)

if ingrediente == "açucar":
  xicaras = int(quantidade) / 120
  xicaras = round(xicaras, 1)
  print(xicaras)

A primeira coisa a se notar nesse código é o trecho xicaras = round(xicaras, 1). O que estão acontecendo nele? Como comentamos, uma variável pode mudar de valor durante a execução do programa por tanto podemos atualizar o valor da variável xícara com o resultado da função round.

Funções

A outra observação que podemos fazer é que tem muito código repetido, não será possível fazer isto de forma diferente? Sim! É possível, e para isto que servem as funções. Nós podemos definir nossas próprias funções e reutilizá-las no nosso código. Isto nos traz alguns benefícios:

  • Reutilização de código (escreva uma vez e reutilize em diversos pontos)
  • Organização do código (quanto menos código, mais fácil e claro de ler)
  • Correções em um único ponto (se há algum problema você só precisa corrigir a função e todo o resto do código que utiliza ela vai se beneficiar da correção)

Para definir uma função utilizamos a palavra def, veja abaixo um exemplo de uma função com dois parâmetros em Python:

def nome_da_funcao(parametro1, parametro2):
	corpo da função

Muito simples, não? Uma das possibilidades das funções é que elas podem retornar valores, quando queremos retornar um valor utilizamos a palavra return. Veja abaixo como criamos a função que converte açúcar:

# definição da função
def converter_acucar(gramas):
	xicaras = gramas / 118
    xicaras = round(xicaras, 1)
    return xicaras
    
# utilização da função
x = converter_acucar(200)
print(x)

Importante: a definição da função deve estar antes da utilização da função no código.  

Você notou o que alguns código de exemplo tem o caractere # na frente? Ele serve para fazer um comentário no código, tudo que vem depois do # é ignorado pelo código, é uma maneira de deixarmos algumas documentações no código que podem auxiliar outros programadores que verão seu código no futuro ou até mesmo você sobre pontos importantes ou regras que queira comentar.

Se reescrevermos nosso código anterior para utilizar funções o código fica assim:

def calcular_arroz(gramas):
  xicaras = gramas / 180
  xicaras = round(xicaras, 1)
  return xicaras

def calcular_acucar(gramas):  
  xicaras = gramas / 118
  xicaras = round(xicaras, 1)
  return xicaras

def calcular_farinha(gramas):
  xicaras = gramas / 185
  xicaras = round(xicaras, 1)
  return xicaras

ingrediente = input("Digite o ingrediente (acucar, arroz, farinha):")
quantidade = input("Digite a quantidade (g):")

if ingrediente == "arroz":
  xicaras = calcular_arroz(int(quantidade))
  print(xicaras)

if ingrediente == "acucar":
  xicaras = calcular_acucar(int(quantidade))
  print(xicaras)

if ingrediente == "farinha":
  xicaras = calcular_farinha(int(quantidade))
  print(xicaras)

O código ficou mais limpo e fácil de entender, não?

Refatoração (Refactoring)

Mas tem algo me incomodando neste código, parece que as 3 diferentes funções que criamos são exatamente iguais, exceto pela diferença da quantidade de gramas que uma xícara possui. E se fizéssemos uma função única que recebe essa quantidade por parâmetro também?

Muito bem! Este processo de analisar o código, identificar possíveis melhorias e reescrevê-lo de outra forma, chamamos de refactoring também chamado refatoração em português (é mais comum utilizarmos o termo em inglês). Neste caso identificamos que 3 funções diferentes podem ser transformadas em uma única função com uma pequena alteração:

# calcula a quantidade de xícaras equivalente a uma quantidade de gramas
# quantidade - quantidade de gramas que quer converter
# gramas_por_xicara - quantidade de gramas presente em uma xícara
def calcular_xicaras(quantidade, gramas_por_xicara):  
  xicaras = quantidade / gramas_por_xicara
  xicaras = round(xicaras, 1)
  return xicaras

Note que alteramos também o nome do primeiro parâmetro para ficar mais claro qual seu objetivo. Também escrevemos uma pequena documentação de como utilizar a função para referência futura.

Se alterarmos o código para utilizar a função acima fica assim:

# calcula a quantidade de xícaras equivalente a uma quantidade de gramas
# quantidade - quantidade de gramas que quer converter
# gramas_por_xicara - quantidade de gramas presente em uma xícara
def calcular_xicaras(quantidade, gramas_por_xicara):  
  xicaras = quantidade / gramas_por_xicara
  xicaras = round(xicaras, 1)
  return xicaras

print("===========================")
print("Calculadora de Ingredientes")
print("===========================")

ingrediente = input("Digite o ingrediente (acucar, arroz, farinha):")
quantidade = input("Digite a quantidade (g):")

if ingrediente == "arroz":
  xicaras = calcular_xicaras(int(quantidade), 180)
  print(xicaras)

if ingrediente == "acucar":
  xicaras = calcular_acucar(int(quantidade), 118)
  print(xicaras)

if ingrediente == "farinha":
  xicaras = calcular_farinha(int(quantidade), 185)
  print(xicaras)

Menos código que faz exatamente a mesma coisa, legal não? Eu deixei a definição da função bem no início de tudo para separar a parte da calculadora e a parte da função de apoio, mas não precisa ser assim, o único ponto importante é que a definição da função deve ser feita antes de qualquer referência para ela no código.

Espero que tenham gostado desta calculadora! Se não entenderam tudo, revisem o conteúdo desde o início na página Curso de Lógica de Programação.

Solução final: https://repl.it/@julianajuliano/CalculadoraDeIngredientes