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:

Para isso vamos precisar do operador if
. Vamos começar com um exemplo curto para entender como ele funciona.
Exercise 1
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 doif
é executado; - No caso de
if False:
o bloco doif
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
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
Exercise 4
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
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
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
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
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
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
Exercise 11
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
Answer
O problema parece estar nas linhas return resultado
e 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:
- As linhas 2 e 4 informam o arquivo e a linha em que o erro ocorreu.
- As linhas 3 e 5 mostram os códigos presentes nas linhas informadas.
- E na linha 6 é informado qual tipo de erro que ocorreu.
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.
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
?
Como a variável resultado
não foi inicializada nesta execução da função, o erro UnboundLocalError
ocorre.
Exercise 13
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).