• Python
  • 04. Desvios Condicionais (if)
  • Introdução (if)

04. Desvios Condicionais (if)#

Nas aulas anteriores desenvolvemos programas que funcionam mais ou menos como uma linha de produção: uma série de comandos são executados um após o outro, sem opção de seguir por um caminho diferente. Você pode argumentar que o input(), visto na aula passada, permite que o programa se comporte de formas diferentes dependendo do que o usuário digitar no teclado. Mas se olharmos o programa em si, a sequência de operações executadas é sempre a mesma. Na aula de hoje veremos como desenvolver programas que, dada uma condição, executam, ou não, um determinado bloco de código.

Suponha que queremos desenvolver uma função que recebe dois números, x e y como argumento e devolve 1 se x for maior do que y e 0, caso contrário. A não ser que exista uma fórmula fechada (existe, para alguns casos), precisamos de alguma forma de executar um trecho de código somente se x for maior que y e outro trecho de código somente se essa condição não for verdadeira. Nossa função deve fazer algo parecido com o seguinte:

Esquema da função que compara x e y

Para isso vamos precisar do operador if. Vamos começar com um exemplo curto para entender como ele funciona.

Exercise 1

Teste o seguinte programa:

print('Começando o programa')

if True:
    print('Entrou no primeiro if')

if False:
    print('Entrou no segundo if')

print('Saindo do programa')

Responda qual foi a saída do terminal?

Answer

A alternativa correta é o item c.

Ao executar o programa, o primeiro print será executado imprimindo a mensagem Começando o programa no terminal.

Em seguida, o trecho de código if True é avaliado e como o valor que segue o comando if é o valor True o bloco do if é executado imprimindo a mensagem Entrou no primeiro if.

O bloco do if False não é executado, então a mensagem Entrou no segundo if não é mostrada.

E por fim, como o trecho print('Saindo do programa') não pertence ao bloco do if, então a mensagem Saindo do programa também é impressa.

O operador if#

O operador if funciona da seguinte maneira:

  • No caso de if True: o bloco do if é executado;
  • No caso de if False: o bloco do if não é executado.

Importante: o operador if sempre deve ser procedido por um valor True ou False. Mas então, para que serve o if? Ele parece bastante limitado... Para isso precisamos abrir mais um parênteses.

Exercise 2

Considere o código a seguir e responda quantos prints serão executados:

lampada_acesa = True

if lampada_acesa:
    print("Está muito claro aqui!")
    lampada_acesa = False

if lampada_acesa:
    print("Está muito claro aqui!")

Answer

Será executado somente um print.

Ao início da execução do código, a variável lampada_acesa recebe o valor True. Desta forma, o primeiro bloco if é executado e imprime a mensagem "Está muito claro aqui!". Em seguida, a variável lampada_acesa recebe o valor False.

Como a variável lampada_acesa recebeu o valor False, o segundo bloco if não será executado.

Operadores relacionais#

Exercise 3

Teste o programa a seguir:

# Testa as desigualdades.
menor = 1 < 2
print(menor)
print(1 < 2)

maior_ou_igual = 1 >= 2
print(maior_ou_igual)
print(1 >= 2)

# Isso sim é um igual e não uma atribuição.
igual = 1 == 2
print(igual)
print(1 == 2)

Exercise 4

Considere o código a seguir:

diferente = 1 != 2
print(diferente)
O que será impresso no terminal?

Answer

Será impresso True no terminal.

O seguinte trecho de código 1 != 2 está fazendo uma comparação entre os valores 1 e 2. Essa comparação está utilizando o operador relacional !=, esse operador avalia se o valor 1 é diferente do valor 2.

Ao verificar que essa comparação é verdadeira, o resultado desta comparação resultará no valor True e será armazenada na variável diferente.

Em seguida, o trecho de código print(diferente) irá imprimir o valor armazenado na variável diferente.

Exercise 5

Considere o código a seguir:

print('i' in 'Insper')
O que será impresso no terminal?

Answer

Será impresso False no terminal.

O trecho de código 'i' in 'Insper' utiliza o operador in. Este operador avalia se o caractere 'i' está presenta na string Insper.

