[pyar] Longitud de un iterador
Ernesto Savoretti
esavoretti en gmail.com
Jue Ene 13 20:29:40 ART 2011
El día 13 de enero de 2011 19:43, Anthony Lenton
<antoniolenton en gmail.com> escribió:
> 2011/1/13 Alejandro Santos <listas en alejolp.com>:
>> 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 :(
>
> Sí, True, tiene que ser algo explícito donde le avises vos la longitud
> si querés, no tiene sentido que lo adivine solo. Tenía ganas de que
> hubiera algo ya hecho para justo este caso en itertools, o en
> antigravity o por ahí...
>
>
> --
> Anthony Lenton
Bueno, todos lamentamos eso. Hay un antecedente en la lista (con flame y todo):
Fijate en el archivo: "PEPs? (Era: Buscar en lista..."
En aquel caso es tema era si el iterador "estaba vacío o no", en este
caso es "cuántos elementos contiene". Obviamente, los 2 temas están
muy emparentados.
Me parece que hace falta una segunda (tercera) vueltita. Tal vez se
pueda hacer algo, es un desafío interesante (como probar los fuegos
artificiales sin consumirlos)
Saludos.
--
Ernesto Savoretti
More information about the pyar
mailing list