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 2 12 Ú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?
  6. Avatar de Magnun
    Olá Jokerman,

    Sua dúvida é muito pertinente. O Próximo post que farei irá abordar estrutras for aninhadas e a fução range que é muito util. Nesse post vou usar seu exemplo exemplificar o uso da estrutura de for aninhado. Assim que eu postar aviso, ok?

    Até mais...
  7. Avatar de Magnun
    Jockerman,

    Acabei de postar a última parte da solução da sua dúvida: [Curso de Python] A fun
  8. Avatar de victoreng
    Eai Magnum blza?

    Bem que você falou, que este post ia dar uma luz no for, eu acabei tendo que parar no outro e nem tinha visto esse aqui, agora eu entendi o funcionamento do for. Mas me reponde uma coisa, acho que tem uns erros nas telas de código, abaixo tem uma delas

    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
    >>>


    Se você reparar na ordem das chaves no dicionário e na ordem do resultado, está diferente, como se tivesse corrido de trás para frente, acredito que foi erro no CTRL+C/CTRL+V...ehehhe

    Abraços
  9. Avatar de Magnun
    Olá victoreng,

    Que bom que ficou claro! Quanto à ordem dos itens no dicionário, isso não é culpa minha, é do Python mesmo! Eu até hoje não entendi (na verdade não tive curiosidade ao ponto de ir atrás do motivo) por que o Python "desordena" o dicionário... Um exemplo:

    Código Python:
    >>> smashing_pumpkins = {'Gish':1991, 'Siamese Dream':1993, 'Mellon Collie':1995}
    >>> print smashing_pumpkins
    {'Gish': 1991, 'Mellon Collie': 1995, 'Siamese Dream': 1993}
    >>> for item in smashing_pumpkins.items(): print item
    ...
    ('Gish', 1991)
    ('Mellon Collie', 1995)
    ('Siamese Dream', 1993)
    >>>

    Como você pode ver, criei o dicionário com as chaves na ordem: 'Gish', 'Siamese Dream', 'Mellon Collie'. Depois no print vc pode ver que o Python reorganizou o dicionário colocando o 'Siamese Dream' depois de 'Mellon Collie'. Todo mundo vai falar: "ah, é simples! ele ordena por ordem alfabética: g, m, s.". Se é isso, me expliquem por que isso acontece:
    Código Python:
    >>> d = {'a':1, 'b':2, 'c':3}
    >>> print d
    {'a': 1, 'c': 3, 'b': 2}
    >>>

    Como o 'c' foi para antes do 'b'?!?! Vou pesquisar isso, quando eu descobrir posto por aqui... Obrigado por fazer essa pergunta, eu devia ter ressaltado isso no texto! Foi falha minha.

    Até mais...
  10. Avatar de iigorconrado
    Olá, Magnun! Já tem alguma explicação pra essa alteração da ordem dos dicionários?
Página 1 de 2 12 ÚltimoÚltimo

+ Enviar Comentário