Ver Feed RSS

root@blog:/# chmod o+r *

[Curso de Python] Entendendo o For

Avalie este Post de Blog

Antes de prosseguir leia os artigos anteriores aqui.



Olá pessoal! Hoje vamos entender mais um pouco da estrutura for. Vamos começar a ver como o for faz a sua mágica e reduz (muito) o trabalho do desenvolvedor!


Entendendo o For



Como já foi comentado no último post, o for parece estranho para quem está acostumado com linguagens como C/C++ e Java. Nessas linguagens, é necessário informar ao for um limite, para que ele saiba quando parar. No Python ele simplesmente sabe quando parar, como isso é feito?

O For funciona somente com objetos iteráveis, isto é, strings comuns, strings unicode, tuplas, listas, byte arrays, sets comuns, frozen sets, e dicionários. Alguns desses tipos ainda não foram abordados nesse curso por não terem um uso muito frequente.

Quando o for recebe um objeto iterável ele usa a função iter para criar um iterador. Um iterador funciona similar a um ponteiro indicando um objeto. Quando solicitamos a esse iterador o próximo objeto ele pula uma "casa" e retorna o próximo objeto. A baixo temos um exemplo dessa idéia:

Código:
>>> frase = "teste"
>>> ponteiro = iter(frase)
>>> type(ponteiro)
<type 'iterator'>
>>> ponteiro.next()
't'
>>> ponteiro.next()
'e'
>>> ponteiro.next()
's'
>>> ponteiro.next()
't'
>>> ponteiro.next()
'e'
>>> ponteiro.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>
Ao solicitarmos o próximo objeto, após o final do objeto iterável, recebemos o erro "StopIteration". Com esse erro o for sabe que deve parar a iteração.

Todos os objetos possuem o mesmo comportamento no for, com exceção do dicionário:
Código:
>>> for item in ('abc', 'cde', 'efg'):
...  print 'item='+item
...
item=abc
item=cde
item=efg
>>>
>>> for numero in [1, 2, 3]:
...  print 'numero:',numero
...
numero: 1
numero: 2
numero: 3
>>>
>>> for album in {'Gish':1991, 'Siamese Dream':1993, 'Mellon Collie':1995}:
...  print album
...
Gish
Mellon Collie
Siamese Dream
>>>
O for retorna somente as chaves de um dicionário, para obtermos o valor associado a aquela chave utilizamos 'slicing':
Código:
>>> smashing_pumpkins = {'Gish':1991, 'Siamese Dream':1993, 'Mellon Collie':1995}
>>> for album in smashing_pumpkins:
...  print 'O album',album,'foi lancado em',smashing_pumpkins[album]
...
O album Gish foi lancado em 1991
O album Mellon Collie foi lancado em 1995
O album Siamese Dream foi lancado em 1993
>>>
É possível também utilizar o método items, que cria uma lista de tuplas. Segue um exemplo para melhor entendimento:
Código:
>>> smashing_pumpkins.items()
[('Gish', 1991), ('Mellon Collie', 1995), ('Siamese Dream', 1993)]
>>>
Cada tuplas dentro da lista é um par chave/valor. Se utilizarmos isso dentro do for teremos um resultado bem diferente:
Código:
>>> smashing_pumpkins = {'Gish':1991, 'Siamese Dream':1993, 'Mellon Collie':1995
}
>>> for item in smashing_pumpkins.items():
...  print item
...
('Gish', 1991)
('Mellon Collie', 1995)
('Siamese Dream', 1993)
>>>
Agora o item a ser retornado passa a ser um tupla com a chave e o valor associado a ela. É possível utilizar o slicing para obter o nome do album e o ano de lançamento, mas existe também um abordagem mais organizada. Para uma melhor legibilidade do código, podemos fazer o 'unpack' (desempacotar) da tupla. O unpack pode ser feito conforme abaixo:
Código:
>>> smashing_pumpkins = {'Gish':1991, 'Siamese Dream':1993, 'Mellon Collie':1995
}
>>> for album,ano in smashing_pumpkins.items():
...  print 'O album',album,'foi lançado em',ano
...
O album Gish foi lançado em 1991
O album Mellon Collie foi lançado em 1995
O album Siamese Dream foi lançado em 1993
>>>
Dessa forma temos um código limpo, compacto e extremamente legível. Mesmo que ninguém saiba qual o conteúdo do dicionário smashing_pumpkins, ao ler o for, sabe que as chaves são os nomes dos albums e os valores são os anos de lançamento.

Atualizado 01-09-2010 em 09:52 por Magnun

Categorias
Python , Cursos , Curso de Python

Comentários

Página 1 de 3 123 ÚltimoÚltimo
  1. Avatar de lord4rk
    Muito bom o post!!!
    Como eu comecei com o python o for para mim é muito simples, mas nao sabia sobre a peculiaridade dos objetos iteráveis.


    []'s
    Jr
    Atualizado 11-02-2010 em 10:49 por lord4rk
  2. Avatar de Magnun
    E ai lord4rk!!

    Achei que tinha "abandonado o curso" . Obrigado por comentar e me indicar o erro, já corrigi.
    Fique ligado, tem mais por vir...
  3. Avatar de lord4rk
    Putz nem abandonei, e que estava numa maratona pro vestibular, ao menos passei!!!
  4. Avatar de Magnun
    Uhuuuul!! Novo universitário! parabéns e bem vindo de volta!
  5. Avatar de Jockerman
    Pretendo gerar todos os resultados possiveis da Quina, jogo de loteria.
    Para gerar resultados nao repetidos criei o seguinte codigo em C:

    Código:
    #include <stdio.h>
    #include <stdlib.h>
    
    main(){
    
    int x,y;
    
    for(x=1; x<=10;x++){
        for(y=x+1;y<=10;++y){
            printf("%d, %d\n", x,y);
        }
    }
    }
    Esse codigo gera resultados não repetidos em um jogo teorico com duas apostas de 0-10. Como implemento em Python usando o for?
Página 1 de 3 123 ÚltimoÚltimo

+ Enviar Comentário




Visite: BR-Linux ·  VivaOLinux ·  Dicas-L