Modulo 006 – If – Condições em Python

 – Estrutura do if – Condições no Python

Algo muito comum e quase certo de ser utilizado em algum código que você venha a fazer, é a necessidade de definir ações baseadas em condições específicas.
Se você já usou o Excel ou já programou em outras linguagens, deve conhecer esse conceito como o SE ou IF em inglês. Essencialmente no Python é a mesma coisa, só mudando a forma como é feita.

“:” são obrigatórios ao usar o IF

Vamos olhar um exemplo aplicável. O programa deverá ler a nota do aluno. Nesse caso, NOTA =10.  Após a leitura da nota, o programa irá através do IF verificar uma condição pré-programada. Nesse caso, a condição é:
O VALOR da VARIÁVEL NOTA é MAIOR ou IGUAL a 7?
Como NOTA =10 a resposta é VERDADEIRA.

 nota=10 
 if nota>=7
     print('aprovado') 
 else
     print('não aprovado') 
___________
 aprovado 

Como a CONDICÃO é VERDADEIRA, vamos para o bloco do IF identificado pela INDENTAÇÃO. Perceba que a linha indicada está com um alinhamento diferente do IF. Isso significa que é um código que só será lido caso a condição seja atendida.
Nesse código, o programa “printará” o termo Aprovado.

Vamos agora para um caso onde a nota é 5. Assim como no primeiro caso, o Python lerá que a Variável NOTA recebe o valor 5.

 nota=
 if nota>=7
     print('aprovado') 
 else
     print('não aprovado') 
___________
 não aprovado 

Ao chegar na linha do IF, a condição será verificada. O VALOR da VARIÁVEL NOTA é MAIOR ou IGUAL a 7? Como NOTA =5 a resposta é FALSA.

Como a resposta é FALSA, perceba que o Python pulará a linha print(‘Aprovado) e irá diretamente para o caso do ELSE. O ELSE funciona como um “Nenhuma das opções
anteriores”. O que isso significa? Caso nenhuma condição tenha sido atendida, o código irá para o bloco do else. Nesse caso, o termo indentado que dará como resultado NÃO APROVADO.

– Estrutura do if – If dentro de if

Em alguns casos, temos condições que só existem caso uma condição prévia tenha sido atendida. Vamos pegar nosso exemplo anterior. Vamos dizer que ao invés de apenas “Não aprovado” também seja necessário dar um status se foi “reprovado” ou se “está de recuperação”.
Nesse caso vamos usar um if dentro do if, como no print ao lado

 nota=
 if nota>=7
     print('aprovado') 
 else
     if nota>=5
          print('não aprovado/recuperação') 
     else: 
          print('não aprovado/reprovado direto') 
___________
 não aprovado/recuperação

Perceba que usamos a indentação para diferenciarmos os 2 blocos IF que temos.
BLOCO IF EXTERNO: considera todo o código. Perceba o alinhamento do if e do else.
BLOCO IF INTERNO AO ELSE: considera todo o bloco interno. Só será lido caso a condição nota>=7 do bloco externo não seja atendida.

 A T E N Ç Ã O ! 
Diferente de outras linguagens onde é necessário “fechar” o IF, no Python isso é feito pela indentação. Perceba como o alinhamento dos blocos indica a que bloco o mesmo pertence e quando o mesmo inicia e termina.

Vamos ver esse outro exemplo. Aqui temos um erro comum que precisa ser entendido.
Perceba que foi retirado o ELSE do segundo bloco. Isso afetou diretamente o resultado, pois para o Python, a última linha do código não está vinculada ao segundo bloco. Apenas ao primeiro. Assim, ao entrar no ELSE do primeiro bloco, ele obrigatoriamente lerá o print (‘Não aprovado/Reprovado direto’) mesmo que a nota não atenda essa condição.

 nota=
 if nota>=7
     print('aprovado') 
 else
     if nota>=5
          print('não aprovado/recuperação') 
                                            
     print('não aprovado/reprovado direto') 
