– 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=5
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=6
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=6
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