Como Usar Declarações Condicionais if/else/elif em Python?

Um if é usado em um programa para testar se uma condição lógica é verdadeira. Se for, o bloco de código seguinte ao if é executado. Mas se a condição for falsa, o fluxo do programa é desviado para o bloco de código do else. Além disso, na linguagem Python é possível encadear diversos testes diferentes em uma mesma estrutura, usando elif.

Nesse post eu explico cada ponto dessa definição usando exemplos, para ficar mais fácil de entender.

Para Que Serve um if em um Programa?

Há um ditado popular entre programadores que diz: “O computador não faz o que você quer, ele faz o que você manda.

Apesar do tom de brincadeira, essa afirmação está 100% correta.

No meu post sobre o uso de operadores em Python, eu explico que os operadores lógicos e relacionais são usados para controlar o fluxo de execução do programa, porque retornam os valores booleanos True e False.

No entanto, os operadores sozinhos não podem alterar a sequência de execução das instruções em um programa.

A execução de um programa é sequencial, linha após linha, mas o programador pode usar algumas declarações para desviar esse fluxo padrão. Uma das maneiras de fazer isso é com um if.

Um if é só uma estrutura para tomada de decisão.

É semelhante à maneira como você toma decisões na vida: “Se fizer sol amanhã, eu vou à praia. Senão, vou ao cinema.

Em um programa, um exemplo semelhante a esse seria: “Se (if) a média do aluno no semestre for maior ou igual a sete, o aluno está aprovado. Senão (else), está reprovado.

Veja a seguir como usar a declaração condicional if/else/elif em Python.

Qual é a Sintaxe da Declaração Condicional if/else/elif em Python?

if condicao: # Código executado se a condição for verdadeira. else: # Código executado se a condição for falsa # Código fora do if # Exemplo if media >= 7: situacao = 'Aprovado' else: situacao = 'Reprovado' print(situacao)
Sintaxe da Declaração Condicional if-elif-else em Python
Sintaxe da Declaração Condicional if-elif-else em Python

Antes de conhecer os detalhes da sintaxe do if em Python, é preciso entender o conceito de bloco de código em um programa.

Em linguagens baseadas em C, como JavaScript, Java ou C#, um bloco de código é um conjunto de instruções simples delimitados por chaves “{}”.

Em Python, os blocos de código não são delimitados por chaves, mas pela indentação do código. Isso significa que tudo que estiver recuado em 4 espaços está dentro do bloco.

Eu sugiro que você execute o código Python mostrado nesse post no Jupyter Lab para treinar.

O Jupyter Lab é uma ferramenta ótima para começar a programar e deve fazer parte da sua lista de ferramentas como programador.

Se você ainda não tem o Jupyter Lab instalado, dá uma olhada nesse post onde eu explico o passo-a-passo para a instalação.

Veja um exemplo a seguir. Não se preocupe se você não entender toda a sintaxe, só preste atenção na forma como os blocos funcionam.

def bateuMeta(totalVendas, metaBimestral): # Definição de uma função print(f'Total de vendas: {totalVendas}') # Início do bloco da função if totalVendas >= metaBimestral: metaBimestral *= 2 # Início do bloco if situacao = 'Parabéns' bonus = 100 # Fim do bloco if else: situacao = 'Continue se esforçando' # Início do bloco else bonus = 10 # Fim do bloco else return (situacao, bonus) # Fim do bloco da função bateuMeta print(bateuMeta(1_000_000, 1_500_000)) # Mesmo nível da função

Como você deve ter percebido no exemplo acima, blocos podem conter linhas de código ou outros blocos.

Agora que você sabe como funciona um bloco de código, veja em detalhes a sintaxe do bloco if:

if condicao: # (1) Código executado se a condição for verdadeira. else: # (2) Código executado se a condição for falsa # (3) Código fora do if

Seguindo a lógica dos blocos de código que você viu no exemplo anterior, todo o código que está recuado faz parte do bloco if.

A declaração if é avaliada da seguinte maneira:

Se a condição for verdadeira, o bloco entre o if e o else (1) é executado. Depois disso, o fluxo do programa segue para fora do if (3), sem executar o bloco else (2).

Se a condição for falsa, o bloco if (1) não é executado. O fluxo do programa é desviado para o bloco else (2) e depois segue o fluxo normal para fora do if (3).

Como o bloco else é opcional, caso ele não exista e a condição seja falsa, nenhum código dentro do if (1) é executado. Veja mais alguns exemplos:

chovendo = True # 1o exemplo - Declaração if SEM else if chovendo: print('Cuidado com o trânsito.') chovendo = False # 2º exemplo - Declaração if COM else if chovendo: print('Fique em casa.') else: print('Aproveite a praia.') print('Não esqueça do almoço.')

No primeiro exemplo acima, só há um teste para saber se a variável chovendo é verdadeira. Nesse caso, é emitido um alerta. Perceba que o programa não tem um comportamento para quando não está chovendo.

Já no segundo exemplo, há uma decisão baseada no valor da variável chovendo. Se estiver chovendo, o programa alerta para ficar em casa. Se não estiver, a mensagem diz para aproveitar a praia.

Atenção para a importância da indentação correta. Uma expressão que deveria ser executada depois de todo o bloco if pode ficar contida no bloco else, caso a indentação esteja errada.

Assim como em todos os exemplos vistos até agora, esse último só tem uma expressão na condição do if, que é chovendo == True.

Nos exemplos a seguir, você vai ver que uma condição pode ter várias expressões, separadas pelos operadores lógicos and ou or. Perceba que isso não muda o bloco else.

if chovendo or diaDeSemana or saldo < 0: print('Nada de praia.') if (totalVendas >= metaBimestral) and \ # Usar \ para continuar o if na próxima linha (totalVendas > totalVendasAnterior): metaBimestral *= 2 situacao = 'Parabéns' bonus = 100 else: situacao = 'Continue se esforçando' bonus = 10 if ((totalVendas >= metaBimestral) and \ (totalVendas > totalVendasAnterior)) or \ (totalVendas > totalVendasAnterior * 4): # Se bateu a meta OU vendeu 4x mais metaBimestral *= 2 situacao = 'Parabéns' bonus = 100

Não é preciso usar parênteses em volta da condição, mas é uma boa prática fazer isso se você tiver mais de uma expressão, pois a ordem de precedência dos operadores fica mais clara.

Lembre-se: quanto mais legível for o seu código, melhor.

Quando você está aprendendo a programar, é comum expressar o fluxo do código através de diagramas, onde entradas e saídas são representadas por trapézios, instruções simples são representadas por retângulos e decisões por losangos.

Figura 1 - Fluxograma mostrando um ponto de decisão
Figura 1 – Fluxograma mostrando um ponto de decisão

Assim fica mais fácil de entender todo o caminho que o programa pode percorrer.

De forma resumida, cada elemento do fluxograma pode ter várias linhas chegando a ele, o que significa que o fluxo de execução pode chegar até aquela instrução por caminhos diferentes.

As instruções simples (retângulos) só têm uma saída, para a próxima instrução. Já as decisões (losangos) têm duas saídas, uma quando a condição for verdadeira e outra quando a condição for falsa.

Mas e se eu quiser testar várias condições e executar um bloco de código para cada uma?

Isso pode acontecer, por exemplo, se eu quiser executar um bloco de código diferente dependendo do dia da semana (segunda-feira, terça-feira, quarta-feira…).

Como colocar todas essas condições em um if?

Na próxima seção eu explico como fazer isso.

Python tem switch case?

Não. As linguagens baseadas em C têm uma declaração condicional chamada switch, que compara uma variável com diversas constantes e executa o bloco de código para o qual os valores da variável e da constante são iguais. A linguagem Python não tem uma estrutura switch, mas é possível usar a declaração condicional elif com uma nova condição após o if.

Nos exemplos abaixo, a variável diaSemana é comparada com 0 no if, para determinar se é segunda-feira.

