On Jan 26, 2005, at 03:17, Terry Carroll wrote:
My goal here is not efficiency of the code, but efficiency in my Python thinking; so I'll be thinking, for example, "ah, this should be a list comprehension" instead of a knee-jerk reaction to use a for loop.
Comments?
The point of the code is to take a sequence of objects, each object
representing an amount of water with a given mass and temperature, and to
return another object that represents all the water ideally combined. The
formulae for the combined mass and temp are respectively:
combined mass = M1 + M2 + M3 (duh) combined temp = ((M1*T1) + (M2*T2) + (M3*T3)) / (M1 + M2 + M3)
Here's my code: -------------------- class Water: def __init__(self, WaterMass, WaterTemperature): self.mass = WaterMass self.temperature = WaterTemperature def __repr__(self): return ("%.2f, %.2f" % (self.mass, self.temperature))
def CombineWater(WaterList): totalmass=0 numerator = 0; denominator = 0 for WaterObject in WaterList: totalmass += WaterObject.mass numerator += WaterObject.mass * WaterObject.temperature return Water(totalmass, numerator/totalmass)
Well, you can do this with list comprehensions, yeah:
totalmass = sum([WaterObject.mass for WaterObject in WaterList])
totaltemp = sum([WaterObject.mass * WaterObject.temp for WaterObject in WaterList]) / totalmass
return Water(totalmass, totaltemp)
Doesn't seem that much more Pythonic to me. I find it about as readable as your code, but someone who isn't used to list comprehensions will find that weird-looking. However, someone who uses functional programming languages a lot (Lisp, Scheme, Haskell, ML...) will be familiar with that.
The actual pros of that method is that it's a functional approach and that it has less lines than your approach (you can even reduce it to a one-liner by adding a third list comprehension, but at that point it starts to look ugly).
As for the cons, as I said, it may seem less readable than the original version to the non-experienced; and chances are it's slower than the original version since it has to iterate through 4 lists instead of 2.
In any case, when in doubt, do what you think will be easier to maintain.
-- Max
maxnoel_fr at yahoo dot fr -- ICQ #85274019
"Look at you hacker... A pathetic creature of meat and bone, panting and sweating as you run through my corridors... How can you challenge a perfect, immortal machine?"
_______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor