O diagrama abaixo exemplifica uma estrutura de seleção. Conforme indicado pelo nome, essa estrutura possibilita a seleção de um conjunto de ações que deve ser executado em função da verificação de uma condição, uma expressão cujo resultado deve ser um valor lógico verdade (True) ou falso (False).
Esta estrutura é classicamente conhecida como estrutura if-then-else, sendo condificada em Python como:
if <condição>:
<ações caso verdade>
else:
<ações caso falso>
Para exemplificar, considere o problema de idenfificar se um número inteiro é par ou impar. O algoritmo pode ser representado pelo diagrama abaixo, no qual a condição pressupõe que um número par é sempre divisível por 2 (resto da divisão por 2 é igual a zero), sendo impar em caso contrário.
O corresponde código Python é dado abaixo.
# Programa para verificar se um número é par ou impar
n = int(input())
if n % 2 == 0:
r = 'é par'
else:
r = 'é impar'
print(n, r)
# Esta mesma expressão pode também ser expressa como
n = int(input())
r = 'é par' if n % 2 == 0 else 'é impar'
print(n, r)
Note que em Python as <ações caso verdade> e <ações caso falso> devem obrigatoriamente ser deslocadas para a direita (em geral com o uso de tab) de forma a indicar que as ações estão sujeitas à <condiçao>. Este deslocamento é chamado de indentação de código.
Num outro exemplo, considere que uma loja ofereça 20% de desconto caso o cliente faça uma compra de valor superior ou igual a R$ 500,00. Neste caso o valor final a ser pago pelo cliente pode ser calculado conforme diagrama abaixo.
Note que não há ação a ser executada caso da condição seja falsa (o valor da compra ser inferior a R$ 500,00). Assim, não é necessário codificar a cláusula else.
# Cálculo de valor a ser pago com 20% de desconto caso a compra seja superior a R$ 500,00
valor = float(input())
if valor >= 500.0:
valor -= valor * 0.2
print(valor)
valor = valor - valor * 0.2
Considere, agora, que o cálculo do valor da seguridade social do funcionário de uma empresa é feito conforme a tabela abaixo:
Salário bruto | Porcentagem |
---|---|
Até 720,00 | 7,65 % sobre o salário bruto |
Até 1.200,00 | 9,0 % sobre o salário bruto |
Até 2.400,00 | 11,0 % sobre o salário bruto |
Acima de 2.400,00 | 11,0 % sobre 2.400,00 |
Como há 4 faixas de salário e com a estrutura IF só é possível testar um único caso, precisamos progressivamente eliminar (tratar) os casos, neste exemplo indo do primeiro para o último. O diagrama abaixo representa este cálculo.
Abaixo está uma versão em Python deste diagrama, na qual são utilizadas estruturas de seleção aninhadas.
Neste exemplo as estruturas de seleção estão aninhas à direita (no caso da condição anterior ser falsa), mas o mesmo poderia ocorrer no caso da condição ser verdade, ou seja, haver uma estrutura de selação aninhada à esquerda.
salario = float(input())
if salario <= 720:
inss = salario * 0.0765
else:
if salario <= 1200: # Se chegou aqui é porque decididamente salario > 720
inss = salario * 0.09
else:
if salario <= 2400: # Se chegou aqui é porque decididamente salario > 1200
inss = salario * 0.11
else: # Se chegou aqui é porque decididamente salario > 2400
inss = 2400 * 0.11
print(inss)
Como todas as codições estão aninhas à direita, este código pode ser reescrito em Python utilizando a estrutura if-elif-else, conforme abaixo.
salario = float(input())
if salario <= 720:
inss = salario * 0.0765
elif salario <= 1200: # Se chegou aqui é porque decididamente salario > 720
inss = salario * 0.09
elif salario <= 2400: # Se chegou aqui é porque decididamente salario > 1200
inss = salario * 0.11
else: # Se chegou aqui é porque decididamente salario > 2400
inss = 2400 * 0.11
print(inss)
Python também dispões de uma estrutra de seleção chamada de "match", que superficialmente assemelha-se à estrutura "switch" de linguagens como Java e PHP, mas com várias diferenças.
escala = input()
match escala:
case 'C':
temp = 'Celcius'
case 'K':
temp = 'Kelvin'
case 'F':
temp = 'Farenheit'
case _:
temp = 'Outra'
status = int(input())
match status:
case 300:
msg = "Erro básico"
case 400 | 401 | 402:
msg = "Erro médio"
case 500:
msg = "Erro severo"
case _:
msg = "Algum outro erro"