Enviar um café pro programador

Mostrando postagens com marcador Testes. Mostrar todas as postagens
Mostrando postagens com marcador Testes. Mostrar todas as postagens

Estruturas Aninhadas - IF ELSE dentro de IF ELSE

No tutorial de Python anterior de nosso curso grátis, falamos em mais detalhes sobre a estrutura de controle IF e apresentamos a sua companheira ELSE.

Fizemos um programinha simples, e hackeamos ele, encontrando alguns problemas, reveja o tutorial:

IF e ELSE em Python




Corrigindo Bugs

No tutorial anterior, propomos uma questão:
O usuário deve dizer qual o maior e melhor time de futebol do mundo.
Se digitar 1, diz que é o Corinthians.
Se digitar 2, afirma que o Flamengo é tal clube.

Nosso código Python ficou assim:

print('1. Corinthians')
print('2. Flamengo')      
resposta = int (input('Qual melhor time: ') )

if resposta == 1: 
    print('Você deve ser corinthiano')
else:             
    print('Você deve torcer Flamengo')

Mas aí notamos um problema: se você digitar 3, 4, -1, 0 ou qualquer outro número que não seja 1, diz que você torce Flamengo.

Isso está errado (nada contra o Flamengo), é que se você digitou 3, 4 ou outro número, você não está escolhendo o Flamengo, então por que raios aparece que sou torcedor do Flamengo?

A resposta é simples.
Se você digitar 1, o teste condicional do IF vai dar verdadeiro e cai no print do Corinthians. Até ai ok.

Mas para qualquer outro número que digitar, vai cair no ELSE e falar do Flamengo!

Isso é um bug, uma falha. Vamos consertar!
Devemos incrementar o seguinte ao nosso programa: qualquer outro número que não seja 1 ou 2, o script deve exibir a mensagem na tela "É, você não deve ser torcedor de Corinthians o Flamengo".

Pronto, agora sim vai ficar bacana.
Vamos resolver esse bug de nosso código.




Estruturas Aninhadas - IF ELSE dentro de IF ELSE

Veja que, inicialmente, fazemos o teste no código, pra verificar se a resposta foi 1. Se sim, ok, fala do Corinthians.

Quando a resposta não for 1, devemos fazer outro teste: checar se o número digitado foi 2. Se for, exibir a mensagem do Flamengo. Se não (else), exibir a mensagem que o usuário deve torcer outro time.

E como fazer esse outro teste?
Ué, usando IF e ELSE.

A diferença é que vamos fazer esse outro teste dentro o else,
Ou seja, estamos aninhando as estruturas de controle IF e ELSE, colocando uma dentro da outra.

Nosso código vai ficar assim:

print('1. Corinthians')
print('2. Flamengo')      
resposta = int (input('Qual melhor time: ') )

if resposta == 1: 
    print('Você deve ser corinthiano')
else:             
    if resposta == 2:
        print('Você deve torcer Flamengo')
    else:
        print('Certamente você não torce Corinthians nem Flamengo')

Nossa lógica é a seguinte: Se digitar 1, ok é corintiano.
Se não for 1, vai pro ELSE e vamos fazer outro teste.
Dentro do ELSE, colocamos um IF pra testar se ele digitou 2.
Se sim, ok é flamenguista.

Se não for, cai dentro do ELSE, mas desse novo ELSE, ok?
O usuário só cai dentro desse novo ELSE se não digitar nem 1 e nem o 2.

Faz sentido, né?




Aninhar e Indentar em Python

Note algumas coisas sobre IF e ELSE
Para cada IF, temos um ELSE.
Podemos criar um IF sem um ELSE, mas não existe ELSE sem IF
Você tem sempre que alinhar o IF de seu ELSE
Se usar IF ELSE aninhado, ele deve estar abaixo e um pouco mais pra frente que o IF ou ELSE anterior

O molde de IF ELSE's aninhados é o seguinte:

if condição1:       # Primeiro IF
   [codigo]
   
   if condição2:    # Segundo IF
      [codigo]
   else:            # ELSE é do segundo IF
       [codigo]

else:               # ELSE do primeiro IF
    if condição3:
        [codigo]
    else:           # ELSE do terceiro IF
        [codigo]


Não tem limite de aninhamento.
O importante é um estar dentro (aninhado) do outro, e alinhado (indentado).
Ok ?

IF e ELSE aparecem aos pares, e o Python só vai saber a qual IF o ELSE pertence, de acordo com o alinhamento, por isso você deve deixar tudo muito bem aninhado e organizado.

