quarta-feira, março 28, 2007

Xrange != Range

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

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.