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 2 de 2 PrimeiroPrimeiro 12
  1. Avatar de fabraga
    Comigo começou a dar erro a partir de certo ponto:

    Código PHP:
    >>> smashing_pumpkins.items()
    dict_items([('Gish'1991), ('Mellon Collie'1995), ('Siamese Dream'1993)])
    >>> for 
    items in smashing_pumpkings.items():
        print(
    item)
        
    Traceback (most recent call last):
      
    File "<pyshell#29>"line 1in <module>
        for 
    items in smashing_pumpkings.items():
    NameErrorname 'smashing_pumpkings' is not defined
    >>> smashing_pumpkins = {'Gish':1991'Siamese Dream':1993'Mellon Collie':1995}
    >>> for 
    items in smashing_pumpkings.items():
        print(
    items)
        
    Traceback (most recent call last):
      
    File "<pyshell#33>"line 1in <module>
        for 
    items in smashing_pumpkings.items():
    NameErrorname 'smashing_pumpkings' is not defined
    >>> smashing_pumpkins = {'Gish':1991'Siamese Dream':1993'Mellon Collie':1995}
    >>> for 
    album,ano in smashing_pumpkings.items():
        print(
    "O album",album,"foi lançado em",ano)

        
    Traceback (most recent call last):
      
    File "<pyshell#37>"line 1in <module>
        for 
    album,ano in smashing_pumpkings.items():
    NameErrorname 'smashing_pumpkings' is not defined 
    Sei que é por causa da versão do Python (3.2) que eu uso, mas vc já saberia dizer quais mudanças eu deveria fazer para fazer esses códigos funcionarem e assim poder seguir em frente com as aulas antigas mesmo que são só as que tenho por enquanto? Obrigado!
  2. Avatar de Magnun
    Por algum motivo que desconheço a seguinte linha está dando erro
    >>> for album,ano in smashing_pumpkins.items():

    troque todas as ocorrências dessa linha pelas siguintes:
    >>> smash_albuns = smashing_pumpkins.items()
    >>> for album,ano in smash_albuns:

    dai segue normalmente.
    Até mais...
Página 2 de 2 PrimeiroPrimeiro 12

+ Enviar Comentário