Você pode questionar: Mas a string Insper tem o caractere i! Na verdade, dizemos que o Python é case sensitive. O que isso significa?

Significa que para o Python os caracteres 'i' e 'I' são diferentes.

Exercise 6

Considere o código a seguir:

contem_I = 'I' in 'Insper'
print(contem_I)
O que será impresso no terminal?

Answer

Será impresso True no terminal.

Agora sim! O caractere 'I' está presente na string 'Insper'.

Todas as expressões no código acima resultam em um valor booleano (True ou False). Vimos que o if só pode ser seguido de um valor booleano. Como as expressões acima resultam em um valor booleano, elas também podem ser utilizadas com o if!

Exercise 7

Das expressões abaixo, qual não resulta em um valor booleano?

Answer

A 1 + 2 não gera um valor booleano.

O trecho de código acima é uma expressão matemática que resulta no valor 3.

Exercise 8

Considere o programa a seguir. Sem testar o código, qual você espera que seja a saída no terminal?

print('Começando o programa')

if 1 >= 2:
    print('Entrou no primeiro if')

if 'I' in 'Insper':
    print('Entrou no segundo if')

print('Saindo do programa')

Answer

A alternativa correta é o item d.

Ao executar o programa, o primeiro print será executado imprimindo a mensagem Começando o programa no terminal.

Em seguida, a expressão 1 >= 2 resulta no valor booleano False. Fazendo com que o bloco do if 1 >= 2: não seja executado.

A expressão 'I' in 'Insper' resulta no valor booleano True então a mensagem Entrou no segundo if é impressa no terminal.

E por fim, como o trecho print('Saindo do programa') não pertence ao bloco do if, então a mensagem Saindo do programa também é impressa.

As expressões acima utilizam operadores relacionais para comparar valores e o resultado dessas operações sempre é um valor booleano. A tabela a seguir resume os principais operadores relacionais:

Operador Operação
== Igual
!= Diferente
> Maior
< Menor
>= Maior ou Igual
<= Menor ou Igual

Voltando para o problema inicial#

Agora podemos voltar para o problema inicial: faça uma função que recebe dois números x e y e devolve 1, caso x seja maior que y, ou zero, caso contrário.

Exercise 9

Teste o programa a seguir:

def x_maior_que_y(x, y):
        if x > y:
            resultado = 1
        return resultado

    print(x_maior_que_y(10, 5))
Qual foi o erro obtido?

Answer

Você se deparou com o erro de indentação!

O Python usa indentação para determinar como uma linha ou um trecho de código se relaciona com o resto do programa. Como visto nos exemplos anteriores, ao utilizar o desvio condicional if, utilizamos espaços em branco (indentação) para estruturar o código e sinalizar para o Python quais linhas de código devem ser executados caso a expressão do if seja verdadeira.

Exercise 10

Tente resolver o problema de indentação do código acima.

Acessar exercício

Exercise 11

Considere os trechos de código a seguir. Sem testar o código, qual trecho de código você acha que NÃO vai gerar erro de indentação?

Answer

A resposta correta é o item c.

Ao começarem a escrever códigos, vocês podem se deparar com alguns erros comuns de indentação.

No item a, podemos ver duas linhas de código que utilizam quantidades diferentes de espaços. Você pode utilizar qualquer quantidade de espaços, porém essa quantidade deve ser igual para todo o código. O comum é utilizar dois ou quatro espaços.

O item b, mostra um exemplo que não é utilizado nenhuma indentação.

E o item d, ilustra casos em que a indentação é utilizada sem necessidade. A linha do if não necessita de indentação.

Exercise 12

No exercício anterior nos deparamos com o erro de indentação. Se você chegou até aqui, isso significa que você conseguiu consertar o código. Acrescente a seguinte linha ao final do seu programa: print(x_maior_que_y(5, 10)). Teste o programa novamente.

Ao fazer a mudança você deve ter se deparado com outro erro no seu código

O Python tenta nos ajudar a identificar onde está o problema no nosso código. Em quais linhas do código parece estar o problema?

