6. Controle de Fluxo#

Controlar o caminho que o código segue durante a execução é chamado de controle de fluxo. Com ele, poddemos fazer nossos programas tomarem decisões e executarem blocos de código repetidamente.

Instruções Condicionais#

Em Python existem 3 tipos instruções condicionais, são elas: if, elif e else. Juntas, elas permitem que seu programa execute diferentes blocos de código com base em se uma ou mais condições são verdadeiras (True) ou falsas (False). Os operadores de comparação e lógicos que aprendemos serão cruciais aqui!

Atenção: Todas instruções condicionais seguem a regra de identação, ela diz que o bloco de código que será executado pelo condicional deve ter 4 espaços de distância da margem de onde se inicia a condicional, todos os trechos de códigos que farão parte do bloco de código deverão ter a mesma identação, caso contrário o código falha.

Instrução if#

Em resumo, executa um bloco de código se uma condição for verdadeira (True).

Sintaxe:

condicao = True
if condicao:
    # Bloco de código a ser executado se a condição for True (verdadeira)
    # Atenção à identação (geralmente 4 espaços)
    print("Condição verdadeira")
    print("Bloco de código finalizado")
Condição verdadeira
Bloco de código finalizado

Caso a condição do if tiver valor falso (False), o bloco de código não é executado e o Python passa para a próxima instrução.

Condição: Qualquer expressão que resulte em um valor booleano (True ou False)

Instrução else#

Fornece um bloco de código alternativo para ser executado se a condição do if for falsa (False).

Sintaxe:

condicao = False

if condicao:
    # Bloco de código se a condição for True
    print("Condição verdadeira")

else:
    # Bloco de código se a condição for False
    print("Condição Falsa")
Condição Falsa

Instrução elif (Else if)#

Permite verificar múltiplas condições em sequência. se uma condição if ou elif anterior for verdadeira, seu bloco de código é imediatamente executado e as elif e else subsequentes não são testadas nem executadas.

Sintaxe:

a = 100

if a > 150:
    print("A variável é maior que 150")

elif a < 150 and a > 100:
    print("O valor da variável está entre 100 e 150")

elif a == 100:
    print("O valor da variável é 100")

else:
    print("A variável é menor que 100")
O valor da variável é 100

Extra: ifs Aninhados#

É possível colocar uma estrutura if-elif-else dentro de outro bloco if, elif ou else. No entanto, tente evitar muitos níveis de aninhamento, pois podem tornar o código difícil de ler.

Frequentemente, um elif pode simplificar o que seria um if aninhado.

idade = input("Digite sua idade: ")
tem_ingresso = input("Tem ingresso? (sim/nao):").lower() # converte todas as letras para minusculas

try:

    idade = int(idade)
    if idade >= 18:

        if tem_ingresso == "sim":
            print("Pode entrar")
        else:
            print("Você é maior de idade, mas precisa de ingresso")
    
    else:
        print("Você é menor de idade, não pode entrar")
    
except ValueError:
    print("Por favor insira uma idade válida")
---------------------------------------------------------------------------
StdinNotImplementedError                  Traceback (most recent call last)
Cell In[4], line 1
----> 1 idade = input("Digite sua idade: ")
      2 tem_ingresso = input("Tem ingresso? (sim/nao):").lower() # converte todas as letras para minusculas
      4 try:

File ~/.local/lib/python3.12/site-packages/ipykernel/kernelbase.py:1274, in Kernel.raw_input(self, prompt)
   1272 if not self._allow_stdin:
   1273     msg = "raw_input was called, but this frontend does not support input requests."
-> 1274     raise StdinNotImplementedError(msg)
   1275 return self._input_request(
   1276     str(prompt),
   1277     self._parent_ident["shell"],
   1278     self.get_parent("shell"),
   1279     password=False,
   1280 )

StdinNotImplementedError: raw_input was called, but this frontend does not support input requests.

.lower() é um método de string que converte todos os caracteres para minúsculas

Laços de Repetição (Loops)#

Laços de repetição são usados para executar um bloco de código várias desde que algumas condições sejam cumpridas, podendo até mesmo gerar loops. Existem dois laços de repetição, os laços while e for, veremos mais sobre eles a seguir.

Laço While#

Ele repete um bloco de código enquanto (while) uma condição específica for verdadeira.

Sintaxe:

condicao = True

# Enquanto o valor da condição for True, faça:
while condicao:

    # Bloco de código a ser repetido enquanto a condição for True
    print("loop")

    # É crucial que algo dentro do loop possa eventualmente
    # tornar a condição False, para evitar um loop infinitoa!
    condicao = False
loop

Podemos criar condições mais específicas para que o laço while execute um certo número de vezes, até enfim parar. Veja o exemplo a seguir:

# Variável que servirá de parâmentro
contador = 5

# Enquanto o contador for maior que 0 faça:
while contador > 0:

    # Exiba o valor da contagem
    print(contador)

    contador -= 1 # Modifica a variável da condição, subtraindo-a!

# Apenas quando toda a execução do while terminar 
# é que o resto do programa poderá seguir seu fluxo normal
print("Fogo!")
5
4
3
2
1
Fogo!

Laço for#

Usado para iterar sobre os itens de uma sequência (como uma lista, tupla, string) ou qualquer outro objeto iterável.

Sintaxe:

iteravel = [1,2,3] # [1,2,3] é uma lista de itens, veremos mais sobre isso no próximo módulo

