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

Ron Adam rrr at ronadam.com
Fri Oct 15 19:13:54 CEST 2010


My apologies, I clicked "reply" instead of "reply list" last night.

After thinking about this a bit more, it isn't a matter of never needing to 
do it.  The min and max functions wouldn't be able to compare a series of 
lists as individual values without a keyword switch to choose the specific 
behavior for a single item.  ie... list of items  or an item that happens 
to be a list. The below examples would not be able to compare sequences 
correctly.

Ron



On 10/14/2010 09:14 PM, Guido van Rossum wrote:
> Why would you ever want to write min(1)? (Or min(x) where x is not iterable.)

Basically to allow easier duck typing without having to check weather x is 
an iterable.

This isn't a big deal or a must have.  It's just one solution to a problem 
presented here.  My own thoughts is that little tweaks like this may be 
helpful when using functions in indirect ways where it's nice not to have 
to do additional value, type, or attribute checking.


[Tal also says]
> As Guido mentioned, there is never a reason to do max(value) where
> value is not an iterable.

Well, you can always avoid doing it, but that doesn't mean it wouldn't be 
nice to have sometimes.  Take a look at the following three coroutines that 
do the same exact thing.  Which is easier to read and which would be 
considered the more Pythonic.


def xmin(*args, **kwds):
     # Allow min to work with a single non-iterable value.
     if len(args) == 1 and not hasattr(args[0], "__iter__"):
         return min(args, **kwds)
     else:
         return min(*args, **kwds)


# Accept values or chunks of values and keep a running minimum.

@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))

@consumer
def Running_Min(out_value=None):
     while 1:
         in_value = yield out_value
         if in_value is not None:
             if not hasattr(in_value, "__iter__"):
                 in_value = [in_value]
             if out_value is None:
                 out_value = min(in_value)
             else:
                 out_value = min(out_value, min(in_value))

@consumer
def Running_Min(out_value=None):
     while 1:
         in_value = yield out_value
         if in_value is not None:
             if not hasattr(in_value, "__iter__"):
                 if out_value is None:
                     out_value = in_value
                 else:
                     out_value = min(out_value, in_value)
             else:
                 if out_value is None:
                     out_value = min(in_value)
                 else:
                     out_value = min(out_value, min(in_value))




More information about the Python-ideas mailing list