Instituto Federal de Mato Grosso do SulMaio/2023

IFMS marca

06. Loops

Construção de Algoritmos

Prof. Rodrigo Duran

Nesta aula vamos:


  • O que são e como utilizar loops

    Vamos aprender a sintaxe e o comportamento das estruturas de repetição em Python: for e while. Vocês também vão aprender a compreender códigos que utilizam os diversos tipos de loop e aprender os planos mais comuns em que usamos a repetição.

LOOPS

Looping basicamente refere-se ao ato de voltar sempre ao mesmo lugar.
Algumas vezes fazemos coisas diferentes dentro desse "loop", outras vezes não.
Na maioria das vezes o loop deve acabar em algum momento.

Não se preocupe, entender loops não é nem um pouco difícil como entender a série Dark

Principios básicos

Repetição: Principios básicos


De forma geral, a repetição consiste em executar a mesma tarefa, ou uma tarefa muito similar, um determinado número de vezes.

Nosso objetivo é identificar a tarefa núcleo dessa repetição: o que é sempre igual?

Por exemplo, imagine que você queira imprimir cada elemento do lista time:

time = ["Taffarel", "Aldair", "Marcio Santos", "Romario"]

Uma forma seria imprimir cada um dos elementos, um a um:

print(time[0])
print(time[1])
print(time[2])
print(time[3])

Enquanto essa solução é funcional, ela não é escalável nem tão pouco generalizável. Nós temos que saber de antemão quantos elementos existem na lista. Tente utilizar a mesma solução para uma lista de 1000 elementos!

Principios básicos

Repetição: Principios básicos


No exemplo anterior, a tarefa núcleo é imprimir os elementos da lista. Veja que ela se repete de forma similar, mas não igual. Entre um passo e outro, o índice do lista aumenta para que possamos acessar os próximos elementos do lista até o seu final.

De forma geral, toda repetição (implicita ou explicita) segue um conjunto de princípios:

  1. Um início: Em geral utilizamos um elemento de controle para nos dizer aonde essa repetição começa. Onde eu começo?
  2. Um fim: Em geral, a repetição deve terminar em algum momento. Devemos fornecer um teste que diga se a repetição deve terminar ou não. Onde eu termino?
  3. Um incremento: O incremento atua em algum elemento de controle. O incremento é a ação que nos leva do ponto de início até chegarmos ao ponto final.

Repetições usando ... for


Uma forma de repetição é utilizar uma estrutura de loop (laço).

Os loops em Python fazem uma iteração em uma sequência-- uma lista ou string, por exemplo.

time = ["Taffarel", "Aldair", "Marcio Santos", "Romario"]

for jogador in time:
  print(jogador)
Taffarel Aldair Marcio Santos Romario
Loop padrão com for

Template 1: Contador


Uma das formas mais comuns de se usar loops é repetir uma determinada atividade um número vezes. Esse número de repetições pode ser determinado por um valor inteiro (e.g., 10) ou ser um valor armazenado em uma variável.

Além de utilizar o for como uma forma de iterar em uma coleção, é possível utilizar o for para "contar" um determinado número de vezes

Para isso podemos utilizar a função range()

Para efeitos práticos, a função range() retorna uma coleção de números.

for cont in range(10):
  print(cont)
0, 1 , 2 , 3 , 4 , 5 , 6 , 7, 8 , 9

Você pode estabelecer os valores iniciais e finais para o range(). Lembre-se que o valor final não é incluido!

for cont in range(1,11):
  print(cont)
1 , 2 , 3 , 4 , 5 , 6 , 7, 8 , 9, 11

Também é possível estabelecer um incremento

for cont in range(0,21,2):
  print(cont)
0 , 2 , 4 , 6 , 8 , 10 , 12, 14 , 16, 18, 20

Template 2: "Varrer" (ou percorrer) todos os elementos do lista


