[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
- Previous message: [Python-ideas] [Python-Dev] minmax() function returning (minimum, maximum) tuple of a sequence
- Next message: [Python-ideas] [Python-Dev] minmax() function returning (minimum, maximum) tuple of a sequence
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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
- Previous message: [Python-ideas] [Python-Dev] minmax() function returning (minimum, maximum) tuple of a sequence
- Next message: [Python-ideas] [Python-Dev] minmax() function returning (minimum, maximum) tuple of a sequence
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]