Controle do Fluxo de Execução

Nesta seção aprenderemos a fazer nossos programas tomarem certas decisões dependendo de condições prévias. Chamamos essa capacidade de tomada de decisões em programas de fluxo de execução: dependendo do que acontecer a execução do programa segue um dado fluxo, dependendo ela segue outro.

Fluxo de Execução

O primeiro recurso de controle de fluxo que aprenderemos são os condicionais. Em seguida, aprenderemos a usar estruturas de repetição.

Condicionais

Uma capacidade importantíssima de uma linguagem de programação, necessária em praticamente todo programa de computador, é a capacidade de tomar decisões baseadas em certas condições.

A linguagem Python usa algumas palavras-chave para indicar execução condicional de código: if, elif (else if), else. Basicamente, os condicionais nos permitem selecionar certos blocos de código que serão ou não executados dependendo de certas condições. Em alto nível, um condicional é como a sequência de passos abaixo:

  1. A condição é verdadeira?

  2. Se sim, execute um trecho de código.

  3. Caso contrário, execute outro trecho de código.

Vejamos alguns exemplos.

condicao = False

if condicao == True:
    print("A condicao é verdadeira.")
else:
    print("A condicao é falsa.")
A condicao é falsa.

Note que fazer if condicao == True é equivalente a fazer if condicao, mas a segunda forma é mais usada. Talvez por ser mais sucinta, algumas pessoas costumam dizer que é um jeito mais "pythonico" de se escrever o código. Acostume-se com isso, pois você verá muito código escrito desse jeito. Vejamos um exemplo de como seria o código acima escrito dessa forma mais "pythonica":

condicao = False

if condicao:
    print("A condicao é verdadeira.")
else:
    print("A condicao é falsa.")
A condicao é falsa.

Condicionais também podem ser usados em cadeia (um após o outro), como mostrado abaixo:

condicao_1 = False
condicao_2 = False

if condicao_1:
  print("A condicao_1 é verdadeira.")
elif condicao_2:
  print("A condicao_2 é verdadeira.")
else:
  print("As condições condicao_1 e condicao_2 são falsas.")
As condições condicao_1 e condicao_2 são falsas.

Pelos exemplos acima, vimos que blocos de código em Python são delimitados pelo nível de indentação deles. Os comandos print estão alinhados mais à direita no exemplo acima, e isso não é por acaso. Isso é chamado de indentação (o correto é indentação mesmo, e não "identação") e ela serve para delimitar blocos de código.

Em linguagens como C e Java, blocos de código são delimitados por {}, e a indentação do código é simplesmente uma boa prática de programação, mas não é necessária para o correto funcionamento dos programas. Até mesmo linguagens de marcação usam certos delimitadores para blocos de código. Em HTML, por exemplo, blocos de código são delimitados por <…​>.

É importante enfatizar isso: em Python, blocos de código são delimitados por sua indentação. E a indentação é parte integrante do programa, sendo essencial para seu correto funcionamento.

# Má indentação!
if sentenca_1:
    if sentenca_2:
    # A linha abaixo não está indentada corretamente.
    print("Ambas sentenças são verdadeiras.")
  File "<ipython-input-227-30e2d674efad>", line 4
    # A linha abaixo não está indentada corretamente.
    print("Ambas sentenças são verdadeira.")
        ^
IndentationError: expected an indented block
s = True

if s:
    print("Impresso se s for verdadeiro.")

    print("Ainda dentro do if. Note a indentação.")
Impresso se s for verdadeiro.
Ainda dentro do if. Note a indentação.
if s:
    print("Impresso se s for verdadeiro.")

print("Agora fora do if. Note a indentação.")
Impresso se s for verdadeiro.
Agora fora do if. Note a indentação.

Laços de Repetição

Outra capacidade importantíssima de linguagens de programação é a repetição de comandos até que uma dada condição seja satisfeita. As linguagens de programação implementam isso por meio dos chamados laços de repetição.

Laços for

Existem vários tipos de laços (loops) em Python. O mais comum deles é o for, que é usado com objetos iteráveis tais como listas e intervalos. Os exemplos abaixo mostram o funcionamento básico do for.

# Percorrendo uma lista de números.
print("Números em uma lista: ")
for numero in [1, 1, 2, 3, 5, 8, 13]:
    print(numero)
Números em uma lista:
1
1
2
3
5
8
13
# Percorrendo uma lista de palavras.
print("Palavras em uma lista:")
for palavra in ["Ordem", "e", "Progresso"]:
    print(palavra)
Palavras em uma lista:
Ordem
e
Progresso

Vejamos agora como percorrer intervalos em Python.

# Percorrendo um intervalo. Por padrão, intervalos começam em zero.
for i in range(3):
    print(i)
0
1
2

Observação: range(3) não inclui o 3, como mencionamos anteriormente.

Nos exemplos acima, ao percorrer os elementos de uma sequência, não usamos o índice do elemento (sua posição na sequência). Entretanto, há situações em que esta informação é útil. Python nos permite acessar tanto os índices dos elementos quanto os elementos propriamente ditos se usarmos a função enumerate.

for indice, elemento in enumerate(range(-3,3)):
    print(indice, elemento)
0 -3
1 -2
2 -1
3 0
4 1
5 2

Um exemplo interessante de uso de laços for é a busca por um elemento em uma lista:

elemento = 10
estah_presente = False
lista = [1, 2, 7, 10, 15, 20, 50]
for item in lista:
  if item == elemento:
    estah_presente = True

if estah_presente:
  print("Elemento está na lista!")
else:
  print("Elemento não está na lista!")
Elemento está na lista!

Uma outra forma de pesquisar por um elemento em uma lista em Python é por meio do recurso in:

elemento = 10
lista = [1, 2, 7, 10, 15]
if elemento in lista:
  print("Está na lista!")
else:
  print("Não está na lista!")
Está na lista!

Laços while

Além dos laços for, Python conta também com os laços while, que executam enquanto uma dada condição for verdadeira:

i = 1
while i < 5:
    print(i)
    i = i + 1
1
2
3
4

Um exemplo útil de uso de laços while é o cálculo do fatorial de um número:

n = 6
fatorial = 1
while n > 1:
  fatorial *= n (1)
  n -= 1 (2)
print(fatorial)
720
1 Equivalente a fatorial = fatorial * n
2 Equivalente a n = n - 1

Esta seção cobriu aspectos importantes de lógica de programação. Na próxima seção, aprenderemos a criar funções e praticaremos os conceitos de controle de fluxo de execução que acabamos de aprender.