Enviar um café pro programador

Mostrando postagens com marcador Loopings. Mostrar todas as postagens
Mostrando postagens com marcador Loopings. Mostrar todas as postagens

Como Processar Arquivos com Laço FOR (looping)

Neste tutorial de Python, vamos aprender como processarcom arquivos usando laços e loopings, nos permitindo trabalhar com grandes quantidades de informação.

Se desejar viver de programação, acesse:
Curso de Python com certificado

Para estudar por este e outros tutoriais offline, veja:
Apostila Python Progressivo

Arquivos e Laço FOR

Até o momento, em nossa seção de Arquivos em Python, trabalhamos com pequenos arquivos de textos, geralmente de duas ou três linhas, até para simplificar e agilizar nossos tutoriais de explicações.

Porém, o normal é termos arquivos grandes, com centenas ou milhares de linhas.

Quando você se tornar um programador Python profissional, vai ter planilhas documentos de texto, PDF e outros tipos de listas (como de funcionários e alunos), de milhares e milhares de linhas.

Então, vamos te mostrar como trabalhar com um arquivo usando o laço FOR.

Primeiro, entre no seguinte link e copie toda a lista:

Salve em um arquivo de texto de nome linguagens.txt

Vamos criar um script que pergunta ao usuário quantos nomes de linguagens de programação ele deseja ver.

Primeiro, criamos um objeto do tipo FILE de nome arquivo, para abrir linguagens.txt
Vamos pegar todo o conteúdo de texto e colocar numa lista de nome linguas, através do método readlines()

Usamos a função len() para contar quantos elementos tem a lista linguas, cujo número de elementos é o número de linhas do arquivo de texto, logo, mostrando o total de linguagens de programação que tem no texto.

Perguntamos ao usuário quantas linguagens ele deseja ver o nome e armazenamos na variável inteira num.

