Estruturas de Seleção em Python - #07
Tags: beginners, programming, python, tutorial
Published: 2022-05-02 07:04:20

{% youtube https://youtu.be/RAkl5Eqw1zc %}

## Introdução

Estruturas de seleção ampliam a nossa capacidade de desenvolver algoritmos mais sofisticados, até então, desenvolvemos algoritmos que se assemelham a uma calculadora matemática mais refinada.

Problemas que envolvem questões como, por exemplo: 
*  verificar se o valor digitado pelo usuário está correto, como um _login_ e senha;
* calcular bônus salarial, se o empregado possuir mais que 3 anos de empresa o bônus será de 15% e para funcionários com menor tempo de empresa será somente de 10%;
* calcular desconto de produtos em situações em que casais com mais de dois filhos possuem desconto na compra de produtos.

Situações que envolvem análise de condições, provavelmente exigirá o uso de estruturas de seleção. 

Neste capítulo aprenderemos as estruturas de seleção presentes na linguagem _Python_.

## Sintaxes

Vamos começar implementando o seguinte algoritmo: leia o valor de duas notas de prova, se a média for maior ou igual a 7.0, informe que o aluno foi aprovado, senão o aluno deverá fazer a prova final.

Podemos usar o seguinte código **_media.py_**:

```python
#Programa - media.py
print("Digite a nota 1: ")
nota1 = float(input())

print("Digite a nota 2: ")
nota2 = float(input())

media = (nota1 + nota2) / 2

if media >= 7.0 :
    print("O aluno foi aprovado com media " + str(media))
else :
    print(f"O aluno obteve a media {str(media)}, deve fazer a prova final")
```

Nas linhas 01 e 02 lemos do teclado e convertemos para um número de ponto flutuante, a primeira nota. E nas linhas 04 e 05 o valor da segunda nota.

Calcula-se a média na linha 07 e armazena-se na variável **media**.

O uso da estrutura de repetição **_if_** está ilustrado entre as linhas 09 e 12. Se (**if**) a media for maior igual a 7.0, vamos imprimir que o aluno foi aprovado, senão (**else**), indicaremos que ele precisará fazer a prova final. 

Na linha 09 usamos a sintaxe **_if (&lt;condição>) :_**, e as instruções na linha após os dois pontos e espaçadas para a direita, serão executadas se a **condição** for satisfeita. Caso contrário, temos a cláusula **_else_**, que especifica o código a ser executado se a **condição** no **if** não for satisfeita ou verdadeira.

```
#Exemplo - execução de media.py e o aluno sendo aprovado
Digite a nota 1: 
6.5
Digite a nota 2: 
7.5
O aluno foi aprovado com media 7.0
```
```
#Exemplo - execução de media.py e o aluno não sendo aprovado
Digite a nota 1: 
6.66
Digite a nota 2: 
7.0
O aluno obteve a media 6.83, deve fazer a prova final
```

Indicar se a condição foi satisfeita é verificar se o valor dela é **verdadeiro**, ou seja, pode ser representado por um **booleano**.

### Sintaxe _if_

A sintaxe da seleção simples consiste de:
* palavra reservada _if_
* uma _condição_ ou _expressão booleana_
* dois pontos (_:_)
* bloco de código a ser executado se a _condição_ é **_True_**

```python
#Sintaxe if
if condição :
    instruções
```

Veja como identificar se um número é par, utilizando a sintaxe _if_:

```python
#Algoritmo - número par
print("Digite um numero: ")
num = int(input())
if num % 2 == 0 :
    print("O numero " + str(num) + " eh par")
```

Condição para um número ser par: o resto da divisão por 2 é zero, ou, é múltiplo de 2.

### Sintaxe _else_

A cláusula **_else_** não possui **condição**, ela sempre acompanha um **_if_**.

Em sua sintaxe:
* palavra reservada _else_
* dois pontos (_:_)
* bloco de código a ser executado se a _condição_ **_if_** é **_False_**.

```
#Seleção if-else
if condição :
    instruções
else :
    instruções
```

Alterando o algoritmo anterior para imprimir se um número é par ou ímpar:

```python
#Algoritmo - número par ou ímpar
print("Digite um numero: ")
num = int(input())
if num % 2 == 0 :
    print("O numero " + str(num) + " eh par")
else:
    print("O numero " + str(num) + " eh impar")
```

### Sintaxe _elif_

A cláusula **_elif_** permite usar condicionais e é verificado somente se as condições anteriores forem falsas. Sua sintaxe contem:
* palavra reservada **_elif_**
* uma _condição_ ou _expressão booleana_
* dois pontos (_:_)
* bloco de código a ser executado se a _condição_ **_elif_** é **_True_**.

Algoritmo para verificar se um número é múltiplo de 2, ou de 3 ou de 5:

```python
#Algoritmo - múltiplo de 2, 3, 5
print("Digite um numero: ")
num = int(input())
if num % 2 == 0 :
    print("O numero " + str(num) + " eh multiplo de 2")
elif num % 3 == 0:
    print("O numero " + str(num) + " eh multiplo de 3")
elif num % 5 == 0:
    print("O numero " + str(num) + " eh multiplo de 5")
```

Podemos utilizar **_if_**, **_elif_** e **_else_** em uma mesma instrução condicional, como:

```python
#Algoritmo - múltiplo de 2, 3, 5 ou outro
print("Digite um numero: ")
num = int(input())
if num % 2 == 0 :
    print("O numero " + str(num) + " eh multiplo de 2")
elif num % 3 == 0:
    print("O numero " + str(num) + " eh multiplo de 3")
elif num % 5 == 0:
    print("O numero " + str(num) + " eh multiplo de 5")
else
    print("O numero " + str(num) + " nao eh multiplo de 2, 3, 5")
```

Veja outros exemplos, como escrever um algoritmo que recebe 3 números e identifica o maior de todos?

```python
#Programa 03.2 - maxOf3.py
print("Digite o valor 1: ")
valor1 = int(input())

print("Digite o valor 2: ")
valor2 = int(input())

print("Digite o valor 3: ")
valor3 = int(input())

if (valor1 >= valor2):
    if (valor1 >= valor3):
        print(f"O valor {valor1} eh maior de todos")
    else:
        print(f"O valor {valor3} eh maior de todos")
else:
    if (valor2 >= valor3):
        print(f"O valor {valor2} eh maior de todos")
    else:
        print(f"O valor {valor3} eh maior de todos")
```

Como se pode observar no código acima, podemos utilizar _if_ dentro de _if_, o que denominamos de _if aninhados_. Dentro de um _if_ é possível escrever qualquer instrução válida. 

Podemos simplificar um pouco o programa acima, e gerar uma outra versão, fazendo uso do operador **and**.

```python
#Programa 03.2 - maxOf3V2.py
print("Digite o valor 1: ")
valor1 = int(input())

print("Digite o valor 2: ")
valor2 = int(input())

print("Digite o valor 3: ")
valor3 = int(input())

if (valor1 >= valor2 and valor1 >= valor3):
    print(f"O valor {valor1} eh maior de todos")

if (valor2 >= valor1 and valor2 >= valor3):
    print(f"O valor {valor2} eh maior de todos")

if (valor3 >= valor1 and valor3 >= valor2):
    print(f"O valor {valor3} eh maior de todos")
```

## Erros comuns

A identação usada, os 4 espaços, para reconhecer um bloco de código deve ser respeitada. A linguagem _Python_ não aceita identações que fujam a este padrão.

```python
#Erro de identação usando shell
>>> idade = 20
>>> if idade > 20:
...     print("Idade maior que 20")
...       print("Fora de identação")
  File "<stdin>", line 3
    print("Fora de identação")
                              ^
IndentationError: unindent does not match any outer indentation level
```