Uma das primeiras coisas que a gente aprende quando começa a estudar Python é a função range(). So um simples resumo de como ela funciona:
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
quando colocamos só um argumento, a contagem começa do zero e vai até o numero dado menos um.
Mas também pode passar o numero inicial:
>>> range(5,10)
[5, 6, 7, 8, 9]
Existe um terceiro argumento, opcional:
>>> range(1,20,3)
[1, 4, 7, 10, 13, 16, 19]
nesse caso, o range ta de um a vinte, pulando de três em três.
Mas qual a diferença entre range e xrange. Aparentemente são a mesma coisa:
>>> for a in range(5):
... print a ,
...
0 1 2 3 4
>>> for a in xrange(5):
... print a ,
...
0 1 2 3 4
Mas eles têm uma diferença. O range gera uma lista, com cada um dos elementos pedidos, so que imagine um range com milhares de números, milhões....isso começaria a ficar lento. É ai que entra o xrange, que é uma classe embutida e cria menos elementos na memória, tornando-se mais rápido.
Mas tem outro detalhe.....o range gera uma lista, e o xrange, um objeto. Mas tudo em Python é objeto! Listas também....
Ai entra outra diferença:
>>> ran = range(10)
>>> dir(ran)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__str__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
se observarmos os métodos da lista gerada pelo range, podemos ver que realmente é uma lista como outra qualquer, tem métodos públicos e privados. Mas olha só:
>>> xran = xrange(10)
>>> dir(xran)
['__class__', '__delattr__', '__doc__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__iter__', '__len__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__str__']
o objeto gerado pelo xrange só possui métodos privados. O que nos impede de fazer muita coisa.
Mais uma prova de que 'xran' acima não é uma lista:
>>> xran
xrange(10)
Porém podemos acessar algum valor do objeto gerado, como se fosse uma lista ou uma tupla:
>>> xran[3]
3
Como isso é possivel? Bem...podemos ver entre os métodos privados o __getitem__, é ele que é chamado quando procuramos por um elemento dando seu indice entre colchetes.
Na verdade é o seguinte: o range gera uma lista. Xrange é uma classe embutida, logo cria um objeto, que apesar de parecer uma sequência, é diferente, e é o mais aconselhável quando precisarmos gerar uma sequência muuito grande, onde o range se tornaria lento.
Espero ter esclarecido um pouco. Qualquer dúvida ou principalmente complementações e erros, vocês podem e devem comentar! :)
Fonte: livro Beginning Python, Ed. Wrox
quarta-feira, março 28, 2007
Assinar:
Postar comentários (Atom)
Um comentário:
tou a fazer um programa e preciso de um range que me conte os numeros num determinado intervalo de 100 em 100.
tenho range(0, a, 100), e isto dentro de uma condiçao, ou seja, se o numero 'a' q eu escolher nao estiver dentro do intervalo (por exemplo 2008), ele devia-me enviar o 'a' para a operaçao referente ao else. mas nao, ele em vez de me contar só os numeros de 100 em 100, pega neles todos... como poderei fazer isto?
cumprimentos*
Postar um comentário