zip y generadores

Pau Cervera Badia cervera en ffn.ub.es
Vie Feb 16 13:12:15 CET 2007


Estoy de acuerdo contigo (Chema); la documentación no es suficiente. Por 
eso creo que esta lista es muy útil, es una buena fuente de idioms y 
experiencia.

Si no es abusar mucho de la lista, para resolver el problema estuve 
jugando un poco más.

Veo que no puedo sobrecargar el next de un file. Quería hacer algo como,

def new_next(iter):
    def next():
        try:
            return iter.next(), iter.next()
        except StopIteration, e:
            raise e
    return next

y llamarlo como

def frames(fitxer, nparticules):
    f = open(fitxer)
    f.next()
    f.next = new_next(f)  # <-- se para aquí: AttributeError: 'file' 
object attribute 'next' is read-only

    for frame_info, line in f:
        yield frame_info, frame[:nparticules] # frame ~ line

con lo que tuve que hacer lo siguiente:

def two_lines(iter):
    class _Nou:
        def __iter__(self):
            return self
        def next(self):
            try:
                return iter.next(), iter.next()
            except StopIteration, e:
                raise e
    return _Nou()

y al final llamarlo como

def frames(fitxer, nparticules):
    f = open(fitxer)
    f.next()
    f = two_lines(f)

    for frame_info, line in f:
        yield frame_info, frame[:nparticules] # frame ~ line

que me parece bastante elegante.

Bueno, para resolver el problema inicial, tal vez lo más sencillo sea, 
simplemente:

def frames_d(fitxer, nparticules):
    f = open(fitxer)

    # quito la primera
    f.next()
    frame_info = ""
    try:
        while 1:
            frame_info = f.next()
            line = f.next()
            yield frame_info, frame[:nparticules] # frame ~ line
    except StopIteration:
        pass

Gracias a todos por vuestras respuestas!!!

P.D: Mi intención principal no fue nunca destrozar el castellano, aunque 
puede haber sido un side effect que se me escapó de las manos. ;-)


Chema Cortes wrote:
> El 16/02/07, Gabriel Genellina <gagsl-py en yahoo.com.ar> escribió:
>> En Thu, 15 Feb 2007 18:59:22 -0300, Chema Cortes <py en ch3m4.org> 
>> escribió:
>>
>> > El Jueves, 15 de Febrero de 2007 Pau Cervera Badia escribió:
>>
>> >>     for frame_info, posicions in frames(fitxer, sys_info.sys_size):
>> >>         title = "frame: %s t = %s" % tuple(frame_info.split())
>> >>         g("set title '%s'" % title)
>> >>         g.plot(Gnuplot.Data(posicions))
>> >
>> > Aquí, lo único decirte que .split ya devuelve una "secuencia", y 
>> que no
>> > hace
>> > falta la conversión explícita a tupla:
>> >
>> > title = "frame: %s t = %s" % frame_info.split()
>>
>> En realidad el codigo original es correcto, porque % solo desempaca
>> múltiples argumentos desde una tupla, no de una lista:
>>
>> py> "%s %s" % "a b".split()
>> Traceback (most recent call last):
>>    File "<stdin>", line 1, in ?
>> TypeError: not enough arguments for format string
>> py> "%s %s" % tuple("a b".split())
>> 'a b'
>
> Tienes toda la razón. Menos mal que hay quién está al quite.
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org
> http://listas.aditel.org/listinfo/python-es
>
>

-- 
Pau Cervera i Badia (e-mail cervera en ffn.ub.es)
{
   Departament de Física Fonamental               Martí i Franqués, 1
   Universitat de Barcelona                 Planta 3, despatx 346 bis
                                                      08028 Barcelona
   tel: +34 934 921 155                                         Spain

   "Simple things should be simple, complex things should be possible."
                                                            -- Alan Kay
   return http://www.ffn.ub.es/%7Ecervera/
}




Más información sobre la lista de distribución Python-es