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

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(default_max=None):
>>     max_value = default_max
>>     while 1:
>>         value = max(yield max_value)
>>         if max_value is None or value>  max_value:
>>             max_value = 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 "<stdin>", line 1, in <module>
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