[pyar] Duda: longitud de un iterable.

John Rowland Lenton john.lenton en canonical.com
Jue Sep 16 00:55:17 ART 2010


On Wed, Sep 15, 2010 at 08:12:11PM -0300, Roberto Alsina wrote:
> 
> Si tengo un iterable "data" (o sea, algo sobre lo que puedo correr un for) y 
> quiero averiguar su longitud, hago len(data)?

sí, y no. Hacé len(data); si funciona, entonces ya está; si no
funciona, es que el iterable no implementó __len__ y probablemente
tengas que desenrrollarlo todo para que labure.

Fijate por ejemplo que xrange() es un iterable que sabe su longitud. Y
que cualquiera puede darle una longitud a su iterable si es que es
calculable y finita (y menos costosa que desenrrollar el iterable, con
suerte :)

Un ejemplo, donde se ve bien que podés tener listas con len() barato y
con list() caro (que ya sabías, pero no me aguanté)

#!/usr/bin/python
import math

class P(object):
    def __init__(self, desde, n):
        assert desde > 2
        self.desde = desde
        self.n = n

    def __len__(self):
        return self.n

    def __iter__(self):
        P = []
        q = 3
        c = 0

        while 1:
            is_prime = True
            r = int(math.sqrt(q))+1
            for i in P:
                if i > r:
                    break
                if not q % i:
                    is_prime = False
                    break
            if is_prime:
                P.append(q)
                if q >= self.desde:
                    yield q
                    c += 1
                    if c == self.n:
                        return
            q += 2

if __name__ == '__main__':
    p = P(1<<20, 10)
    print len(p)
    l = list(p)
    print len(l)
    print l
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 490 bytes
Desc: Digital signature
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20100916/4206cd37/attachment.sig>


More information about the pyar mailing list