1
2
3
4
5
6
def x_maior_que_y(x, y):
    if x > y:
        resultado = 1
    return resultado

print(x_maior_que_y(5, 10))

Answer

O problema parece estar nas linhas return resultado e print(x_maior_que_y(5, 10)).

1
2
3
4
5
6
def x_maior_que_y(x, y):
    if x > y:
        resultado = 1
    return resultado

print(x_maior_que_y(5, 10))

A mensagem de erro informa que aconteceu algum erro ao executar a linha print(x_maior_que_y(5, 10)), mas parece que está tudo certo nessa linha de código. O que significa que aconteceu algum problema ao chamamos a função x_maior_que_y, indicando que o problema deve estar em algum trecho de código dentro da função.

Em seguida, a linha return resultado é apresentada como possível causa do problema que estamos tendo.

Quando um erro ocorre durante a execução do seu código, você vai se deparar com uma mensagem de erro. Essa mensagem de erro vai tentar te ajudar a encontrar a causa do problema. No nosso caso, nos deparamos com algo assim:

1
2
3
4
5
6
Traceback (most recent call last):
  File "x_maior_que_y.py", line 9, in <module>
    print(x_maior_que_y(5, 10))
  File "teste.py", line 7, in x_maior_que_y
    return resultado
UnboundLocalError: local variable 'resultado' referenced before assignment
  • As linhas 2 e 4 informam o arquivo e a linha em que o erro ocorreu.
1
2
3
4
5
6
Traceback (most recent call last):
  File "x_maior_que_y.py", line 9, in <module>
    print(x_maior_que_y(5, 10))
  File "teste.py", line 7, in x_maior_que_y
    return resultado
UnboundLocalError: local variable 'resultado' referenced before assignment
  • As linhas 3 e 5 mostram os códigos presentes nas linhas informadas.
1
2
3
4
5
6
Traceback (most recent call last):
  File "x_maior_que_y.py", line 9, in <module>
    print(x_maior_que_y(5, 10))
  File "teste.py", line 7, in x_maior_que_y
    return resultado
UnboundLocalError: local variable 'resultado' referenced before assignment
  • E na linha 6 é informado qual tipo de erro que ocorreu.
1
2
3
4
5
6
Traceback (most recent call last):
  File "x_maior_que_y.py", line 9, in <module>
    print(x_maior_que_y(5, 10))
  File "teste.py", line 7, in x_maior_que_y
    return resultado
UnboundLocalError: local variable 'resultado' referenced before assignment

Erro de variável não definida

Um erro semelhante a este deve ter ocorrido: UnboundLocalError: local variable 'resultado' referenced before assignment. Ele indica que a variável resultado foi referenciada antes de receber um valor. Antes de ler a explicação abaixo, tente identificar por conta própria por que esse erro aconteceu.

Veja explicação do erro

Os valores 5 e 10 são recebidos pela função nas variáveis x e y respectivamente.

1
2
3
4
5
6
def x_maior_que_y(x, y):
    if x > y:
        resultado = 1
    return resultado

print(x_maior_que_y(5, 10))

Na linha seguinte, x > y é avaliado como 5 > 10, ou seja, False. Nesse caso, o bloco do if não é executado e a próxima linha é return resultado, mas qual valor está guardado em resultado?

1
2
3
4
5
6
def x_maior_que_y(x, y):
    if x > y:
        resultado = 1
    return resultado

print(x_maior_que_y(5, 10))

Como a variável resultado não foi inicializada nesta execução da função, o erro UnboundLocalError ocorre.

Exercise 13

Considere os trechos de código a seguir. Qual trecho de código você acha que vai gerar erro UnboundLocalError?

Answer

O item b é o único trecho de código que vai gerar o erro UnboundLocalError, pois a função x_maior_que_zera é chamada recebendo o valor 0. Desta forma, a condição do if x > 0 é avaliada como 0 > 0. Como a expressão resulta no valor booleano False, o bloco do if não é executado e a variável resultado não é inicializada.

Se você entendeu o conteúdo desta seção, podemos ir para caso contrário (else).