diaSemana = int(input('Qual é o dia da semana? (0-6) ')) if diaSemana == 0: # Segunda-feira print('Segunda-feira') else: # Terça-feira a domingo print('Outro dia.')

Se for usado somente o bloco else, só é possível testar se a variável diaSemana contém qualquer outro valor diferente de zero, o que significaria os dias de terça-feira a domingo.

Para testar outros valores para essa variável (1, 2, 3…) seria necessário usar novos ifs dentro do else.

diaSemana = int(input('Qual é o dia da semana? (0-6) ')) if diaSemana == 0: # Segunda-feira print('Segunda-feira') else: # Terça-feira a domingo if diaSemana == 1: # Terça-feira print('Terça-feira') else: # Quarta-feira a domingo print('Outro dia.')

Nesse caso as declarações if estão aninhadas.

O problema aqui é bem claro. Se você usar esse método para testar todos os dias da semana, o seu código terá nada menos que seis níveis de ifs.

Agora imagine que você quisesse testar todos os dias do mês. Você faria uma estrutura com trinta níveis de ifs aninhados?

Com certeza não…

Para resolver esse problema, é usada a declaração elif. Ela funciona como um else seguido de um novo if, mas no mesmo nível de indentação do if original.

diaSemana = int(input('Qual é o dia da semana? (0-6) ')) if diaSemana == 0: # Segunda-feira print('Segunda-feira') elif diaSemana == 1: # Terça-feira print('Terça-feira') elif diaSemana == 2: # Quarta-feira print('Quarta-feira') else: # Quinta-feira a domingo print('Outro dia.')

Nesse exemplo as declarações estão encadeadas. Veja que fica mais fácil de entender o código dessa forma.

Agora que você já entendeu como funciona a declaração condicional if/else/elif em Python, vou mostrar um exemplo mais avançado.

Para testar diferentes condições sem precisar ficar digitando toda hora o valor da variável testada, vou usar uma função geradora de números aleatórios.

Dessa forma é possível executar o mesmo código diversas vezes sem alterar nada e obter resultados diferentes a cada execução.

No exemplo a seguir, a função randn() do módulo numpy.random é usada para gerar um número aleatório da distribuição normal padrão. O resultado do teste desse número é inicializado com o valor None, ou seja, nulo.

A seguir, o código usa a declaração if para saber se o número gerado é maior ou igual a 1, se está entre -1 e 1, ou se é menor ou igual a -1.

from numpy.random import randn numero = randn() # Número aleatório resultado = None if numero >= 1: resultado = 'Número maior ou igual a 1.' elif -1 < numero < 1: # Mesmo que (numero > -1) and (numero < 1) resultado = 'Número entre -1 e 1.' else: resultado = 'Número menor ou igual a -1.' print(numero) print(resultado)

Após o teste, o valor do número e o resultado são impressos.

Execute esse código diversas vezes e veja o resultado variando conforme o valor do número muda.

Como Funciona o Operador Ternário em Python

O operador ternário em Python tem a forma:
<operando1> if <expressão> else <operando2>
Isso significa que o <operando1> é retornado se a <expressão> for True e o <operando2> é retornado se ela for False. Na prática, o operador ternário é um if/else escrito em uma linha só, sem indentação.

a = 10 b = 0 0 if b == 0 else a / b # Resultado: 0 # O 1o operando é zero, o 2o é a condição (b == 0) e o 3o é (a / b). # Se a condição for falsa, a expressão do 3o operando não é executada. # Isso evita o erro de divisão por zero. b = 5 0 if b == 0 else a / b # Resultado: 2.0

Como é um operador ternário, ou seja, tem três operandos, não é possível usar elif.

A seguir, eu mostro algumas dicas de como escrever declarações if/else/elif de forma mais simples.

Como Otimizar o Uso de if/else/elif

Lembra da definição lá em cima, onde eu digo que o Python sempre testa se a condição no if é verdadeira?

Por causa disso, não é necessário comparar o resultado da expressão testada no if com True.

