Python — перебирать множество объектов, извлекая из них данные для накопления итогов

#python #for-loop #oop #object

#python #для цикла #ооп #объект

Вопрос:

Я хотел бы повторить некоторое количество объектов, извлечь числа и подсчитать накопленный итог. Это то, что у меня есть:

 print ('Calculating Commmissions with objects')
class SalesReps:
    count = 0
    def __init__( self , name , sales , commission) :
        self.name = name
        self.sales = sales
        self.commission = commission
        SalesReps.count  = 1
    def name_performance_pay( self ) :
        return self.name
        return self.sales
        return self.commission
    
s1=SalesReps ('BAnderson', 15685.75, 1568.68)
s2=SalesReps ('GBates', 13856.80, 1385.68)
s3=SalesReps ('MBerger', 18560.44, 1437.04)
s4=SalesReps ('JCarter', 14375.86, 1437.59)
s5=SalesReps ('VChambers', 15963.45, 1596.35)
print('We have ', SalesReps.count, 'sales reps.n')

for rep in range(1, 5):
    print(s[rep].name, s[rep].sales, s[rep].comission, 'n')
    totalSales = totalSales   s[rep].sales
    totalCommissions = totalCommissions   s[rep].commision

print ('Our total sales were ', totalSales, 'and our total commissions paid was ', totalCommissions, '.n)
  

Это то, что я получаю:

 Traceback (most recent call last):
  File "/home/jrw/Documents/bp.py", line 23, in <module>
    print(s[rep].name, s[rep].sales, s[rep].comission, 'n')
NameError: name 's' is not
  

Есть ли в Python другое соглашение о подписке? Я этого не нашел.

Комментарии:

1. что такое s ?

2. s1 != s[rep] ..не то же самое. Я бы предложил поместить их в массив и выполнить цикл.

3. Добавьте свои SalesReps объекты в список, а затем выполните итерацию по этому списку

4. s = [s1,s2,s3,s4,s5] ?

Ответ №1:

Вы назвали пять несвязанных переменных ( s1 , s2 , s3 , …), вы не создали ни одной list именованной s , поэтому вы не можете указывать нижний индекс s (его нет s ). Измените код, который инициализирует s1 и company, чтобы создать одно list имя s , и это было бы намного ближе к работе:

 s = [SalesReps ('BAnderson', 15685.75, 1568.68),
     SalesReps ('GBates', 13856.80, 1385.68),
     SalesReps ('MBerger', 18560.44, 1437.04),
     SalesReps ('JCarter', 14375.86, 1437.59),
     SalesReps ('VChambers', 15963.45, 1596.35)]

for rep in range(len(s)):
  

сделал бы это, хотя это не было бы Pythonic ( for i in range(len(someseq)): в принципе, это всегда неправильный способ сделать это). Более питонический подход сделал бы цикл:

 for rep in s:
    print(rep.name, rep.sales, rep.commission, 'n')
    totalSales  = rep.sales
    totalCommissions  = rep.commission
  

прямое повторение содержимого списка, а не допустимых индексов с повторной индексацией.

Ответ №2:

Это модификация с помощью pythonic way.

  • Используйте len(s) вместо SalesReps.count .
  • Используйте sum вместо plus в операторе for.
 print ('Calculating Commmissions with objects')
class SalesReps:
    def __init__( self , name , sales , commission) :
        self.name = name
        self.sales = sales
        self.commission = commission
    def name_performance_pay( self ) :
        return self.name
        return self.sales
        return self.commission
    
s=[SalesReps ('BAnderson', 15685.75, 1568.68),
   SalesReps ('GBates', 13856.80, 1385.68),
   SalesReps ('MBerger', 18560.44, 1437.04),
   SalesReps ('JCarter', 14375.86, 1437.59),
   SalesReps ('VChambers', 15963.45, 1596.35)]
print('We have ', len(s), 'sales reps.n')

totalSales = sum(r.sales for r in s)
totalCommissions = sum(r.commission for r in s)
print ('Our total sales were ', totalSales, 'and our total commissions paid was ', totalCommissions, '.n')