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.
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.
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):
Solução:
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:
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.
Unidades Federativas do Brasil - 2018
Tipo Geométrico: MultiPolygon
|
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.
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:
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:
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