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
sexta-feira, março 16, 2007
De volta do Bossa Conference
Estive no Bossa Conference, em Porto de Galinhas - PE, essa semana. Pra quem não foi, perdeu muita coisa boa.
O congresso foi totalmente voltado pra tecnologia móvel e multimídia, e teve muita coisa interessante. É difícil dizer qual foi a melhor palestra. A plataforma Maemo foi muito citada, assim como Python.
Na maioria dos casos era difícl escolher em qual sala entrar, infelizmente nao assisti as de PyGTK e Hildon, preferi o workshop de PyS60.
É impressionante a facilidade de fazer aplicações pra os smartphones da linha S60 da Nokia, basta instalar o interpretador python no aparelho, escrever o script em python normal(.py) e passar para o celular. Foram criadas algumas bibliotecas específicas, de SMS, camera, etc. E a versão utilizada é o Python 2.2.2. Pretendo começar a fazer alguns programinhas utlizando PyS60, o unico problema que eu achei é que não existe um SDK para Linux, so pra Windows, e como estou usando Fedora e Ubuntu no momento, é preciso rodar o emulador pelo Wine.
Breve eu estarei dando uma introdução da instalção do SDK, e alguns aplicativos simples.
Ainda teve palestras sobre o PyPy, Gstreamer, Canola......muita coisa boa, valeu a pena.
Só tenho duas críticas a fazer: não gostei do fato de não receber nenhum certificado, e achei que o Hotel não é bem preparado para receber esse tipo de evento, as salas são realmente imprenssadas.
Mas acredito que o mais importante nesses eventos e ter a oportunidade de trocas idéias com os convidados, é difícil unir tanta gente boa, e o melhor é que foi a duas horas e meia da minha casa :)
Presença garantida num próximo...espero que aconteça breve.
O congresso foi totalmente voltado pra tecnologia móvel e multimídia, e teve muita coisa interessante. É difícil dizer qual foi a melhor palestra. A plataforma Maemo foi muito citada, assim como Python.
Na maioria dos casos era difícl escolher em qual sala entrar, infelizmente nao assisti as de PyGTK e Hildon, preferi o workshop de PyS60.
É impressionante a facilidade de fazer aplicações pra os smartphones da linha S60 da Nokia, basta instalar o interpretador python no aparelho, escrever o script em python normal(.py) e passar para o celular. Foram criadas algumas bibliotecas específicas, de SMS, camera, etc. E a versão utilizada é o Python 2.2.2. Pretendo começar a fazer alguns programinhas utlizando PyS60, o unico problema que eu achei é que não existe um SDK para Linux, so pra Windows, e como estou usando Fedora e Ubuntu no momento, é preciso rodar o emulador pelo Wine.
Breve eu estarei dando uma introdução da instalção do SDK, e alguns aplicativos simples.
Ainda teve palestras sobre o PyPy, Gstreamer, Canola......muita coisa boa, valeu a pena.
Só tenho duas críticas a fazer: não gostei do fato de não receber nenhum certificado, e achei que o Hotel não é bem preparado para receber esse tipo de evento, as salas são realmente imprenssadas.
Mas acredito que o mais importante nesses eventos e ter a oportunidade de trocas idéias com os convidados, é difícil unir tanta gente boa, e o melhor é que foi a duas horas e meia da minha casa :)
Presença garantida num próximo...espero que aconteça breve.
Assinar:
Postagens (Atom)