Veja esse exemplo:

if (x - 1 == 0) == True: # Parênteses para indicar a ordem de execução # Código

Essa forma funciona, mas é desnecessária.

Você sempre deve ter em mente que o código dentro do if vai ser executado se a condição retornar True.

if x - 1 == 0: # Parênteses para indicar a ordem de execução # Código

Nesse caso, quando x é igual a 1, essa expressão relacional retorna True e o código do if é executado.

Mas, na verdade, também não é necessário testar se o resultado da expressão é igual a zero.

Por quê?

Porque se x – 1 retornar o valor zero, a expressão será avaliada como False. Como você quer que o resultado da expressão seja verdadeiro, para que o bloco if seja executado, basta inverter o valor lógico com o operador not.

Então isso equivaleria a testar se o resultado de x – 1 não é falso, ou seja, o código pode ser escrito dessa forma:

if not x - 1: # Código

Então agora você já sabe: quando quiser comparar se uma expressão tem ou não algum valor exato, reduza o cálculo da expressão a zero e use apenas operadores lógicos.

E da próxima vez que alguém perguntar se precisa saber matemática para ser programador, você já sabe a resposta…

Veja outro exemplo:

if x – 1 == 28: # Código # Se x – 1 == 28, então x – 29 == 0. # Logo, o if acima pode ser escrito assim: if not x – 29: # Código # Da mesma forma se a expressão usar != com um valor exato. if x – 1 != 28: # Código # Pode ser escrito: if x – 29: # Código

Isso também serve para coleções e strings vazias:

x = '' # Desnecessário: if x == '': print('Vazio.') # Mais simples: if not x: print('Vazio.') lista = [] # Desnecessário: if lista == []: print('Vazio.') # Mais simples: if not lista: print('Vazio.')

Na prática, se você estiver utilizando operadores aritméticos e comparando variáveis com valores numéricos, como no exemplo x – 1 == 0, essa simplificação não torna a execução do programa mais rápida.

O interpretador Python é capaz de identificar essa sintaxe a mais e gerar código otimizado.

Ainda assim, usando a forma mais simples possível, o seu código fica mais legível.

No entanto, se você estiver trabalhando com strings e coleções, como nos exemplos acima, a versão mais extensa é mais lenta, já que o interpretador Python precisa criar o objeto vazio '' ou [] antes de fazer a comparação.

A performance é ainda pior se você usar alguma função de contagem para determinar se o tamanho da coleção é igual a zero, por exemplo.

if len(lista) == 0: print('Vazio.')

Se você quiser, pode testar os resultados no Jupyter Lab usando o comando %%timeit.

Figura 2 - Teste do tempo de execução do if no Jupyter Lab
Figura 2 – Teste do tempo de execução do if no Jupyter Lab

O teste acima mostrou que a versão usando a função len() é quase três vezes mais lenta.

Conclusão

A declaração condicional if/else/elif é uma estrutura de controle de fluxo de execução do programa que avalia o resultado de testes lógicos.

Apesar da semelhança com outras linguagens, a sintaxe do bloco if em Python inclui a declaração elif, que permite avaliar uma nova condição dentro do mesmo if.

Além da sintaxe da declaração if/else/elif, nesse post você viu que é importante pensar como as condições são avaliadas e usar simplificações para que o seu código fique mais fácil de ler.

E então? Ficou mais fácil entender como funciona essa estrutura tão importante na programação? Comente o que você achou e não esqueça de dizer aqui embaixo como eu posso melhorar esse post!

Guilherme Brügger D Amato - Audiência Pública na Comissão Senado do Futuro

Guilherme Brügger D’Amato é servidor concursado de TI na Câmara dos Deputados, onde ocupou o cargo de Diretor de Informática entre 2015 e 2016. Com mais de 25 anos de experiência como programador e executivo de TI, já desenvolveu sites e sistemas usados por dezenas de milhões de pessoas. Conecte-se com ele no LinkedIn.

Deixe um comentário