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
ouFalse
)
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: if
s 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 letrai
.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
ouclass
(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 umbreak
). 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 umbreak
)
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!!