Estruturas de Controle de Fluxo

Estruturas de Controle são utilizadas para organizar e adicionar complexidade à um programa. Elas servem diferentes finalidades, e vamos ver cada uma delas em detalhes.

If, else e elif

O if é uma estrutura de controle que executa um determinado bloco de código baseado em uma condição. Se a condição estipulada for verdadeira, o bloco logo abaixo será executado. Este bloco de código a ser executado deve estar indentado, e sempre com a mesma quantidade de espaços (veja o exemplo abaixo para entender), para que o Python possa identificar onde ele começa e termina. Após a exibição da mensagem, se você digitar Felipe, uma mensagem será exibida, pois a condição estipulada na definição do bloco if é verdadeira. Caso digite qualquer outra coisa, nada será exibido. Abaixo, considere que rodamos o programa duas vezes. Na primeira, digitamos como nome Felipe, e na segunda, digitamos Maria:

nome = input("Olá, qual o seu nome?\n")
if nome == "Felipe":
    print("Olá, %s" % nome)

> Digite aqui seu nome: Felipe
> Olá, Felipe

> Digite aqui seu nome: Maria

Bem, e se eu quiser imprimir outra mensagem caso a condição não seja verdadeira? Bem, aí usamos o else. O else é sempre executado se a condição estipulada no if não for verdadeira:

nome = input("Olá, qual o seu nome?\n")
if nome == "Felipe":
    print("Olá, %s" % nome)
else:
    print("Olá, visitante")

> Digite aqui seu nome: Felipe
> Olá, Felipe

> Digite aqui seu nome: Maria
> Olá, visitante

Por fim, e se quisermos testar mais de uma condição? Aí temos o elif. Podemos usar o elif quantas vezes quisermos, para testar quantas condições forem necessárias. Se nenhuma delas for verdadeira, o bloco else, localizado ao final, é executado:

if nome == "Felipe":
    print("Olá, Felipe")
elif nome == "João":
    print("Oi, João")
elif nome == "Carlos":
    print("E aí, Carlos?")
else:
    print("Olá, visitante")

> Digite aqui seu nome: Felipe
> Olá, Felipe

> Digite aqui seu nome: Maria
> Oi, Maria

> Digite aqui seu nome: Carlos
> E aí, Carlos?

> Digite aqui seu nome: Marcia
> Olá, visitante

Loops - For

Os loops são estruturas de controle para repetição. Imagine se eu quisesse escrever um programa que imprima todos os números de 1 a 10, ou que imprima separadamente cada item de uma determinada lista. Você poderia criar uma linha com um print para cada número, ou para cada item. Mas isso seria repetitivo, tedioso. Tem de haver uma maneira melhor de fazer isso. E têm. Para facilitar, o Python possui o loop for. Este loop itera sobre os elementos de uma sequência, executando o código no bloco indentado logo abaixo. Pode ser uma string, uma lista. Vamos executar o código do exemplo:

lista = ["Alfredo", "Mario", "José", "Carolina", "Joana", "Luiza"]
for nome in lista:
  print(nome)

> Alfredo
> Mario
> José
> Carolina
> Joana
> Luiza

Você também pode iterar sobre dicionários, mas existem diferentes formas. Como sabemos, dicionários possuem pares chave-valor. Desta forma, é possível iterar sobre apenas um ou sobre os dois. Vamos ver cada uma das formas abaixo:

aluno = {"nome": "Maria", "idade": 20, "nota": 9.2}

print("Exemplo 1a - iterando sobre chaves")
for chave in aluno:
  print(chave)

print("\nExemplo 1b - iterando sobre chaves")
for chave in aluno.keys():
  print(chave)

print("\nExemplo 2 - iterando sobre valores")
for valor in aluno.values():
  print(valor)

print("\nExemplo 3 - iterando sobre ambos")
for chave, valor in aluno.items():
  print(chave + " - " + str(valor))

> Exemplo 1a - iterando sobre chaves
> nota
> idade
> nome

> Exemplo 1b - iterando sobre chaves
> nota
> idade
> nome

> Exemplo 2 - iterando sobre valores
> 9.2
> 20
> Maria

> Exemplo 3 - iterando sobre ambos
> nota - 9.2
> idade - 20
> nome - Maria