Por fim, entramos no laço FOR.
Vamos percorrer um total de num elementos, onde imprimimos o número de vezes que o usuário escolheu, imprimindo os elementos da lista linguas (usamos o método rstrip() para retirar o caractere de quebra de linha '\n\).

Veja como ficou nosso código:

arquivo = open('linguagens.txt', 'r')
linguas = arquivo.readlines()

print("Existem", len(linguas), "linguagens. Quantas deseja ver?")
num = int(input())

for count in range(num):
    print(str(count+1),":",linguas[count].rstrip('\n'))
    
arquivo.close()

Detectando o final de um arquivo: End of file ''

Tem um probleminha no código anterior.
Experimente digitar 717.

Aguarde tooooda a lista de linguagens de programação ser printada em sua tela e...erro:

Arquivos e loopings - Tutorial de Python - Curso com certificado

Deu erro de list index out of range, ou seja, você tentou acessar um índice da lista que não existe.
A lista tem 716 linguagens/linhas, e você tentou acessar mais que isso.

Poderíamos evitar esse erro fazendo uma coisa bem simples: detectando o final do arquivo.
Agora, ao invés de criar uma lista, vamos imprimir linha por linha do arquivo, através do método readline(), que lê uma linha por vez e retorna essa string, e armazena na variável linha que criamos.

Vamos usar o mesmo laço FOR pra imprimir o número de linguagens que o usuário quis ver.
Ao final, quando chega no fim do arquivo, o método readline() retorna uma string vazia.

Uma string vazia é simboliza, simplesmente, por: ''

Ou seja, a cada iteração do loop verificamos o conteúdo de linha.
Se for diferente de string vazia, imprimimos mais uma linha.
Se for vazia, dizemos que chegou no fim do arquivo.

Nosso código Python ficou:

arquivo = open('linguagens.txt', 'r')
num = int(input("Numero de linguagens: "))

for linha in arquivo:
    linha = arquivo.readline()

    if linha != '':
        print(linha.rstrip('\n'))
    else:
        print("Fim do arquivo")
    
arquivo.close()

Lendo Arquivos com laço FOR

Os exemplos anteriores foram mais para você aprender como pensa um programador, entender como as coisas funcionam por trás dos panos e te ajudar em lógica, ou seja, de realmente entender o que tá fazendo e o que tá acontecendo quando seu código roda.


Porém, existe uma maneira ainda mais simples de ler um arquivo de texto, sem usar readlines() nem a readline(), simplesmente imprimindo direto da variável do tipo File, e também sem precisar detectar o final de um arquivo.

Sabe onde fizemos:
  • for variavel in range(valor): 

Em vez de range(), basta usar o objeto do tipo File mesmo.
O Python subtende que seu range vai ser as linhas do arquivo.

Fica:
  • for linha in arquivo:

Prontinho.
A cada iteração do loop For o valor de linha é uma linha do arquivo de texto arquivo, que definimos e abrimos anteriormente (com a open()).

Para exibir o número correto de linguagens que o usuário solicitou, vamos usar uma variável para fazer a contagem, a count. O IF imprime uma linha, já quando essa variável passa do valor digitado pelo usuário, cai no ELSE e ele dá um break no laço FOR, terminando a leitura do arquivo.

Veja como ficou nosso código Python:

arquivo = open('linguagens.txt', 'r')
num = int(input("Numero de linguagens: "))
count=0

for linha in arquivo:
    if count<num:
        print(linha.rstrip('\n'))
        count=count+1
    else:
        break

arquivo.close()

Loops Aninhados (Laço dentro de laço)

Neste tutorial de nosso Curso Completo de Python, vamos ensinar o que são loops aninhados (nested), ou seja, vamos colocar laços dentro de laços, ver como é isso, para que serve, como funciona e exemplos reais de uso.




Loops Aninhados

Já falamos aqui em nosso curso sobre Testes Condicionais IF e ELSE aninhados, inclusive demos alguns exemplos de uso.

Agora voltamos ao assunto, porém vamos usar WHILE e FOR dentro de outros WHILE e FOR, por um motivo bem direto: aninhamento é absurdamente importante e usado.




Quando você se tornar uma programador profissional (clique para saber como ganhar dinheiro programando em Python), vai usar muito isso, muito mesmo.

Se você já entendeu a lógica dos IF e ELSE aninhados, já sabe tranquilamente aninhar, em teoria, os laços.

Exemplo de loopings aninhados

O melhor exemplo de loop dentro de loop, é o nosso calendário/relógio.

O ano tem 12 meses.
Todo santo ano, começa em Janeiro, depois Fevereiro, Março...até Dezembro.
Depois conta-se tudo de novo, e de novo, e de novo...é um looping.

Porém, dentro de cada mês tem os dias do mês.
Começa no dia 1, dia 2, dia 3...até o último dia do mês (que varia).
Mas quando acaba, volta tudo de novo...looping.

E dentro do dia temos as horas!
00h...01h...02h...12h...23h...e depois repete, repete.

Dentro de cada hora?
Loop dos minutos.

Dentro de cada minuto?
Loop dos segundos.

Sim, vivemos em loops aninhados.
Vamos colocar isso em prática programando em Python ?

Criando um Tabuleiro

Faça um programa em Python que solicite um número positivo inteiro ao usuário, e depois exiba um tabuleiro na tela, com igual número de linhas e colunas.

Por exemplo, se ele digitar 3 deve aparecer na tela:
x  x  x
x  x  x
x  x  x

Se digitar 2:
x  x
x  x

Se digitar 4:
x  x  x  x
x  x  x  x
x  x  x  x
x  x  x  x

Solução:

Vamos criar um tabuleiro de tamanho N x N, onde esse N o usuário fornece e armazenamos na variável n.

Usaremos duas varáveis de controle: linha e coluna, ok?




O primeiro laço FOR vai ser responsável por percorrer as linhas.
Ele vai percorrer um intervalo de n linhas, ou seja: range(n)

Dentro de cada linha dessa, precisamos desenhar as colunas, onde cada coluna printamos um "". E quantas vezes isso é feito? n vezes.
Ou seja, vamos usar outro intervalo de valor n: range(n)

Vamos usar uma variação da função print, que não quebra a linha automaticamente. Para isso, basta adicionar o end='' na função print, pra definir que no fim dela não fala nada, não coloque nenhum caractere (por padrão ela coloca \n de quebra de linha).

Quando terminar de imprimir cada linha, o que fazemos?
Precisamos dar uma quebra de linha, para o tabuleiro ficar bonitinho, então usamos  print() (isso mesmo, sem nada dentro).

Veja como nosso código ficou:

print("Vamos criar um tabuleiro de tamanho:  N x N")
n=int(input("Valor de N: ") )

for linha in range(n):
    for coluna in range(n):
        print("x  ",end='')
    print()


Guarde esse código com carinho, vamos usar no futuro quando formos programar diversos jogos, como jogo da velha, batalha naval etc.

Exercício resolvido de Python

Crie um programa que exiba todos os segundos e minutos no intervalo de uma hora, no seguinte formato: XXmin YYs
Por exemplo:
12min59s

Vamos usar duas variáveis, a minuto e segundo.
Ambas vão de 0 até 59, ou seja, vamos usar o intervalo de 60: range(60)

O primeiro FOR é para os minutos.
Primeiro o minuto 0. Dentro dele vamos imprimir do 0s até 59s.
Depois o minuto 1. Dentro deles imprimimos de 0s até 59s.
...
Por fim, minuto 59.

O FOR que vai estar aninhado é o responsável por imprimir os segundos.
Veja como ficou o código do programa:


for minutos in range(60):
    for segundos in range(60):
        print(minutos,"min",segundos,"s")

Exercício Resolvido de Python

Faça o mesmo do exemplo acima, mas adicione as horas para ficar no formato: XXh YYmin ZZs
Aqui, basta notar que as horas vão de 0h até 23h: range(24)

for horas in range(24):
    for minutos in range(60):
        for segundos in range(60):
            print(horas,"h",minutos,"min",segundos,"s")

(se demorar muito, e vai demorar, dê um control+C que o shell do Python vai parar de rodar)

Exercício Resolvido de Laço Aninhado

Você foi contratado por uma escola para fazer o seguinte script em Python:
Primeiro, pergunta a quem vai usar o script quantos alunos tem na sala.
Depois, quantas matérias cada aluno estuda.

Em seguida o usuário vai preenchendo a nota de cada matéria, de cada aluno.
Seu programa deve fornecer a média de cada aluno e a média geral da turma.

Solução:

Vamos armazenar o número de alunos na variável alunos e o número de matérias em materias.

O primeiro laço é o que vai percorrer os alunos:
Aluno 1, depois aluno 2, o aluno 3...ou seja: range(alunos)

Depois, para cada aluno vamos dar as respectivas notas de cada matéria.
A cada nota que o usuário der, vamos somar ela na variável 'mediaAluno', e ao final basta dividirmos esse número pelo número de matérias e temos a média daquele aluno.
A cada iteração do primeiro FOR, antes de digitarmos as notas de cada matéria, devemos zerar essa variável!

Quando tivermos a 'mediaAluno', vamos somar esse valor na variável 'mediaTurma', e no final do programa dividimos essa variável pelo número de alunos, para ter a média geral da turma.

Veja como ficou o código final:


alunos=int(input("Quantos alunos tem na turma: ") )
materias=int(input("Quantas matérias eles estudam: ") )

mediaTurma=0
for aluno in range(alunos):
    print("Aluno",aluno+1,":")
    
    mediaAluno=0
    for materia in range(materias):
          print("Nota da materia",materia+1,":", end='')
          nota=int(input())
          mediaAluno += nota

    mediaAluno /= materias
    print("Media desse aluno:",mediaAluno,"\n")
    
    mediaTurma += mediaAluno

mediaTurma /= alunos
print("Media da turma:",mediaTurma)

Python na Mega-Sena

Faça um script em Python que exiba todos os possíveis palpites da Mega-Sena.
Dados:
  1. Cada palpite possui 6 dezenas
  2. As dezenas variam de 1 até 60
  3. Não pode repetir dezena