试图计算类中现有对象的平均值

2024-09-28 01:34:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要帮助来计算每个员工的平均工资。
这是我目前的代码。你知道吗

class Associate:
    ID = 0;
    avgPay = 0.0

    def __init__(self, ID, name, pay):
        self.ID = ID
        self.name = name
        self.pay = pay
        Associate.ID += 1
        Associate.avgPay = (pay + Associate.avgPay)/Associate.ID

    def speak(self):
        print('Name: ', self.name,'Pay: ', self.pay )

a1 = Associate('A111','Emily',85000)
a1.speak()
print("ID = {0}, avgPay = {1}".format(Associate.ID,Associate.avgPay))
a2 = Associate('A222','Bob',88000)
a2.speak()
print("ID = {0}, avgPay = {1}".format(Associate.ID,Associate.avgPay))
a3 = Associate('A333','John',92000)
a3.speak()
print("ID = {0}, avgPay = {1}".format(Associate.ID,Associate.avgPay))
a4 = Associate('A444','Tom',77000)
a4.speak()
print("ID = {0}, avgPay = {1}".format(Associate.ID,Associate.avgPay))

我的问题是,每次调用Associate.avgPay时,它都会将上一次调用的平均值相加,而不是将self.pay相加。
电流输出:

Name: Emily Pay:  85000
ID = 1, avgPay = 85000.0
Name: Bob Pay:  88000
ID = 2, avgPay = 86500.0
Name: John Pay:  92000
ID = 3, avgPay = 59500.0
Name: Tom Pay:  77000
ID = 4, avgPay = 34125.0

正确输出:

Name: Emily Pay:  85000
ID = 1, avgPay = 85000.0
Name: Bob Pay:  88000
ID = 2, avgPay = 86500.0
Name: John Pay:  92000
ID = 3, avgPay = 88333.33333
Name: Tom Pay:  77000
ID = 4, avgPay = 85500.0

任何帮助都将不胜感激。你知道吗


Tags: nameselfidformatjohnpayassociatebob
3条回答

如果你在纸上写了两个以上对象的平均算法,你会发现你实际上并没有计算平均值。你知道吗

您需要一次对所有值求和,然后除以,而不是向已除以的值中添加新值,然后再除以。。。你知道吗

而且,重复代码的事实意味着无论如何都应该考虑使用列表。也不需要任何类属性

这里有这样一个例子

associates = [] 
associates.append(Associate('A111','Emily',85000))
associates.append(Associate('A222','Bob',88000)) 
associates.append(Associate('A333','John',92000)) 
associates.append(Associate('A444','Tom',77000)) 

pays = [a.pay for a in associates] 
avg = sum(pays)/len(pays) 
for id, a in enumerate(associates):
    a.speak()
    print("ID = {0}, avgPay = {1}".format(id, avg))

至少,平均计算似乎是错误的。 应该是

Associate.avgPay = (pay + Associate.avgPay * (Associate.ID-1))/Associate.ID

正如@cricket\u007所说,平均值不是这样的。你可以做的是跟踪列表中的所有付款,并用它来计算平均值:

class Associate:
    ID = 0;
    payList = []

    def __init__(self, ID, name, pay):
        self.ID = ID
        self.name = name
        self.pay = pay
        Associate.ID += 1
        Associate.payList.append(pay)
        Associate.avgPay = sum(Associate.payList) / len(Associate.payList)

相关问题 更多 >

    热门问题