# Para cada valor na lista, faça:
for variavel_item in iteravel: 
    
    # Bloco de código executado para cada item no iterável
    print(variavel_item)
1
2
3
  • variavel_item: É uma váriavel que, a cada iteração, recebe o valor do item atual da sequência, normalmente usamos letras para referencia-los, com a letra i.

  • iteravel: A sequência ou objeto sobre o qual se está iterando.

Ao contrário do while, laços for não precisam que você sinalize dentro do código quando parar, na declaração do laço você especifica até onde ele deve ir.

OBS: Podemos até mesmo iterar sobre uma string, veja:

nome = "PYTHON"
for letra in nome:
    print(letra)
P
Y
T
H
O
N

Função range() com for Loops#

Devido ao fato da função range() gerar uma sequência imutável de números sob demanda, ela acaba sendo comumente usada em laços for para executar o bloco de código um número específico de vezes (quando você não quer iterar toda a lista ou objeto).

Podemos usá-la da seguinte forma:

Exemplos de range() sendo usado com laços for:

# imprime números de 0 a 4
for i in range(5):
    print(i)

print("*" * 10)

# imprime de 10 a 15
for i in range(10, 16):
    print(i)

print("*" * 10)

# imprime de 0 a 50 com intervalos de 10 em 10 números
for i in range(0, 51, 10):
    print(i)
0
1
2
3
4
**********
10
11
12
13
14
15
**********
0
10
20
30
40
50

Controle de Laços (break, continue, pass)#

Resumidamente, permitem alterar o fluxo normal dentro de um loop. Você irá entender melhor quando vê os próximos exemplos:

Quebra (break)#

Interrompe (quebra) a execução do laço mais interno (for ou while) imediatamente e o programa continua na próxima instrução após o loop (fora do laço de repetição).

Exemplo:

# Criando lista vazia
numeros = []

# Preenchendo a lista com números de 1 a 10
for i in range(10):
    numeros.append(i)

print(numeros)

# iterando todos os itens da lista de números
for item in numeros:

    # se número for maior ou igual a 5 faça:
    if item >= 5:
        break # Pare a execução do laço for

    print(item) # exibe valores iterados da lista
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
0
1
2
3
4

Observe que se fosse seguir a lógica padrão de um laço for, todos os valores da lista numeros deveriam ser iterados, entretanto o break quebra a execução do laço, fazendo-o não conseguir iterar todos os itens da lista.

Pule (Continue)#

Diferente do break, a instrução continue pula o restante do código dentro do bloco do loop para a iteração atual e vai diretamente para a próxima iteração, ou seja, ele não quebra a execução do laço, mas apenas pula a execução atual do loop e vai para a próxima.

Exemplo:

# números de 0 a 15
for i in range(0, 16): 

     # Se um número for par
    if i % 2 == 0:

        # Pule para a próxima iteração (não executa o print abaixo)
        continue  

    print(i) # exibe i (números impares)
1
3
5
7
9
11
13
15

Tapa-buraco (pass)#

Diferente das instruções anteriores, a instrução pass é uma operação nula, ou seja, nada acontece quando ela é executada. Ela é usada como um placeholder (marcador de lugar), ou tapa-buraco se preferir, onde a sintaxe da linguagem exige uma instrução, mas ainda não temos um código para por ali.

Exemplo:

b = [] # b é uma lista vazia (veremos mais sobre adiante)

# de 0 a 20 faça
for i in range(0,20): 

    # Pass está guardando lugar para o código que irei colocar aqui
    # É muito útil pois evita erros que apareceriam por falta de instruções aqui
    pass

O código acima garante que, ainda que eu não esteja certo a respeito do laço for, ela possa existir e ser usada no resto do meu código, sem apresentar erros.

OBS: passa pode ser usado em qualquer estrutura que execute um bloco de código, seja ela if, for ou class (ainda veremos)

Extra: Clausula else em Loops#

Tanto for quanto while podem ter uma cláusula else. Funciona assim:

  • Em um laço for, o bloco else é executado quando o laço termina todas as suas iterações normalmente (ou seja, não foi interrompido por um break). Exemplo:

numeros = [0, 2, 4, 6, 8, 10]
valor_buscado = input("Digite um número ímpar para ser buscado: ")

try:

    valor_buscado = int(valor_buscado)

    for num in numeros:

        if num == valor_buscado:
            print(f"{valor_buscado} encontrado na lista")
            break

    # Este bloco de código só será executado se o "break" NÃO for acionado
    else:
        print(f"{valor_buscado} não foi encontrado na lista")

except ValueError:
    print("Erro, valor inserido é inválido \nPor favor, use apenas números")
Erro, valor inserido é inválido 
 Por favor, use apenas números
  • Em um laço while, o bloco else é executado quando a condição do laço se torna False, ou seja, o laço termina (sem ser por um break)

contador = 0
limite = 3

# enquanto contador for menor que limite, faça:
while contador < limite:

    print(f"Contador: {contador}")
    entrada = input("Digite 'parar' para interromper ou qualquer outra coisa para continuar: ")
    
    if entrada.lower() == 'parar':
        print("Loop interrompido pelo usuário.")
        break
    
    contador += 1

# Este bloco só executa se o loop terminar porque contador < limite se tornou False
else:
    print("Loop concluído normalmente (sem 'break').")
Contador: 0
Contador: 1
Contador: 2
Loop concluído normalmente (sem 'break').

Parabéns, agora você sabe como controlar o fluxo de seus códigos, podendo usar loops ou condicionais para automações!!