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