[pyar] Longitud de un iterador
Alejandro Santos
listas en alejolp.com
Jue Ene 13 18:36:46 ART 2011
2011/1/13 Anthony Lenton <antoniolenton en gmail.com>:
> 2011/1/13 Alejandro Santos <listas en alejolp.com>:
>> 2011/1/13 Anthony Lenton <antoniolenton en gmail.com>:
>>> Ahora, no hay algo así en la librería estandard, que lo resuelva lindo
>>> en 0 lineas de código?
>>> No digo el caso general, si no solo para cuando realmente sé lo que va
>>> a hacer el iterador, no le puedo decir "ah, de paso, tu longitud es
>>> tanto"?
>>>
>>
>>>>> list("hola").__iter__().__length_hint__()
>> 4
>>>>> iter("hola").__length_hint__()
>> 4
>>>>> iter((x for x in "hola")).__length_hint__()
>> Traceback (most recent call last):
>> File "<stdin>", line 1, in <module>
>> AttributeError: 'generator' object has no attribute '__length_hint__'
>>
>> Lo mas chico que pude es 1 linea de código, 0 se me complica.
>
> Muy bueno!
>
> Lástima que justo para los generadores no viene __length_hint__.
> Y, aún con __length_hint__() len() no funciona -- necesitaría poder
> llamar a len() para poder pasarlo a una función que espera una
> secuencia/bichoquetienelen. Leyendo un poco parece que
> __length_hint__ lo usan "algunos métodos internos para operar de
> manera más eficiente"[1], pero len() lo ignora por completo.
>
Tampoco está documentado, pero es mejor que nada. El problema con los
generadores es que es un caso demasiado específico para hacerlo andar
en Python.
En tu ejemplo:
>>> migenerador = (mifuncion(a) for a in range(10))
La longitud es diez, pero es un caso demasiado especial como para que
Python lo sepa. Una minima diferencia en el codigo hace que sea aun
mucho mas complejo:
>>> import random
>>> migenerador = (mifuncion(a) for a in range(random.randint(0, 100)))
Y ya no es tan fácil saber la longitud :(
--
Alejandro Santos
http://alejolp.com.ar
More information about the pyar
mailing list