Por isso que dizemos que o código Python é 'organizado', pois somos obrigados a deixar tudo bem alinhado, senão não funciona seu código.

IF e ELSE - Instrução de Teste em Python

No artigo anterior, estudamos o teste condicional IF em Python e vimos o quanto ele é útil e interessante, pois o programa pode tomar diversos rumos diferentes, de acordo com as informações que o usuário vai fornecer.

Agora vamos estudar outra instrução, a ELSE, que é usada com a IF e deixa nossos testes cada vez mais poderosos.


IF e ELSE em Python

Relembrando o último tutorial de nosso Curso de Python, a estrutura de um teste condicional IF tem a seguinte forma:

if [condition]:
    [codigo]    # Se a condição for verdadeira
    [codigo]    # o codigo indentado abaixo do if
    [codigo]    # será executado

Ou seja, se a condição [condition] for verdadeira, o código abaixo do IF, que está indentado, será executado.
Se a condição for falsa, todo esse bloco do IF é pulado e nada dessas linhas é executado.

Em outras palavras, se a condição for TRUE, o código é executado.
E é aí que entra a instrução ELSE, ela vai ficar sempre abaixo do seu IF, alinhada, e abaixo do ELSE (e indentado) teremos um outro código, que só será executado se a condição testada for FALSE.

Veja a estrutura de uma teste condicional IF ELSE:

if True:
    [codigo]    # Se a condição for verdadeira
    [codigo]    # o codigo indentado abaixo do if
    [codigo]    # será executado
else:
    [codigo]    # Este bloco de código só funciona
    [codigo]    # se a condição for falsa

Vamos ver dois exemplos.
Abra seu IDLE e teste os códigos, veja os resultados você mesmo.


Exemplo de IF e ELSE:

Em programação, o número 1 é sinônimo de verdadeiro e o 0 é sinônimo de falso. Ou seja, 1 é True e 0 é False.
if 1:
    print("Oi, estou dentro do if")
else:
    print("Eu nunca vou ser printado :( ")


O código acima vai sempre executar o IF, pois o número 1 retorna TRUE.
Lembre-se: ali depois IF é um teste, é uma condição, e testes sempre retornam verdadeiro ou falso.

Agora uma condição que retorna sempre falso:

if 0:
    print('Somente programadores podem ler isso')
else:
    print('Oi mãe, to no ELSE')


Veja que o ELSE é que é executado desta vez.


Exemplo de IF e ELSE:

Escreva um código que exiba o nome de dois times, em seguida pergunta ao usuário qual deles é o melhor.

Com a resposta em mãos, usando IF e ELSE, imprima na tela uma mensagem dizendo qual time ele torce.

Veja nosso código:

print('1. Corinthians')
print('2. Flamengo')      
resposta = int (input('Qual melhor time: ') )

if resposta == 1: 
    print('Você deve ser corinthiano')
else:             
    print('Você deve torcer Flamengo')


Perguntamos o time do usuário, e armazenamos na variável 'resposta'.
Em seguida, vamos fazer um teste com essa variável, na instrução IF.

Fizemos 'resposta == 1'.
Se o resultado desse teste for verdadeiro, cai no IF e falamos do Corinthians.
Se for falso, cai no ELSE e falamos do Flamengo.

Hackeando em Python

Uma das coisas que iremos te ensinar no decorrer de nosso curso, é hackear.
Ou seja, achar brechas, problemas e falhas em códigos.

Vamos te apresentar duas, agora.
A primeira é simples, quando o nosso programa for pegar o dado de seu teclado, digite qualquer coisa que não seja um número, como uma letra e veja  o que ocorre:

Como hackear com Python
 O erro aconteceu na função int(), que esperava receber um valor numérico e recebeu um caractere. Mais pra frente, vamos aprender como contornar isso, garantir que o dado que o usuário forneça seja o que realmente estamos desejando, senão isso pode dar brechas de seguranças em nossos programas e sistemas em Python.

O outro problema que encontramos é usando números mesmo.
Digite, por exemplo, o valor 3 ou qualquer outro que não seja 1 ou 2:
Como programar em Python
Opaaa! Pera lá!
Digitei 3 e apareceu que devo torcer Flamengo?

Por que apareceu isso?
Eu não torço nem dei a entender que queria isso como resposta, por que apareceu esta mensagem?

Você consegue identificar o motivo disso ocorrer?
No próximo tutorial de nosso módulo de Testes e Laços em Python, vamos explicar melhor isso e, claro, consertar essa falha.