[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