[Python-ideas] [Python-Dev] minmax() function returning (minimum, maximum) tuple of a sequence (original) (raw)

Ron Adam rrr at ronadam.com
Fri Oct 15 04:09:06 CEST 2010


On 10/13/2010 07:13 PM, Tal Einat wrote:

On Thu, Oct 14, 2010 at 1:14 AM, Nick Coghlan wrote:

Why use feed() rather than the existing generator send() API?

def runningmax(defaultmax=None): maxvalue = defaultmax while 1: value = max(yield maxvalue) if maxvalue is None or value> maxvalue: maxvalue = value I tried using generators for this and it came out very clumsy. For one thing, using generators for this requires first calling next() once to run the generator up to the first yield, which makes the user-facing API very confusing. Generators also have to yield a value at every iteration, which is unnecessary here. Finally, the feedMultiple optimization is impossible with a generator-based implementation.

Something I noticed about the min and max functions is that they treat values and iterable slightly different.

This works

min(1, 2) 1 min([1, 2]) 1

The gotcha

min([1]) 1 min(1) Traceback (most recent call last): File "", line 1, in TypeError: 'int' object is not iterable

So you need a function like the following to make it handle single values and single iterables the same.

def xmin(value): try: return min(value) except TypeError: return min([value])

Then you can do...

@consumer def Running_Min(out_value=None): while 1: in_value = yield out_value if in_value is not None: if out_value is None: out_value = xmin(in_value) else: out_value = xmin(out_value, xmin(in_value))

Or for your class...

def xmax(value): try: return max(value) except TypeError: return max([value])

class RunningMax(RunningCalc): def init(self): self.max_value = None

 def feed(self, value):
     if value is not None:
         if self.max_value is None:
             self.max_value = xmax(value)
         else:
             self.max_value = xmax(self.max_value, xmax(value))

Now if they could handle None a bit better we might be able to get rid of the None checks too. ;-)

Cheers, Ron



More information about the Python-ideas mailing list