___________
 não aprovado/recuperação
 não aprovado/reprovado direto 

– Estrutura do if – Elif
Agora que entendemos a estrutura do IF, vamos entender um caso mais complexo onde não temos apenas 1 condição, mas 2 ou mais.

ELIF indica que existe uma nova condição a ser testada caso a condição anterior seja FALSA

Vamos avaliar o exemplo ao lado:
Nesse exemplo um bônus é calculado baseado no desempenho das vendas.
1) Caso a meta não seja atingida, não haverá bônus.
2) Caso as vendas superem a meta em 2x, o bônus é calculado por: Vendas X 7%
3) Se a meta for superada mas inferior a 2x, o bônus será calculado por : Vendas X 3%

 meta = 20000 
 vendas = 25000 
                
 if vendas < meta: 
      print ('não ganhou bônus'
 elif vendas > (meta*2): 
      bonus= 0.07*vendas 
      print ('ganhou {} de bônus'.format(bonus)) 
 else 
      bonus =  0.03 * vendas 
      print ('ganhou {} de bônus'.format(bonus)) 
______________________
 ganhou 750.0 de bônus 

Vamos avaliar o exemplo ao lado:
Primeiro testamos se a meta foi atingida. Como a condição não é atendida, pois 25000 é MAIOR que 20000, vamos para a próxima condição.

Agora é onde temos novidade! Até agora, só tínhamos visto situações onde só existia uma
condição. Nesse caso, temos mais de uma, logo, apenas o ELSE não seria suficiente para esse caso. Por isso, vamos usar ELIF + CONDIÇÃO. Como a condição não é atendida, vamos para a próxima condição.

Como nenhuma das condições anteriores foi atendida, o código entrará no bloco do ELSE. Aqui o cálculo do bônus será feito e através do método .Format vamos “printar” o resultado.

– Estrutura do if – Comparadores

Durante a descrição dos IFs anteriores, usamos alguns comparadores como MAIOR ou IGUAL, MENOR ou IGUAL, etc. Abaixo colocamos os principais comparadores para você poder usar nos seus programas sem erro!

IGUALDADE (==)

 faturamento = 100 
 custo = 200 
 #IGUAL(==) 
 if faturamento == custo: 
     print('IGUAL'
 else
     print('NÃO É IGUAL'
_____________
 NÃO É IGUAL 

DIFERENTE (!=)

 faturamento = 100 
 custo = 200 
 #DIFERENTE (!=) 
 if faturamento == custo: 
     print('É DIFERENTE'
 else
     print('NÃO É DIFERENTE'
_____________
 É DIFERENTE 

MAIOR (>)

 faturamento = 100 
 custo = 200 
 #MAIOR (>) 
 if faturamento == custo: 
     print('MAIOR'
 else
     print('NÃO É MAIOR'
_____________
 NÃO É MAIOR 

MAIOR OU IGUAL(>=)

 faturamento = 100 
 custo = 200 
 #MAIOR OU IGUAL(>=) 
 if faturamento == custo: 
     print('MAIOR OU IGUAL'
 else
     print('NÃO É MAIOR OU IGUAL'
_____________
 NÃO É MAIOR OU IGUAL 

MENOR (<)

 faturamento = 100 
 custo = 200 
  #MENOR (<) 
 if faturamento == custo: 
     print('MENOR'
 else
     print('NÃO É MENOR'
_____________
 MENOR 

MENOR OU IGUAL (<=)

 faturamento = 100 
 custo = 200 
 #MENOR OU IGUAL (<=) 
 if faturamento == custo: 
     print('MENOR OU IGUAL'
 else
     print('NÃO É MENOR OU IGUAL'
_____________
 MENOR OU IGUAL 


Além dos itens de comparação anteriores, temos também mais dois comparadores que serão muito usados: NÃO ( not ) CONTÉM (in ) 
O comparador IN permite identificar se algo existe ao menos uma vez em um texto, ou uma variável, lista, etc. Mais para frente no curso, vamos entender um pouco melhor a funcionalidade deste comparador.

CONTÉM (in )

 if '@' in 'lira@hashtgtreinamentos.com.br'
     print('NÃO TEM #'
 else
     print('TEM #'
_____________
 NÃO TEM #    

Já o comparador NOT inverte o sentido da condição. No exemplo ao lado temos como condição: SE “#” NÃO ESTIVER CONTIDO EM LIRA.... Como não há nessa string o caractere “#“, o Python entenderá que a condição É VERDADEIRA. Pode ser estranho em um primeiro momento, pois a inexistência atende à condição testada.

NÃO ( not ) 

 if not '#' in 'lira@hashtgtreinamentos.com.br'
     print('TEM @'
 else
     print('NÃO TEM @'
_____________
 TEM @    

– Estrutura do if – And e Or
Usando os conectores AND e OR podemos acrescentar mais condições a um mesmo teste.

AND

 if (primeira condição a ser atendida) and (segunda condição a ser atendida): 
     Ação a ser realizada caso a 1ª e 2 ª condições forem atendidas 
 else 
     Ação a ser realizada em todos os outros casos. São eles: 
     1)  A 1ª condição é VERDADEIRA e a 2ª FALSA; 
     2) A 1ª condição é FALSA e a 2ª VERDADEIRA; 
     3) As duas condições são FALSAS; 

OR

 if (primeira condição a ser atendida) or (segunda condição a ser atendida): 
     Ação a ser realizada caso pelo menos a 1ª ou a 2 ª condições forem atendidas. Ou seja: 
     1)  A 1ª condição é VERDADEIRA e a 2ª FALSA; 
     2) A 1ª condição é FALSA e a 2ª VERDADEIRA; 
     3) As duas condições são VERDADEIRAS; 
 else 
     Ação a ser realizada caso as duas condições sejam FALSAS; 

Vamos dar uma olhada nesse exemplo prático. Aqui o cálculo do bônus depende de 2 condições para ocorrer. Nesse caso, como usamos o AND, necessariamente as duas condições precisam ser atendidas para o pagamento do bônus.
Considerando esse caso, temos que vendas_funcionário é > meta_funcionário mas a outra condição vendas_loja > meta_loja não foi atendida. Portanto, o Python irá pular o bloco indentado da condição IF e irá para o bloco ELSE.

 meta_funcionario = 10000 
 meta_loja = 250000 
 vendas_funcionario = 15000 
 vendas_loja = 0 
                    
 if vendas_funcionario > meta_funcionario and vendas_loja > meta_loja: 
     bonus = 0.03 * vendas_funcionario 
     print('Bonus do funcionario foi de {}'.format(bonus)) 
 else
     print('Funcionario não ganhou bonus'
______________________
 Funcionario não ganhou bonus 

Vamos considerar agora que o valor de venda ao invés de 0 (exemplo anterior) passe a ser 40000. Como ambas condições do IF são VERDADEIRAS, o bônus será calculado conforme descrito no bloco indentado do IF.

 meta_funcionario = 10000 
 meta_loja = 250000 
 vendas_funcionario = 15000 
 vendas_loja = 400000 
                    
 if vendas_funcionario > meta_funcionario and vendas_loja meta_loja: 
     bonus 0.03 vendas_funcionario 
     print('Bonus do funcionario foi de {}'.format(bonus)) 
 else
     print('Funcionario não ganhou bonus'
______________________
 Bonus do funcionario foi de 450.0 

Agora vamos usar o OR: Ao contrário do AND, que precisava que ambas condições fossem verdadeiras, no OR se PELO MENOS UMA for verdadeira, a condição é atendida.
Nesse caso, como: vendas_funcionário > meta_funcionário é VERDADEIRO, o Python entende que pelo menos uma das condições foi atendida, e logo pode rodar o bloco indentado do IF.
Assim, o bônus é calculado conforme o código do bloco indentado.

 meta_funcionario = 10000 
 meta_loja = 250000 
 vendas_funcionario = 15000 
 vendas_loja = 0 
                    
 if vendas_funcionario > meta_funcionario or vendas_loja meta_loja: 
     bonus 0.03 vendas_funcionario 
     print('Bonus do funcionario foi de {}'.format(bonus)) 
 else
     print('Funcionario não ganhou bonus'
______________________
 Bonus do funcionario foi de 450.0 

Vamos considerar agora que o vendas_funcionário seja 0. Como ambas condições do IF são FALSAS, o bônus não será calculado. Assim, o Python pulará o bloco indentado do IF e irá diretamente para o bloco ELSE.

 meta_funcionario = 10000 
 meta_loja = 250000 
 vendas_funcionario = 0 
 vendas_loja = 0 
                    
 if vendas_funcionario > meta_funcionario or vendas_loja meta_loja: 
     bonus 0.03 vendas_funcionario 
     print('Bonus do funcionario foi de {}'.format(bonus)) 
 else
     print('Funcionario não ganhou bonus'
______________________
 Funcionario não ganhou bonus 

– Comparações contraintuitivas

Nessa parte, vamos te explicar algumas comparações que em um primeiro momento não são tão simples de compreender. Veja o exemplo ao lado: O Usuário não forneceu nenhum valor para as duas perguntas feitas pelo Python através da função INPUT().
Ao invés de retornar algo como vazio ou simplesmente nada, o retorno foi de um erro no código. O que torna mais estranho é que o erro está representado na linha 4 onde é feito um cálculo simples de subtração entre as variáveis faturamento e custo.
Você sabe onde está o erro???

 faturamento = input('Qual foi o faturamento da loja nesse mês?'
 custo = input('Qual foi o custo da loja nesse mês?'
  
 lucro = int(faturamento) - int(custo) 
  
 print('O lucro da loja foi de {} reais'.format(lucro)) 
_________________
 Qual foi o faturamento da loja nesse mês? 
 Qual foi o custo da loja nesse mês? 
-----------------------------------------------
 ValueError: invalid literal for int() with base 10: ' ' 

Vamos passo a passo:
O usuário não forneceu valores. Portanto, as variáveis faturamento e custo que recebem esses inputs estão com valor VAZIO. (Atenção! VAZIO é diferente de ZERO.)
Na linha 4 o lucro é calculado transformando os valores das variáveis faturamento e custo em um número inteiro e subtraindo-os. Como transformar VAZIO em um número
inteiro? Ai está o problema... O fato de não existir um valor atribuído a essas variáveis impede que o Python faça essa transformação e consequentemente o cálculo da variável LUCRO.

Temos algumas formas para casos como esses: Verificação com IF se os dois valores estão preenchidos e portanto não são vazios. 

 faturamento = input('Qual foi o faturamento da loja nesse mês?'
 custo = input('Qual foi o custo da loja nesse mês?'
  
 if faturamento!= and custo!=''
      lucro = int(faturamento) - int(custo) 
      print('O lucro da loja foi de {} reais'.format(lucro)) 
 else
      print('Algum valor não foi fornecido'
_________________
 Qual foi o faturamento da loja nesse mês? 
 Qual foi o custo da loja nesse mês? 
  Algum valor não foi fornecido 

Aqui é uma forma um pouco mais elegante do que a forma anterior e será comum ver códigos como esses.
Aqui, o faturamento e o custo sem nenhuma operação associada significam:
O valor de faturamento é não Nulo?
O valor de custo é não Nulo?

 faturamento = input('Qual foi o faturamento da loja nesse mês?'
 custo = input('Qual foi o custo da loja nesse mês?'
  
 if faturamento and custo: 
      lucro = int(faturamento) - int(custo) 
      print('O lucro da loja foi de {} reais'.format(lucro)) 
 else
      print('Algum valor não foi fornecido'
_________________
 Qual foi o faturamento da loja nesse mês? 
 Qual foi o custo da loja nesse mês? 
  Algum valor não foi fornecido 

Nenhum comentário:

Postar um comentário