James Reynolds wrote:
Thank you! I think I have working in the right direction. I have one more
question related to this module.

I had to move everything to a single module, but what I would like to do is
have this class in a file by itself so I can call this from other modules.
when it was in separate modules it ran with all 0's in the output.

Here is the code in one module:

#import Statistics

class Statistics:
def __init__(self, *value_list):
self.value = value_list
self.square_list= []
 def mean(self, *value_list):
try :
ave = sum(self.value) / len(self.value)
except ZeroDivisionError:
ave = 0
return ave

def median(self, *value_list):
if len(self.value) <= 2:
n = self.mean(self.value)
elif len(self.value) % 2 == 1:
m = (len(self.value) - 1)/2
n = self.value[m+1]
else:
m = len(self.value) / 2
m = int(m)
n = (self.value[m-1] + self.value[m]) / 2
return n
 def variance(self, *value_list):
average = self.mean(*self.value)
for n in range(len(self.value)):
square = (self.value[n] - average)**2
self.square_list.append(square)
try:
var = sum(self.square_list) / len(self.square_list)
except ZeroDivisionError:
var = 0
return var

def stdev(self, *value_list):
var = self.variance(*self.value)
sdev = var**(1/2)
return sdev
 def zscore(self, x, *value_list):
average = self.mean(self.value)
sdev = self.stdev(self.value)
try:
z = (x - average) / sdev
except ZeroDivisionError:
z = 0
return z



a = [1,2,3,4,5,6,7,8,9,10]
stats = Statistics(*a)
mean = stats.mean(*a)
median = stats.median(*a)
var = stats.variance(*a)
stdev = stats.stdev(*a)
z = stats.zscore(5, *a)
print(mean, median, var, stdev, z)
print()



On Wed, Feb 24, 2010 at 7:33 PM, Alan Gauld <alan.ga...@btinternet.com>wrote:

"James Reynolds" <eire1...@gmail.com> wrote

 I understand, but if self.value is any number other then 0, then the "for"
will append to the square list, in which case square_list will always have
some len greater than 0 when "value" is greater than 0?

And if value does equal zero?

Actually I'm confused by value because you treat it as both an
integer and a collection in different places?


 Is this an occasion which is best suited for a try:, except statement? Or
should it, in general, but checked with "if's". Which is more expensive?

try/except is the Python way :-)


 def variance(self, *value_list):
  if self.value == 0:
       var = 0
  else:
        average = self.mean(*self.value)
        for n in range(len(self.value)):
             square = (self.value[n] - average)**2
             self.square_list.append(square)
   var = sum(self.square_list) / len(self.square_list)
   return var

--
Alan Gauld
Author of the Learn to Program web site
http://www.alan-g.me.uk/

The indentation in your code is lost when I look for it -- everything's butted up against the left margin except for a single space before def variance. This makes it very hard to follow, so I've ignored the thread till now. This may be caused by the mail digest logic, or it may because you're posting online, and don't tell it to leave the code portion unformatted. But either way, you should find a way to leave the code indented as Python would see it. If you're posting by mail, be sure and send it as text.

But a few things I notice in your code: You keep using the * notation on your formal parameters. That's what turns a list into a tuple. And you pass those lists into methods (like median()) which already have access to the data in the object, which is very confusing. If the caller actually passes something different there, he's going to be misled, since the argument is ignored.

Also, in method variance() you append to the self.square_list. So if it gets called more than once, the list will continue to grow. Since square_list is only referenced within the one method, why not just define it there, and remove it as a instance attribute?

If I were you, I'd remove the asterisk from both the __init__() method parameter, and from the caller in top-level code. You're building a list, and passing it. Why mess with turning it into multiple arguments, and then back to a tuple? Then I'd remove the spurious arguments to mean(), variance(), stdev() and zscore(). There are a few other things, but this should make it cleaner.

DaveA

_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to