– For – Estrutura de Repetição
Muitas vezes precisamos repetir ações não apenas 1 ou 2 vezes mas n vezes. Sendo n o número de linhas de uma planilha, número de dias no ano, número de clientes, número de cidades no estado do Rio de Janeiro, etc... Replicar isso em um código seria inviável. Em geral, temos uma regra que sempre que você está escrevendo linhas de código iguais, possivelmente existe um jeito melhor de fazer. PS: Não se preocupe com isso agora. O tempo e a prática vão te fazer mais eficiente ☺
Para esses casos temos as estrutura de de repetição. Uma das estruturas mais úteis e usadas é a FOR. Vamos dar uma olhada em como é essa estrutura:
for ínicio até nº de vezes que se pretende repetir:
Ação 1 a ser realizada
Ação 2 a ser realizada
Ação fora do for. Sem indentação!!!
Aqui usamos a estrutura FOR para “printarmos” a variável i 5 vezes.
O uso do i é bem usual na programação e funciona como um contador. Como não definimos seu valor anteriormente, o Python assumirá que seu valor
inicial é 0. Logo, indo para primeira iteração (indicada pela seta verde) o output é 0 (ZERO)
Após esta ação, a estrutura for volta a linha superior (indicada pela seta laranja)
for i in range(5):
print(i)
__________
0
Após a primeira iteração o valor de i será acrescido de uma unidade. Logo, seu novo valor é 1. A seta verde indica a entrada na estrutura for que “printa” o valor de i (1).
Assim como na iteração anterior, após a execução da indentação, o python retorna para a linha do for para a terceira iteração.
for i in range(5):
print(i)
__________
0
1
Assim como nos casos anteriores é feita a TERCEIRA iteração
for i in range(5):
print(i)
__________
0
1
2
Assim como nos casos anteriores é feita a QUARTA iteração
Na quinta e última iteração, é “printado” o valor de i, mas não há retorno para o início do FOR. O código continuará a ser lido. Uma dúvida comum é:
“Por que o valor de i só vai até 4 se range é (5)?”
Lembre-se que o valor inicial de i era 0 (ZERO) e que o range(5) significa “repetir 5 vezes” e não repetir até 5.
for i in range(5):
print(i)
__________
0
1
2
3
4
Vamos agora para um caso mais aplicável: Imagine que temos 2 listas produtos e produção.
produtos = [ ‘coca’, ‘pepsi’, ‘guaraná’,’sprite’,’fanta’]
producao = [15000,12000,13000,5000,250]
Se fosse pedido para elaborar um relatório que informasse a produção de todos os produtos poderíamos usar o código ao lado. Conseguimos o resultado... Seria a melhor forma? Se ao invés de 5 produtos fossem 500, seria simples? Pensa em alguma alternativa para esse caso?
produtos = [ ‘coca’, ‘pepsi’, ‘guaraná’,’sprite’,’fanta’]
producao = [15000,12000,13000,5000,250]
print('Produção do '+ produtos[0]+ 'é de '+str(producao[0]))
print('Produção do '+ produtos[1]+ 'é de '+str(producao[1]))
print('Produção do '+ produtos[2]+ 'é de '+str(producao[2]))
print('Produção do '+ produtos[3]+ 'é de '+str(producao[3]))
print('Produção do '+ produtos[4]+ 'é de '+str(producao[4]))
____________________
Produção do coca é de 15000
Produção do pepsi é de 12000
Produção do guaraná é de 13000
Produção do sprite é de 5000
Produção do fanta é de 250
Vamos lá! Sabemos que temos o FOR que nos permite repetir o número de vezes que precisarmos Além disso, vamos precisar de uma variável auxiliar para contar o número de iterações. Vamos chamá-la de i. Seu valor inicial será 0 (ZERO). Dentro da indentação do FOR, ao invés de replicarmos 5 vezes a frase, vamos usar o .FORMAT e o índice das nossas listas para printar o resultado!
Conseguimos reduzir nosso código e otimizar bastante. No entanto, da forma que está descrito temos uma limitação... Caso a lista cresça para um número superior a 5 itens nosso for não comtemplará todos os itens da lista. Para isso vamos usar a função LEN(). Isso permitirá que mesmo que a lista aumente nosso for sempre contemple todos os itens.
produtos = [ ‘coca’, ‘pepsi’, ‘guaraná’,’sprite’,’fanta’,'mineirinho']
producao = [15000,12000,13000,5000,250,800]
tamanho = len(produtos)
for i in range(tamanho):
print('Produção do {} é de {}'.format(produtos[i],producao[i]))
____________________
Produção do coca é de 15000
Produção do pepsi é de 12000
Produção do guaraná é de 13000
Produção do sprite é de 5000
Produção do fanta é de 250
Produção do mineirinho é de 800
– Estrutura de Repetição – For each - Percorrer cada item de uma lista
No exemplo anterior utilizamos o Range() para podermos informar o número de repetições que serão executadas no for. No entanto, no Python é muito usual usarmos a
própria lista para termos essa informação. Como podemos ver no exemplo, criamos localmente uma variável item que irá percorrer todos os itens da lista produtos.
produtos = [ ‘coca’, ‘pepsi’, ‘guaraná’,’sprite’,’fanta’,'mineirinho']
for item in produtos:
print('Produção do {}'.format(item))
____________________
Produção do coca
Produção do pepsi
Produção do guaraná
Produção do sprite
Produção do fanta
Produção do mineirinho
D I C A
Em geral, no Python o que mais é utilizado são estruturas como a do exemplo ao lado.
Utilizamos a palavra referente a lista no singular PRODUTO e na lista a palavra no plural PRODUTOS. Podemos ler essa estrutura como: “Para cada PRODUTO na lista PRODUTOS,“printar” o texto”
Podemos combinar o uso do for com o IF por exemplo. Como já vimos anteriormente o uso da indentação é muito importante para que o código seja lido pelo Python corretamente. No modelo abaixo apresentamos uma estrutura genérica. Perceba que o If possui uma indentação em relação ao FOR e as linhas 3 e 4 possuem uma indentação “dupla”, pois pertencem ao IF e ao FOR.
for item in listas :
if item ATENDE a CONDIÇÃO:
Ação 1 a ser realizada
Ação 2 a ser realizada
– Estrutura de Repetição – For e If
Vamos imaginar agora que temos uma lista de vendas de um produto realizadas por diferentes vendedores. A empresa espera que a meta de vendas dos funcionários seja de 100 unidades vendidas. Vamos criar um código que verifique de forma automática quantas vendedores conseguiram atingir a meta.
Para isso vamos precisar usar 2 conhecimentos.
1) FOR para poder passar por todos os itens da lista;
2) IF para verificarmos se o item é >=100
vendas = [100,50,80,190,200,210,45,37,99,105,130,111,44,24,67,93,157,25]
meta = 100
for venda in vendas:
if venda >= meta:
print(venda)
_________________
100
190
200
210
105
130
111
157
A T E N Ç Ã O !
As indentações precisam ser respeitadas.
Conseguimos “printar” todos os valores de venda >=100, mas ainda não é a informação que queríamos... O ideal seria termos um “contador” que acumulasse o número de funcionários que bateram a meta. Com esse contador será possível por exemplo dizer
automaticamente a % de atingimento de meta. No exemplo ao lado fizemos essa melhoria. Perceba que a variável qtde_bateu_meta precisa ser previamente definida com valor = 0, caso contrário, o Python não entenderá a linha de comando +=1.
vendas = [100,50,80,190,200,210,45,37,99,105,130,111,44,24,67,93,157,25]
meta = 100
qtde_bateu_meta = 0
for venda in vendas:
if venda >= meta:
qtde_bateu_meta += 1
qtde_funcionarios = len(vendas)
print('O percentual de pessoas que bateram a meta foi de {:.1%}'.format(qtde_bateu_meta/ qtde_funcionarios))
_________________
O percentual de pessoas que bateram a meta foi de 44.4%
Aqui usamos um novo formato para o input do format.
Ao invés de {} vamos usar o termo{:.1%}
Vamos ver o que esses caracteres significam:
• : - indica que será formato de uma forma específica
• .ALGARISMO – indica o número de casas decimais. Neste caso UMA
• % - indica que se trata de uma PORCENTAGEM
– Enumerate - For com item e índice
Uma terceira forma de usarmos o FOR além do RANGE ou da própria lista, é usar o
ENUMERATE(). Esta é uma forma que de certa forma combina as outras duas. Será usada principalmente em situações que é necessário saber a posição de um item.
No exemplo temos uma lista de funcionários e precisamos saber qual a posição desses funcionários. Usando o ENUMERATE, podemos coletar tanto a posição quanto o nome do
funcionário. Perceba que usamos duas variáveis no for ao mesmo tempo, i e funcionário.
funcionarios = ['Maria', 'José', 'Antônio', 'João', 'Francisco', 'Ana', Luiz', 'Paulo']
for i, funcionario in enumerate(funcionarios):
print('{} é o funcionário {}'.format(i, funcionario))
_______________________
0 é o funcionário Maria
1 é o funcionário José
2 é o funcionário Antônio
3 é o funcionário João
4 é o funcionário Francisco
5 é o funcionário Ana
6 é o funcionário Luiz
7 é o funcionário Paulo
Vamos considerar um novo exemplo mais aplicável. Vamos criar um código que nos permita monitora os níveis de estoque de vários produtos e nos avise caso este produto esteja menor que o estoque mínimo definido. Primeiro, vamos criar nosso for para “printar” todos as quantidades (qtde) em estoque. No entanto, ainda não é suficiente para o que desejamos. Vamos precisar colocar algum teste que nos permita verificar se essas quantidades são Maiores ou menores que a variável nível_mínimo.
estoque = [1200, 300, 800, 1500, 1900, 2750, 400, 20, 23, 70, 90, 80, 1100, 999, 900, 880, 870, 50, 1111, 120, 300, 450, 800]
produtos = ['coca', 'pepsi', 'guarana', 'skol', 'brahma', 'agua', 'del vale', 'dolly', 'red bull', 'cachaça', 'vinho tinto', 'vodka', 'vinho branco', 'tequila', 'champagne', 'gin', 'guaracamp', 'matte', 'leite de castanha', 'leite', 'jurupinga', 'sprite', 'fanta']
nivel_minimo = 50
for qtde in estoque:
print(qtde)
__________________________
1200
300
800
1500
1900
2750
400
– For dentro de For
Assim como fizemos com o IF também podemos colocar um FOR dentro de um FOR. Assim como dito anteriormente, é muito importante ter atenção com a indentação. Ela identificará a ordem da execução das atividades
for item1 in lista1
for item2 in lista2
Ação a ser realizada
Usando o IF indentado dentro do For podemos
realizar o teste citado no slide anterior. Ou seja,
toda vez que uma quantidade(qtde) for MENOR(<)
que o nível_mínimo, vamos “printar” esse valor.
No entanto, ainda falta saber a que produto esses
valores se referem...
estoque = [1200, 300, 800, 1500, 1900, 2750, 400, 20, 23, 70, 90, 80, 1100, 999, 900, 880, 870, 50, 1111, 120, 300, 450, 800]
produtos = ['coca', 'pepsi', 'guarana', 'skol', 'brahma', 'agua', 'del vale', 'dolly', 'red bull', 'cachaça', 'vinho tinto', 'vodka', 'vinho branco', 'tequila', 'champagne', 'gin', 'guaracamp', 'matte', 'leite de castanha', 'leite', 'jurupinga', 'sprite', 'fanta']
nivel_minimo = 50
for qtde in estoque:
if qtde<nivel_minimo:
print(qtde)
__________________________
20
23
Para sabermos qual o produto, vamos precisar saber qual o índice desse valor e assim aplicarmos esse índice na lista produtos para termos o produto. Vamos usar o ENUMERATE() visto anteriormente juntamente do i na estrutura do FOR. Assim, conseguimos a posição i, da qtde, da lista estoque, para usarmos na lista produtos.
estoque = [1200, 300, 800, 1500, 1900, 2750, 400, 20, 23, 70, 90, 80, 1100, 999, 900, 880, 870, 50, 1111, 120, 300, 450, 800]
produtos = ['coca', 'pepsi', 'guarana', 'skol', 'brahma', 'agua', 'del vale', 'dolly', 'red bull', 'cachaça', 'vinho tinto', 'vodka', 'vinho branco', 'tequila', 'champagne', 'gin', 'guaracamp', 'matte', 'leite de castanha', 'leite', 'jurupinga', 'sprite', 'fanta']
nivel_minimo = 50
for i, qtde in enumerate(estoque):
if qtde<nivel_minimo:
print('{} está abaixo do nível mínimo. Temos apenas {} unidades'.format(produtos[i], qtde))
__________________________
dolly está abaixo do nível mínimo. Temos apenas 20 unidades
red bull está abaixo do nível mínimo. Temos apenas 23 unidades
– Estrutura de Repetição – Break and Continue – Interrompendo um Loop
Por enquanto, nossas listas sempre foram pequenas. Com poucos itens, mas imagine que você tenha uma lista de 5000 itens. Rodar o for demandará mais do seu pc. As vezes não precisamos percorrer toda a lista para acharmos o que procuramos. Muitas vezes o que queremos saber é se pelo menos 1 dos 5000 itens atende uma condição. Se ele for atendido já é suficiente e o for poderia ser pausado. Para esses casos temos o BREAK. Ele permite pausar um FOR caso a condição seja atendida. Isso transforma o nosso código
mais eficiente! Ao invés de percorrer 5000 linhas, ele irá percorrer apenas o suficiente para atender à condição.
BREAK Pausará o for. Ou seja, se sua lista possui, por exemplo, 10 itens e a condição foi atendida no item 2, o break não permitirá que o for passe pelos itens 3 ao 10
for item in lista:
if condição:
Ação se condição é verdadeira
Break #Pausa o for e pula todas as demais iterações
Vamos para um exemplo simples. Imagine uma chamada virtual. Temos uma lista de pessoas e queremos saber se uma pessoa específica está presente ou não.
No exemplo abaixo é exatamente o que acontece. Perguntamos: “Alon está presente?” O primeiro diz, “Não, eu sou João!”, o segundo diz ”Não, eu sou o Lira!”, já o terceiro diz ”Sim, estou aqui!”. Não faz sentido perguntar ao Diego se ele é o Alon, visto que já sabemos que o Alon está lá. Ganhamos tempo! Essa pausa para o PYTHON se chama BREAK conforme colocamos o código.
pessoas_presentes = ['João', 'Lira', 'Alon', 'Diego', 'Sergio', 'Marcos']
#Quero saber se uma pessoa especifica está presente
chamada = 'Alon'
for pessoa in pessoas_presentes:
if pessoa == chamada:
print('{} está presente.'.format(chamada))
break
else:print('Só um print pra mostrar que o for passou por esta pessoa:'+str(pessoa))
____________________________
Só um print pra mostrar que o for passou por esta pessoa:João
Só um print pra mostrar que o for passou por esta pessoa:Lira
Alon está presente
Por outro lado temos uma situação inversa que usaremos o CONTINUE. Ele ao invés de pausar e sair do FOR, ele pausa e pula diretamente para a nova iteração do FOR.
for item in lista:
if condição:
Ação se condição é verdadeira
CONTINUE#Pausa o for e pula para a proxima interação
Ação que não será realizada
else:
condição se falso
Voltando para nosso exemplo vamos inserir um CONTINUE e ações de print abaixo dessa linha de código. Perceba que apesar de termos linhas de código abaixo do CONTINUE elas são ignoradas e não “printadas”. Já a linha acima do CONTINUE é executada normalmente.
pessoas_presentes = ['João', 'Lira', 'Alon', 'Diego', 'Sergio', 'Marcos']
#Quero saber se uma pessoa especifica está presente
chamada = 'Alon'
for pessoa in pessoas_presentes:
if pessoa == chamada:
print('{} está presente.'.format(chamada))
break
else:print('Só um print pra mostrar que o for passou por esta pessoa:'+str(pessoa))
continue
print('Só pra mostrar que isso não vai ser printado')
print('Isso também não')
print('Acho que deu pra entender, né?')
____________________________
Só um print pra mostrar que o for passou por esta pessoa:João
Só um print pra mostrar que o for passou por esta pessoa:Lira
Alon está presente
Nenhum comentário:
Postar um comentário