2.13. Estruturas de Repetição

Problema 1: Escreva um programa para converter temperaturas da escala Fahrenheit para a escala Celsius. A coluna °F na Figura 2.15 - contém a lista de valores a serem convertidos para a escala Celsius.

Tabela de equivalência de temperaturas entre as escalas Fahrenheit e Celsius

Figura 2.15 - Tabela de equivalência de temperaturas entre as escalas Fahrenheit e Celsius.

Desafio: Como implementar esse programa?

  • Muitas das computações que realizamos em um programa são naturalmente repetitivas.

  • Nas linguagens imperativas, encontramos estruturas específicas para essa finalidade, que são chamadas de comandos de repetição, ou estruturas de repetição, ou laços (loops).

  • Através desses comandos, podemos realizar uma computação até que uma certa condição seja satisfeita.

Em Python, temos dois tipos de laços: for e while. Esta seção apresenta esses dois tipos de laços.

2.13.1. Exemplo: escrita repetitiva na tela

Problema 2: Crie um programa para escrever os números de 1 a 5.

Solução?

print(1)
print(2)
print(3)
print(4)
print(5)

Problema 3: Crie um programa para escrever os números de 1 a 100.

Solução: utilizar uma estrutura de repetição.

1for i in range(1, 101):
2    print(i)

Nota

O tipo range representa uma sequência imutável de números, sendo comumente empregado em laços do tipo for, onde temos que iterar um certo número de vezes.

Nota

Veja o que acontece quando construímos um objeto range identificado pela variável r:

>>> r = range(5)
>>> r.start
0
>>> r.stop
5
>>> r.step
1
>>> list(r)
[0, 1, 2, 3, 4]

Nota

Um objeto do tipo range ocupa um espaço fixo de memória, independente do tamanho do intervalo definido por ele. Enquanto uma lista materializa de fato os elementos da sequência, o range apenas calcula itens à medida em que são necessários.

2.13.2. Laços do tipo for

Esse tipo de laço é muito útil quando estamos lidando com sequências (como strings, tuplas e listas) ou iteráveis. A Figura 2.16 mostra como funciona esse tipo de laço. Repare que temos uma variável de controle, \(v\), que é associada aos elementos de uma sequência/iterável. Toda vez que é possível associar a variável \(v\) a um novo elemento da sequência/iterável, o fluxo de controle do programa é desviado para as instruções do bloco de comandos destacado em verde. Quando não há mais possibilidade de associar a variável \(v\) a um novo elemento da sequência/iterável, o controle é desviado para o conjunto de instruções do bloco destacado em amarelo.

Fluxograma dos laços do tipo for

Figura 2.16 - Fluxograma dos laços do tipo for.

A sintaxe básica deste comando é a seguinte:

for variavel-it in iterável:
    instrução-1
    instrução-2
    ...
    instrução-n

Dica

Para saber a sintaxe completa do comando for, consulte [34].

Problema 4: Escreva um programa para computar o seguinte somatório (Equação 2.3):

(2.3)\[\sum_{i=1}^{5} i\]

Solução:

Trecho de Código 2.10 - Computando o somatório de 1 a 5 usando laço do tipo for.
1soma = 0
2
3for i in range(1, 6):
4    soma = soma + i
5
6print(f"soma: {soma}")

Exercício: Resolva o problema 1 utilizando um laço do tipo for.

Solução:

Trecho de Código 2.11 - Conversão de temperaturas entre as escalas Fahrenheit e Celsius usando laço for.
1for fahr in range(0, 320, 20):
2    celsius = 5 * (fahr - 32) / 9
3
4    print(fahr, celsius)

Problema 5: Considere o conjunto de dados no formato ESRI Shapefile mostrado na Tabela 2.11, que contem os limites estaduais brasileiros referentes ao ano de 2018. Faça um programa em Python que leia as feições desse conjunto de dados e escreva na tela o nome da unidade e sua área em km2.

Tabela 2.11 - Unidades Federativas do Brasil - 2018
Fonte Original: IBGE.