Outro template muito utilizado é usar um loop para acessar todos os índice (e elementos de uma lista) para, por exemplo, somar o valor de todos os seus elementos

numeros = list(range(10))
soma = 0

for cont in numeros:
  soma = soma + cont

print(soma)

12

Visualizando o Template 2


Template 2 versão alternativa: E se quisermos ter acesso ao valor E índice do elemento?


Muito comum ao trabalhar com imagens é que determinadas ações só podem ser feitas em determinados locais. Precisamos tanto do valor (para realizar a alteração) quanto do índice (para testar se devemos fazer a alteração)

Podemos utilizar o comando enumerate() para acessar tanto o valor quanto índice de uma lista

rgbimage = [200,21,13,25,42, 51, 4, 255, 22, 44, 226,255]
for cont, canal in enumerate(rgbimage):
if not(cont % 4 == 0):
  rgbimage[cont] = canal * 0.2

12

Visualizando o Template 2


QUIZ!

Se quiséssemos imprimir todos os elementos de um lista o correto seria:

Opção 1

valores = [1, 2 , 3, 4 , 5]
for (valor of valores):
  print(valor)

Opção 2

valores = [1, 2 , 3, 4 , 5]
for (valor in valores):
  print(valor)

Opção 3

valores = [1, 2 , 3, 4 , 5]
for (valores):
  print(valores[i])

Opção 4

valores = [1, 2 , 3, 4 , 5]
for (valores):
  print(valores[valor])

Template 1 (Versão alternativa): while loops!


Existe uma outra forma de repetição em Python utilizando o while

Assim como todas as estruturas de repetição, todos os três principios estão presentes. Entretanto, no while os princípios são explícitos utilizando uma variável de controle.

i = 0
while (i<3):
  print(i)
  i+=1
0 , 1 , 2

Loop contador com while

Template 3: Faça algo até achar o sentinela.


while loops são muito úteis quando não existe um número explicito de repetições. Por exemplo, gostaríamos de somar os valores de um listaa até achar um elemento especial, que chamaremos de Sentinela. Essa sentinela pode ser uma frase do usuário ("Parar!"), um valor negativo, ou um valor especial que denotamos como fim de entrada (99999).

Nesse caso, o while não vai mais se utilizar de um contador, mas sim verificar se o valor atual corresponde à sentinela. Contruímos uma expressão booleana que só é verdade enquanto o valor atual não é igual à sentinela.

valores = [0, 22, 33, 11, 20, 44, 99999, 5, 12, 44]
atual = valores[0]
soma = 0
i = 0
while (atual != 99999):
  soma = soma + atual
  i+=1
  atual = valores[i]
print(soma)
130

QUIZ!

Qual o valor impresso no console após executar o programa abaixo?

palavra = "construcao.TADS"
frase = ""
i = 0
letra = palavra[i]
while (letra != "."):
  print(letra)
  frase = frase + letra
  i+=1
  letra = palavra[i]

frase = frase + palavra[i]
print(frase)

Template 3: loops dentro de loops?


Todas as estruturas que possuem blocos (if, while, for) podem ser aninhadas (nested).

No caso particular de loops, quando tempos um loop dentro do outro, isso significa que:

  1. O primeiro loop é "ativado" - a variável do loop mais externo é inicializada.
  2. O segundo loop é "ativado" - a variável do loop mais interno -- que deve ser obrigatoriamente diferente da variável do loop mais externo -- é inicializada.
  3. O loop mais interno faz todos os seus passos até o seu fim.
  4. O controle retorna ao loop mais externo - a variável de controle é incrementada.
  5. O loop mais interno reinicia -- sua variável de controle é re-inicializada.
  6. Esse processo se repete até que o loop externo tenha feito todos os seus passos.

for i in range(3):
  for j in range(2)
    print(i, j)
(0,0) (0,1) (1,0) (1,1)(2,0) (2,1)

São tantos tipos de repetição!

Quando e como devo usar cada um deles?