enumerate is very useful and now "progresserate"

Francis Avila francisgavila at yahoo.com
Thu Nov 20 00:41:26 CET 2003

Brian Kelley wrote in message
<3fbbbffd$0$577$b45e6eb0 at senator-bedfellow.mit.edu>...
>It also inspired me to write "progresserate" which returns the percent
>completed of the list and the current value.

>This is useful for updating progress bars and the like.  I use it all
>the time, it sure saves code duplication.
>Is this idea something that is useful enough for inclusion in the
>standard library?  (Not this code as-is, I don't show error checking for
>brevity's sake)

It's very neat (I always seem to want to turn every problem into a generator
problem :).  But actually, in this case (unless that error checking code you
mention forbids it), you don't need a class.  The only methods you define
are for the generator protocol, and none of them have arguments.  So a
generator function is enough (and undoubtably faster):

def progresserate(seq):
    size = float(len(seq))
    iterator = iter(seq)
    i = 0
    #what did self.last do?
    while True: #StopIteration from iterator will propagate.
        value = iterator.next()
        i += 1
        percent = int(i/size * 100)
        yield percent, value

>One stylistic question, I tend to use
>def __iter__(self): return self
>when writing these styles of iterators.  It kind of bugs me, is there a
>better alternative?

Could you be more specific?  What bugs you about it?

If it's the 'self' you mean, then know that that corresponds exactly to the
behavior of iterators currently: if you request an iterator from an
iterator, it returns itself (what else would it return?).  If you want a
*copy* of an iterator,  you have to wait until PEP 323.
Francis Avila

More information about the Python-list mailing list