uf-2018

Unidades Federativas do Brasil - 2018

  • uf_2018.cpg

  • uf_2018.dbf

  • uf_2018.prj

  • uf_2018.shp

  • uf_2018.shx

Tipo Geométrico: MultiPolygon

Número de Feições: 27

CRS: Lat/Long SIRGAS 2000

SRID: 4674

Codificação Caracteres: UTF-8

Dica

Para solução desse problema, serão utilizados dois pacotes para linguagem Python denominados Fiona e pyproj. Esses pacotes não fazem parte da biblioteca padrão do Python, sendo contribuições de terceiros. Mais detalhes sobre a leitura e escrita de dados geoespaciais serão vistos na Seção 5.6.

Dica

Veja os possíveis sistemas de referêncial espacial em https://spatialreference.org.

Solução:
import fiona
import pyproj

from shapely.geometry import shape
from shapely.ops import transform

epsg_4674 = pyproj.CRS('EPSG:4674')  # SIRGAS 2000
epsg_5880 = pyproj.CRS('EPSG:5880')  # SIRGAS 2000 / Brazil Polyconic

project = pyproj.Transformer.from_crs(epsg_4674, epsg_5880, always_xy=True).transform

with fiona.open(
    "zip+https://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2018/Brasil/BR/br_unidades_da_federacao.zip"
) as ufs:
    for uf in ufs:
        nome = uf["properties"]["NM_ESTADO"]
        geom = shape(uf["geometry"])

        geom_policonica = transform(project, geom)
        area = geom_policonica.area / 1e6

        nome_fmt = nome.ljust(20, '.')

        print("{}: {}".format(nome_fmt, area))

Dica

Para mais exemplos do uso do laço for, consulte [82].

2.13.3. Laços do tipo while

Nesse tipo de laço, se a expressão lógica ou condição de repetição no início do laço for verdadeira, os comandos (ou instruções) dentro da estrutura de repetição são executados. Ao final da execução dos comandos, internos ao laço, o fluxo de controle do programa volta ao início do laço, para nova avaliação da expressão lógica. Se a expressão for satisfeita novamente (verdadeira), o corpo do laço é novamente executado, até que a repetição seja interrompida quando a expressão resultar em um valor falso. Esse funcionamento pode ser visto na Figura 2.17.

Fluxograma dos laços do tipo while

Figura 2.17 - Fluxograma dos laços do tipo while.

A sintaxe básica deste comando é a seguine:

while <condição>:
    instrução-1
    instrução-2
    ...
    instrução-n

Dica

Para saber a sintaxe completa do comando while, consulte [35].

Nota

Em algumas linguagens, como C e C++, existem outros tipos de laços, como, por exemplo, comandos de repetição com expressão de interrupção ao final da primeira iteração (ex: do...while).

Exercício: Resolva o problema 4 utilizando um laço do tipo while.

Solução:

Trecho de Código 2.12 - Computando o somatório de 1 a 5 usando laço do tipo while.
 1i = 1
 2soma = 0
 3
 4while i <= 5:
 5    soma = soma + i
 6
 7    i = i + 1
 8
 9print("Soma Final:", soma)
10print("Valor final de i:", i)

Exercício: Resolva o problema 1 utilizando um laço do tipo while.

Solução:

Trecho de Código 2.13 - Conversão de temperaturas entre as escalas Fahrenheit e Celsius usando laço while.
 1t_min = 0     # temperatura mínima
 2t_max = 300   # temperatura máxima
 3delta_t = 20  # delta de temperatura a cada passo
 4
 5fahr = t_min  # temperatura Fahrenheit inicial
 6
 7while fahr <= t_max:
 8    celsius = 5 * (fahr - 32) / 9
 9
10    print(fahr, celsius)
11
12    fahr = fahr + delta_t

Dica

Um bom tutorial sobre laços pode ser encontrado em [61]. O site learningpython.org contém uma seção explicando o uso de laços for e while [50].

Exemplos

Vamos fazer os exemplos 03, 04, 05, 06 e 07.