No caso da impressão dos números, podemos usar a função range(). Ela cria uma sequência de números inteiros, podendo receber um ou dois parâmetros. Recebendo um parâmetro, ela cria o intervalo que vai de 0, até o número passado na função, excluindo o próprio número. Caso sejam passados dois parâmetros, o intervalo começa no primeiro e termina no segundo:

print("Range com 1 parâmetro")
for i in range(5):
    print(i)

print("Range com 2 parâmetros")    
for i in range(3,10):
    print(i)

> Range com 1 parâmetro
> 0
> 1
> 2
> 3
> 4
> Range com 2 parâmetros
> 3
> 4
> 5
> 6
> 7
> 8
> 9

Logo, se a ideia for repetir um certo bloco de código um determinado número de vezes, basta usar o range() com o número de repetições desejadas. E como você pode perceber através dos 2 exemplos, o nome que vem após o for pode ser qualquer nome que siga as regras de nomenclatura de variáveis. Este nome é simplesmente o nome que se dará a cada item dentro da lista, que será diferente em cada iteração.

Dois comando importantes presentes nos loops são o break e o continue. Esses comandos alteram o fluxo natural de um loop. No caso do break, ele para a execução do loop. Já no continue, ele não executa mais nada naquele ciclo de iteração e passa para o próximo. Vamos dar uma olhada em um exemplo para que fique mais claro:

print("Exemplo break")
for i in range(1,11):
    if i % 5 == 0:
        break
    print(i)
    
print("Exemplo continue")
for i in range(1,11):
    if i % 5 == 0:
        continue
    print(i)

> Exemplo break
> 1
> 2
> 3
> 4
> Exemplo continue
> 1
> 2
> 3
> 4
> 6
> 7
> 8
> 9

No primeiro exemplo, no caso do break, o loop deveria imprimir todos os números de 1 a 10. Entretanto, inserimos uma condição tal que, se o valor de i fosse divisível por 5, ele executaria o comando break. Dessa forma, quando o valor de i chegou a 5, o comando break foi executado e nada mais foi impresso.

A mesma lógica foi seguida no segundo exemplo. Entretanto, ao invés do break, o comando continue foi executado, fazendo com que o loop pulasse para a próxima iteração, e não imprimindo o número 5 e o número 10.

Loops - while

O loop while é semelhante ao for, no sentido que ele leva a repetição de um bloco de código. Entretanto, ele executa este código enquanto uma certa condição definida for verdadeira. Vejamos abaixo um exemplo semelhante ao de cima:

contador = 0
while contador < 5:
  print(contador)
  contador = contador + 1

> 0
> 1
> 2
> 3
> 4

Este exemplo vai imprimindo a variável contador, e no final do bloco de código, aumenta seu valor em 1. Conforme a condição, enquanto o contador for menor que 5, o bloco de código dentro dele será executado. Quando o valor chega em 5, a condição não é mais verdadeira e o bloco não é mais executado.

Têm de se tomar cuidado com o loop while, pois se você definir uma condição que nunca se torne falsa, seu código fica executando sem parar. Se no exemplo acima nós não incluíssemos a última linha, que incrementa o contador em 1, o código rodaria para sempre, imprimindo zero infinitas vezes. Caso você se veja nesta situação em algum código, basta apertar Ctrl + C, e o código será interrompido.

Outra possibilidade que se vê regularmente em Python é definir como condição para execução do loop while True, e dentro do loop, definir alguma condição onde se execute o comando break. Vejamos um exemplo um pouco mais complexo, misturando o while True com uma estrutura if / else:

while True:
  nome = input("Digite seu nome ou sair para terminar o programa: ")
  if nome == "sair":
    break
  else:
    print("Olá, %s" % nome)

> Digite seu nome ou sair para terminar o programa: Felipe
> Olá, Felipe
> Digite seu nome ou sair para terminar o programa: Maria
> Olá, Maria
> Digite seu nome ou sair para terminar o programa: sair

Conclusão

E assim, passamos por todas as estruturas de controle. Vimos como elas permitem adicionar mais complexidade ao seu código, executando diferentes blocos de código baseado em determinadas condições ou repetindo blocos de código, evitando código repetido. No próximo capítulo veremos em detalhes uma parte do Python que já estamos usando desde os primeiros capítulos, que são as funções.